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

最近编辑于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的生命周期结束了?)

 

### 如何解决 Cisco Packet Tracer 强制退出问题 当遇到 Cisco Packet Tracer 强制退出的情况时,可以采取多种措施来解决问题并确保软件稳定运行。 #### 1. 更新至最新版本 确保使用的是最新的 Cisco Packet Tracer 版本。开发团队会定期发布更新以修复已知错误和提升性能。通过官方网站下载安装包,并按照提示完成升级过程[^2]。 #### 2. 清理临时文件与重置配置 有时残留的数据可能导致程序不稳定。关闭所有打开的应用窗口后,在操作系统中查找并删除 Cisco Packet Tracer 的缓存目录以及用户偏好设置文件夹下的相关内容。这一步骤有助于清除可能引起冲突的历史记录或损坏项[^4]。 #### 3. 安装必要的依赖库 对于某些特定的操作系统环境而言,缺少相应的支持组件也可能引发崩溃现象。查阅官方文档确认是否需要额外安装如 .NET Framework 或 Visual C++ Redistributable 等前置条件,并依照指示操作。 #### 4. 调整图形驱动器兼容模式 如果是在虚拟机内或是较老式的显卡上运行,则建议尝试调整显示适配器属性里的渲染方式选项;或者降低模拟场景复杂度(减少设备数量),以此减轻GPU负担从而避免异常终止事件的发生。 #### 5. 使用管理员权限启动应用 右键点击快捷方式选择“以管理员身份运行”,给予应用程序更高的访问级别可以帮助绕过潜在的安全策略限制所带来的影响。 ```bash sudo packettracer # 对于Linux发行版来说可能是这种方式 ``` #### 6. 卸载重装彻底排查 最后的选择就是完全卸载现有实例后再重新部署新副本。务必记得提前备份个人项目以免丢失重要资料。此法能有效排除因初次安装不当所遗留下来的问题根源所在。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值