由强制更新引发的退出应用问题

    //连续按两次才退出应用
    @Override
    public void onBackPressed() {
        if (exit) {
            //回到桌面
            Intent intent = new Intent(Intent.ACTION_MAIN);
            intent.addCategory(Intent.CATEGORY_HOME);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(intent);
        } else {
            CommonUtils.showToast(context,"再按一次退出应用", Toast.LENGTH_LONG);
            exit = true;
            new Handler().postDelayed(new Runnable() {
                @Override
                public void run() {
                    exit = false;
                }
            }, 2 * 1000);
        }
    }

其中exit为这个类的全局变量。

说到强制更新,我首先想到的是使用dialog,使其不能消失,除非他点击下载安装了新版本。

setCanceledOnTouchOutside(false):点击区域外dialog不消失,

setCancelable(false):点击物理返回按钮dialog不消失。

但需求是点击物理返回键两次,也要退出应用。

这里就需要注意了,因为dialog在最上层,所以下方的activity是可见而不可操作的,所以是不会经过onBackPressed()和onKeyDown()方法的。但是我们可以监听dialog的事件(dialog也是context),dialog.setOnKeyListener()。

                                    new AlertDialogWrapper.Builder(context)
                                            .setTitle("有新版本发布!")
                                            .setMessage("是否下载最新版安装包?")
                                            .setPositiveButton("立即体验", new DialogInterface.OnClickListener() {
                                                @Override
                                                public void onClick(DialogInterface dialog, int i) {
                                                    //下载操作
                                                    ......
                                                }
                                            })
                                            .setNegativeButton("退出应用", new DialogInterface.OnClickListener() {
                                                @Override
                                                public void onClick(DialogInterface dialog, int i) {
                                                    //回到桌面
                                                    Intent intent = new Intent(Intent.ACTION_MAIN);
                                                    intent.addCategory(Intent.CATEGORY_HOME);
                                                    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                                    context.startActivity(intent);
                                                }
                                            })
                                            .setCancelable(false)
                                            .setOnKeyListener(new DialogInterface.OnKeyListener() {
                                                @Override
                                                public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
                                                    if (keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_UP) {
                                                        if (exit) {
                                                            dialog.dismiss();
                                                            //回到桌面
                                                            Intent intent = new Intent(Intent.ACTION_MAIN);
                                                            intent.addCategory(Intent.CATEGORY_HOME);
                                                            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                                                            context.startActivity(intent);
                                                            return true;
                                                        } else {
                                                            CommonUtils.showToast(context,"再按一次退出应用",Toast.LENGTH_LONG);
                                                            exit = true;
                                                            new Handler().postDelayed(new Runnable() {
                                                                @Override
                                                                public void run() {
                                                                    exit = false;
                                                                }
                                                            }, 2 * 1000);
                                                            return false;
                                                        }
                                                    } else {
                                                        return false;
                                                    }
                                                }
                                            })
                                            .show();

这里注意是
keyCode==KeyEvent.KEYCODE_BACK && event.getAction()==KeyEvent.ACTION_UP

这里我引用了关于dialog的第三方的框架

    compile 'com.github.afollestad.material-dialogs:core:0.8.5.8'

可能还需要注意的在检查更新的页面的onRestart()方法中再次检查是否有新版本。因为,退出应用后再次打开这个应用(直接到了这个页面)时dialog已经消失了(dialog不可见时其生命周期也消失了)。

最后,还有问题,当我点击“立即体验”时dialog会消失,也就是我如果只下载(甚至不下载,断网)不安装也能使用应用,并达不到强制新版本的作用。(因为我开启了新的context(即使是service),所以dialog的生命周期结束了?)


猜你喜欢

转载自blog.csdn.net/tz_1qu212/article/details/78857846