看了不少Android 方面的书籍,每每会介绍Activity也都会介绍launchMode,但是会把Intent.Flag和Activity分开讲,但是我觉得两者是必然联系而且是密不可分的关于task 栈的管理,看到launchMode和Intent.Flag这些你会不会有疑问这两个的区别是什么?希望这篇文章和示例能够解答你的问题。
一言回答上面的问题,launchMode是规定你自己的Activity启动的行为模式,而Intent.Flag是你期望由你启动的其他的Activity是什么样的行为模式。
一个例子,从桌面启动launchMode为SigleTask的应用A通过StartActivity()启动了launchMode为star大人的的B,而B需要网络配置,于是通过StartActivity启动了wifi设置(这里不使用Activity C, 是为了给您更直观的认识,C的行为怎样更合理),这时候的task栈是什么样的呢?如图1,你配置的网络连接成功了然后点home键,再从桌面点击A,栈如图2,再通过StartActivity启动B,如图3,你会发现并不希望的的wifi设置界面在最上面!!!
那怎样才能让再启动B后不显示wifi setting呢?我们需要在B启动wifi setting时加入Flag (Intent.FLAG_ACTIVITY_NEW_TASK);并使用startActivity启动wifi setting。那按照上面的步奏再进行操作就会如下图
如上图所示,wifisetting并没有在ActivityB的上面,对于这个现象可参看下面的link博主的文章 内容“操作2: 在Launcher中单击"TaskOne应用"图标, Activity A启动开僻Task堆栈, 命名为TaskA(TaskA堆栈状态: A),”
换句话说wifi setting由于Intent.FLAG_ACTIVITY_NEW_TASK,在新的task栈中,并不合Activity B在同一个栈中。
- 其他关于Activity的资料
Activity思维导图:http://www.mcjiffy.cn/331.html
Android developer上关于task的翻译(不全):http://blog.csdn.net/benweizhu/article/details/7614189
这篇文章:《task与Activity详解》说的很清楚,就是描述有些复杂。
http://blog.csdn.net/mayingcai1987/article/details/6200909
另请参看
http://www.cnblogs.com/xiaoQLu/archive/2012/07/17/2595294.html
- 调试方法:
对于栈的变化,推荐使用Ecslipse中用hierarchyviewer,使用方法请参见:
http://blog.csdn.net/xyz_lmn/article/details/14222975
或者使用dumpsys查看 activity 栈的状态: adb shell dumpsys activity