Android activity launchMode与Intent.Flag关系

本文探讨了Android中Activity的launchMode和Intent.Flag如何共同决定任务栈的管理。launchMode定义了Activity自身的启动行为,而Intent.Flag影响被启动Activity的行为。通过示例说明了当BActivity启动WiFi设置时,如何通过设置Intent.FLAG_ACTIVITY_NEW_TASK避免WiFi设置界面出现在栈顶。同时推荐了几篇关于Activity、任务栈管理和调试方法的资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         看了不少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




评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值