设置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变化
修改前
修改后
相关文章推荐
- mysql 主从配置,实现读写分离
- Gesture 通过手势实现翻书效果
- 进程和线程的区别
- java.lang.IllegalStateException:Web app root system property already set to different value 错误原因及解决 Log4j
- 无缝轮播图
- 关闭TV的效果
- Mysql 主从复制(AB复制)
- What are the advantages of semi-supervised learning over supervised and unsupervised learning?
- java基础篇(七)super关键字
- eclipse.ini相关配置
- ubuntu 11.10 安装apache2 tomcat6
- JavaScript强化教程——AJAX
- Unbound classpath container: 'JRE System Library [jdk17060]' in project ***
- GitHub上README.md教程
- DNS 原理入门
- 如何创建PostgreSQL数据库
- Ubantu系统下安装android studio的简单步骤
- Ubuntu 14.04 编译安装 Tengine + PHP5.6
- vmware tool实现centos共享window文件
- App后台学习笔记