[mobilesafe] 03_提示更新版本,根据用户选择,进入主界面,或者从服务器下载更新,自动安装

Android 4.0

提示更新版本,根据用户选择,进入主界面,或者从服务器下载更新,自动安装

2、提示用户是否更新,并进入主界面
a)如果版本一致,loadHomeUi(),进入主界面,2秒钟延迟,操作
b)如果版本不一致,弹出对话框,提示用户更新showUpdateDialog()
// 比对当前客户端的版本号和服务器的版本号是否一致.
if (getAppVersion().equals(updateInfo.getVersion())) {// 没有新版本
    Log.i(TAG"版本一致。直接登录");
    loadHomeUi();// 加载主界面
else {// 有新版本
    Log.i(TAG"有新版本,提示用户下载");
    showUpdateDialog();// 弹出对话框,提示用户更新
}
加载HomeActivity-从一个Activity跳转到另外一个Activity中去
/**
 * TODO SplashActivity 3、加载主界面HomeActivity
 */
private void loadHomeUi() {
    Intent intent = new Intent(getApplicationContext(), HomeActivity.class);
    startActivity(intent);
    finish();// 销毁当前的Activity,防止加载到HomeActivity后,再按后退,SplashActivity还在界面上,用户体验差。
}
3、应用程序的自动升级安装
a)如果版本不一致,弹出对话框,提示用户更新showUpdateDialog()
b)如果用户点击"下次再说",不做操作,直接loadHomeUi()进入主界面
c)如果用户点击"立即下载",那么使用afinal框架到服务器上去下载最新apk。使用Afinal框架下载,
权限:android.permission.WRITE_EXTERNAL_STORAGE
d)下载完毕后,然后自动安装,利用系统的PackageInstaller安装,installApk()
新版本升级提醒,从服务器下载新版本
      /**
     * TODO SplashActivity 4、弹出对话框,提示用户更新新版本
     */
    private void showUpdateDialog() {
        // AlertDialog.Builder builder = new Builder(getApplicationContext());//FIXME 2、不能用getApplicationContext()
        AlertDialog.Builder builder = new Builder(this);
        builder.setTitle("是否更新新版本?");// 1、提醒标题
        builder.setMessage(updateInfo.getDescription());// 2、新版本的描述
        builder.setPositiveButton("升级"new OnClickListener() {// 3、升级按钮
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.i(TAG"正在升级:"+updateInfo.getUrlPath());
                // TODO SplashActivity 升级操作:从服务器上下载最新版本的apk
                FinalHttp finalHttp = new FinalHttp();
                //3-1先判断外部设备状态
                String externalStorageState = Environment.getExternalStorageState();
                final File file = new File(Environment.getExternalStorageDirectory(), "temp.apk");
                if (Environment.MEDIA_MOUNTED.equals(externalStorageState)) {//3-2为MEDIA_MOUNTED挂载状态
                    finalHttp.download(updateInfo.getUrlPath(), file.getAbsolutePath(), new AjaxCallBack<File>() {
                        
                        //3-2-1 下载过程中。。。
                        @Override
                        public void onLoading(long count, long current) {//count总共,current当前
                            Log.i(TAG"正在下载中。。。"null);
                            super.onLoading(count, current);
                            int progress = (int) (current * 100 / count);
                            tv_splash_downStatus.setText("下载进度:"+progress+"%");
//                            super.onLoading(count, current);
                        }
                        //3-2-2 下载完毕
                        @Override
                        public void onSuccess(File t) {
                            Log.i(TAG"下载完毕,开始安装。。。"null);
                            super.onSuccess(t);
                            installApk(file);//下载完毕后,自动安装apk
                        }
                        
                    });
                }else {//3-3 sdcard状态不为mounted状态
                    Toast.makeText(getApplicationContext(), "sdcard不可用。。。", Toast.LENGTH_SHORT).show();
                    loadHomeUi();//进入主界面
                }
            }
        });
        builder.setNegativeButton("下次再说"new OnClickListener() {// 4、下次再说按钮
            
            @Override
            public void onClick(DialogInterface dialog, int which) {
                Log.i(TAG"这次不升级,下次再升级");
                loadHomeUi();//选择下次再说,那么加载主界面HomeActivity
            }
        });
        // 5、create()对话框并show()出来
        /*AlertDialog alertDialog = builder.create();
        alertDialog.show();*/
        builder.show();
    }
安装apk-利用系统的PackageInstaller安装 
    /**
     * TODO SplashActivity 5、从File安装指定的apk(使用系统的PackageInstaller安装)
     * @param t
     */
    @SuppressLint("InlinedApi")
    private void installApk(File t) {
         /*<intent-filter>
             <action android:name="android.intent.action.VIEW" />
             <action android:name="android.intent.action.INSTALL_PACKAGE" />
             <category android:name="android.intent.category.DEFAULT" />
             <data android:scheme="file" />
             <data android:mimeType="application/vnd.android.package-archive" />
         </intent-filter>*/
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_INSTALL_PACKAGE);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.setDataAndType(Uri.fromFile(t), "application/vnd.android.package-archive");
        startActivity(intent);
    }