解决FLAG_ACTIVITY_REORDER_TO_FRONT方式启动Activity,按返回键会出现卡死(ANR)的问题

FLAG_ACTIVITY_REORDER_TO_FRONT的作用是:

如果栈中已经存在某Activity,启动该Activity而不重新创建实例,只是将该Activity移到栈顶并显示,则可以这样start:

    Intent intent = new Intent(this, target.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    startActivity(intent);

问题场景:

有Activity A 和 Activity B。

A和B都是以FLAG_ACTIVITY_REORDER_TO_FRONT方式启动的。现在,在B中启动A,那么当前栈顶是A,A的下面是B。在A中监听返回键,点击返回键则finish掉当前Activity A。然后问题来了,在某些机型或者某些系统版本中,点击返回键会出现ANR,直接卡死,最后程序闪退。

这是Android系统window focus的bug,解决方法是重写FLAG_ACTIVITY_REORDER_TO_FRONT的目标Activity的onNewIntent方法,代码如下:

    @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        if ((intent.getFlags() | Intent.FLAG_ACTIVITY_REORDER_TO_FRONT) > 0) {
            if (android.os.Build.VERSION.SDK_INT >= 19 && !isTaskRoot()) {
                ActivityManager tasksManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
                tasksManager.moveTaskToFront(getTaskId(), ActivityManager.MOVE_TASK_NO_USER_ACTION);
            }
        }
    }

在本例中,A和B Activity都按照上文重写了onNewIntent方法,最后问题解决,按返回键可以愉快地执行关闭Activity的操作了。

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值