设置Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED对Activity Stack的影响

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/immrwk/article/details/51772024

这是一个小区广播问题引发的对Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED的思考

现把该问题的解决过程和分析记录如下:

一、问题描述-删除未读广播消息后,进入短信-menu小区广播还会弹出广播提示框

预制条件 手机有一条未读广播消息

测试步骤:

1.进入设置-更多-小区广播 删除此条消息

2.进入短信-Menu-小区广播

预期结果:不会弹出广播消息框

实际结果:弹出了广播消息框

二、问题原因分析:

       按照测试流程,在收到一条消息后,不点确定,直接点击home键退出,此时显示消息的activity并没有关闭,只是推到了后台。之后在setting中删除消息。此时也不会对显示 消息的activity产生影响,这个activity仍然存在。之后通过MMS的设置打开cell broadcast时,是通过startactivity()方法打开的,此时给intent设置了flag为0x10200000,导致将之前显示消息的activity被重新从Activity Stack中调取出来,而不是打开消息列表界面,所以我们看到的是之前被推到后台的Activity,Activity中有未读消息提示框。

三、修改方案

       将MMS应用中的H我BaseActivity类中的沟通CellBroadcast()方法中的cellBroadcaseIntent.setFlag(0x10200000);删掉,即startActivity()不设置flag参数0x10200000。gotoCellBroadCast()完整方法如下,

public static void gotoCellBroadCast(Context activity){
    Intent cellBroadcastIntent = new Intent(Intent.ACTION_MAIN);
    cellBroadcastIntent.setComponent(new ComponentName("com.android.cellbroadcastreceiver","com.android.cellbroadcastreceiver.ui.CellBroadcastActivity"));
    cellBroadcastIntent.setFlags(0x10200000);
    try {
        activity.startActivity(cellBroadcastIntent);
    }catch (ActivityNotFoundException ignored){
        Log.e(TAG,"ActivityNotFoundException for CellBroadcastActivity");
    }catch (SecurityException e){
        Log.e(TAG,"SecurityException for CellBroadcastActivity");
    }
}

四、0x10200000数值解释

0x10200000表示属性为Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,其中Intent.FLAG_ACTIVITY_NEW_TASK和Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED是定义在Intent.java中的常量

public static final int FLAG_ACTIVITY_NEW_TASK = 0x10000000;
public static final int FLAG_ACTIVITY_RESET_TASK_IF_NEEDED = 0x00200000;

FLAG_ACTIVITY_NEW_TASK 和FLAG_ACTIVITY_RESET_TASK_IF_NEEDED 的谷歌官方解释

来源:

https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NEW_TASK

   https://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_RESET_TASK_IF_NEEDED





FLAG_ACTIVITY_NEW_TASK

        设置此状态,记住以下原则,首先会查找是否存在和被启动的Activity具有相同的亲和性的任务栈,如果有,刚直接把这个栈整体移动到前台,并保持栈中的状态不变,即栈中的activity顺序不变,如果没有,则新建一个栈来存放被启动的activity

FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

       如果设置该属性,这个activity将在一个新的task中启动或者或者被带到一个已经存在的task的顶部,这时这个activity将会作为这个task的首个页面加载。将会导致与这个应用具有相同亲和力的task处于一个合适的状态(移动activity到这个task或者从中移出),或者简单的重置这个task到它的初始状态

设置0x10200000的作用

如果目标程序已经启动过,但是隐藏了,设置0x10200000之后,及时之前打开了,现在打开的话就直接跳到之前打开的页面

五、修改前后Activity Stack变化

修改前




修改后



猜你喜欢

转载自blog.csdn.net/immrwk/article/details/51772024