您的位置:首页 > 其它

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

2016-06-27 22:54 495 查看

这是一个小区广播问题引发的对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变化

修改前



修改后

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: