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

最近编辑于2018年6月29日
    //连续按两次才退出应用
    @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);
        }
    }   //连续按两次才退出应用
    @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的生命周期结束了?)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值