版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
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的操作了。