Android项目实战:手机安全卫士开发案例解析
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.1.1 Splash界面的UI开发

在activity_splash.xml中实现Splash界面的UI展示。Splash界面的效果是:将图片logo2复制到drawable下作为界面的背景图片,在界面的右上角展示当前应用的版本号信息,在界面的中央显示一个 ProgressBar。另外该界面在屏幕上显示时无标题栏且全屏显示(这里是在SplashActivity中实现该设置的,当然也可以在清单文件中配置)。效果图如图1-5所示。

图1-5

图1-5对应的activity_splash.xml的UI界面代码如下:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SplashActivity"
    android:id="@+id/rl_splash"
    android:background="@drawable/logo2" >
    <TextView
        android:id="@+id/tv_splash_version"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:text="版本号:"
        android:textColor="#0aff00"
        android:textSize="20sp" />
    <ProgressBar
        android:layout_centerHorizontal="true"
        android:layout_alignParentBottom="true"
        android:layout_marginBottom="110dip"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

图1-5对应的SplashActivity业务代码如下:

package com.guoshisp.mobilesafe;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class SplashActivity extends Activity {
    private TextView tv_splash_version;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          //设置为无标题栏
           requestWindowFeature(Window.FEATURE_NO_TITLE);
          //设置为全屏模式
           getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                      WindowManager.LayoutParams.FLAG_FULLSCREEN);
          setContentView(R.layout.activity_splash);
                  tv_splash_version = (TextView) findViewById(R.id.tv_splash_
                                        version);
          tv_splash_version.setText("版本号:" + getVersion());
    }
    /**
      * 获取当前应用程序的版本号
       *
      * @return
      */
    private String getVersion() {
    //得到系统的包管理器,已经得到了apk的面向对象的包装
        PackageManager pm = this.getPackageManager();
        try {
    //参数一:当前应用程序的包名;参数二:可选的附加消息,这里用不到,可以定义为0
            PackageInfo info = pm.getPackageInfo(getPackageName(), 0);
            //返回当前应用程序的版本号
              return info.versionName;
        } catch (Exception e) {//包名未找到异常,理论上,该异常不可能会发生
                e.printStackTrace();
              return "";
        }
    }
}

代码解析:

通过调用getVersion()方法来获取应用程序的版本号信息。版本号存在于我们的apk对应的清单文件中(直接解压 apk 后,即可看到对应的清单文件),版本号是 manifest 节点中的android:versionName="1.0"。当一个应用程序被装到手机后,该apk被复制到手机的data/app目录下(也就是系统中),如图1-6所示。所以想得到版本号,就需要先得到与系统相关的服务(这里我们通过上、下文得到PackageManager系统服务),通过服务就可以得到apk中的信息。

图1-6