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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/zengd0/article/details/79810783

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的操作了。

猜你喜欢

转载自blog.csdn.net/zengd0/article/details/79810783