Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();
2016-02-27 15:51
302 查看
一.Android Activity 四种启动模式 lunchMode 在Manifest 配置文件中的属性如下:
(1) android:launchMode="standard"
(2)android:launchMode="singleTop"
(3)android:launchMode="singleTask"
(4)android:launchMode="singleInstance"
二.说明:
Android 中Activity 生命周期 跟Task 的关系,就是进栈出栈。
很多时候我们在Manifest的Activiy 配置信息中没有看到lunchMode 属性,其实没有配置这个属性就是系统默认属性 android:launchMode="standard"。同一个工程AppA在这种模式下有AfirstActivity
启动 AsecondActivity,启动代码是:
?
Log 打印如下:
![](http://www.2cto.com/uploadfile/Collfiles/20141031/20141031090145102.jpg)
两个TaskId 都是98.说明两个 activity 是在同一个 任务栈 Task 中。
接下来我们让这两个Activity 不在同一个Task 中。有两种方法实现:
(1)不修改启动代码,只修改 Mnaifest 中 给AsecondActivity 配置多添加 两行代码如下:
?
(2)修改启动代码:
?
多添加了一行
?
在修改 Mnaifest 中AsecondActivity 配置多添加一行
?
看Log打印:
![](http://www.2cto.com/uploadfile/Collfiles/20141031/20141031090145103.jpg)
AfirstActivity taskId = 8 而 AsecondActivity TaskId = 9.所以两个 activity 不是在同一个任务栈 Task 中。虽然两个activity 是在同一个工程下面。
分析:
由此看出,代码里设置
?
和配置文件中设置
?
的效果是一样的。 但是请注意,这里要两个条件满足才 会让两个activity 不在同一个Task 中。必须 加上 属性
?
有些人会奇怪,一般Manifest 配置文件中 很少看见 这个属性,这个属性的意思 是 “task 空间”=== “任务空间” 是的,当你没有设置的时候也是系统默认给设置 成为 当前应用的包名。我们这里设置 的和包名不一样。所以两个activity 的任务空间是不一样的,所以两个 activity 不在同一个 Task 中。 当然了,只是设置了
?
没有设置
?
或者
?
两个 activity 也是在同一个任务空间的。亲测。
总结:当设置了
?
时,系统会查找 对应的
?
任务空间是否 有启动过 这个activity ,如果没有启动,则在这个taskAffinity 任务空间启动,如果有启动过,则 将 这个activity 推送到栈顶, 那么在这个activity 之上的activity 都被推送出栈了,不在任务Task 中,也就是 Ondestroy 了。
三.当 配置文件中设置了 android:launchMode="singleInstance"。不管 activity 怎么启动,都是在一个新的Task 任务中启动activity。
看Log 打印:
![](http://www.2cto.com/uploadfile/Collfiles/20141031/20141031090145104.jpg)
两个TaskId 不一样。并且 被启动的activity 唯一存在 新的任务队列中,也就是这个task 队列中只能有 一个activity。
(1) android:launchMode="standard"
(2)android:launchMode="singleTop"
(3)android:launchMode="singleTask"
(4)android:launchMode="singleInstance"
二.说明:
Android 中Activity 生命周期 跟Task 的关系,就是进栈出栈。
很多时候我们在Manifest的Activiy 配置信息中没有看到lunchMode 属性,其实没有配置这个属性就是系统默认属性 android:launchMode="standard"。同一个工程AppA在这种模式下有AfirstActivity
启动 AsecondActivity,启动代码是:
?
![](http://www.2cto.com/uploadfile/Collfiles/20141031/20141031090145102.jpg)
两个TaskId 都是98.说明两个 activity 是在同一个 任务栈 Task 中。
接下来我们让这两个Activity 不在同一个Task 中。有两种方法实现:
(1)不修改启动代码,只修改 Mnaifest 中 给AsecondActivity 配置多添加 两行代码如下:
?
?
?
?
![](http://www.2cto.com/uploadfile/Collfiles/20141031/20141031090145103.jpg)
AfirstActivity taskId = 8 而 AsecondActivity TaskId = 9.所以两个 activity 不是在同一个任务栈 Task 中。虽然两个activity 是在同一个工程下面。
分析:
由此看出,代码里设置
?
?
?
?
?
?
总结:当设置了
?
?
三.当 配置文件中设置了 android:launchMode="singleInstance"。不管 activity 怎么启动,都是在一个新的Task 任务中启动activity。
看Log 打印:
![](http://www.2cto.com/uploadfile/Collfiles/20141031/20141031090145104.jpg)
两个TaskId 不一样。并且 被启动的activity 唯一存在 新的任务队列中,也就是这个task 队列中只能有 一个activity。
相关文章推荐
- android meta-data的使用以及含义
- android 【九种对话框】的实现方式
- 【Android动画】之Tween动画 (渐变、缩放、位移、旋转)
- PDF阅读器系列之--MuPDF源码分析过程(二)
- Android高手进阶:Adapter深入理解与优化
- Android Binder机制(超级详尽)
- android 仿nice实现在图片上打标签
- Android Fragment 生命周期图
- 学习android service记录
- Android数据通信——JSON&Gson(Android studio)
- Android View 事件体系1
- H5为主的Hybrid App技术方案的设想及设计-Android
- Android Studio 9 patch 编译错误
- android、IOS和手机基础知识
- Android_为什么要继承onMeasure()
- android 性能优化-电量篇
- BUG记录之Android开发
- android的 root权限
- ubuntu下安装AndroidStudio
- Android即时通讯--仿QQ即时聊天:(四)好友列表的处理