原文:Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。

Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();

一.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,启动代码是:

 
1
2
3
4
5
                Intent intent = new Intent();
         
        intent.setClass(this, AsecondActivity.class);
         
        startActivity(intent);

Log 打印如下:

两个TaskId 都是98.说明两个 activity 是在同一个 任务栈 Task 中。

接下来我们让这两个Activity 不在同一个Task 中。有两种方法实现:

(1)不修改启动代码,只修改 Mnaifest 中 给AsecondActivity 配置多添加 两行代码如下:

 
1
2
android:launchMode="singleTask"
android:taskAffinity="com.xjp"

(2)修改启动代码:

 
1
2
3
4
5
6
7
8
Intent intent = new Intent();
        // ComponentName name = new
        // ComponentName("com.example.appa","com.example.appa.AsecondActivity");
        // intent.setComponent(name);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setClass(this, AsecondActivity.class);
         
        startActivity(intent);

多添加了一行

 
1
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

在修改 Mnaifest 中AsecondActivity 配置多添加一行

 
1
android:taskAffinity="com.xjp"

看Log打印:

AfirstActivity taskId = 8 而 AsecondActivity TaskId = 9.所以两个 activity 不是在同一个任务栈 Task 中。虽然两个activity 是在同一个工程下面。

分析:

由此看出,代码里设置

 
1
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

和配置文件中设置

 
1
android:launchMode="singleTask"

的效果是一样的。 但是请注意,这里要两个条件满足才 会让两个activity 不在同一个Task 中。必须 加上 属性

 
1
android:taskAffinity="com.xjp"

有些人会奇怪,一般Manifest 配置文件中 很少看见 这个属性,这个属性的意思 是 “task 空间”=== “任务空间”
是的,当你没有设置的时候也是系统默认给设置 成为 当前应用的包名。我们这里设置 的和包名不一样。所以两个activity
的任务空间是不一样的,所以两个 activity 不在同一个 Task 中。 当然了,只是设置了

 
1
android:taskAffinity="com.xjp"

没有设置

 
1
android:launchMode="singleTask"

或者

 
1
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

两个 activity 也是在同一个任务空间的。亲测。

总结:当设置了

 
1
android:launchMode="singleTask"

时,系统会查找 对应的

 
1
taskAffinity

任务空间是否 有启动过 这个activity ,如果没有启动,则在这个taskAffinity 任务空间启动,如果有启动过,则 将
这个activity 推送到栈顶, 那么在这个activity 之上的activity 都被推送出栈了,不在任务Task 中,也就是
Ondestroy 了。

三.当 配置文件中设置了 android:launchMode="singleInstance"。不管 activity 怎么启动,都是在一个新的Task 任务中启动activity。

看Log 打印:

两个TaskId 不一样。并且 被启动的activity 唯一存在 新的任务队列中,也就是这个task 队列中只能有 一个activity。

最新文章

  1. jquery.mobiscroll仿Iphone ActionSheet省市区联动
  2. Windows10系统如何更改程序的默认安装目录?
  3. 自制Unity小游戏TankHero-2D(4)关卡+小地图图标+碰撞条件分析
  4. POJ 1321
  5. 【ASP.NET MVC 5】第27章 Web API与单页应用程序
  6. 增强型for循环,用于遍历数组元素
  7. Spring RESTFul Client – RestTemplate Example--转载
  8. android飞机游戏敌机移动路径
  9. makefile--Unfound symbol
  10. Power Designer导出实体类和NHibernate xml文件
  11. input[type=number]问题
  12. SpringMVC简版教程、部分功能
  13. Brackets 前端编辑器试用
  14. FFmpeg命令行工具学习(四):FFmpeg 采集设备
  15. 论文阅读笔记三十二:YOLOv3: An Incremental Improvement
  16. HDU 2289 Cup【二分】
  17. 输入框UITextField禁止输入空格方法
  18. 理解express中的中间件
  19. angularjs 动态表单, 原生事件中调用angular方法
  20. Pycharm中.py文件头信息配置

热门文章

  1. php将unicode编码转为utf-8方法
  2. Java之线程的生命周期
  3. 05-0. 求序列前N项和(15)
  4. 如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
  5. ListFragment和ListActivity的setOnItemClickListener不起作用
  6. linux svn服务器普通passwd和sasl2配置
  7. LCP Array(思维)
  8. 我的RTOS 之六 -- Touch移植(s5pv210+threadx+ucgui+touch)
  9. Haffman算法(C++)
  10. 一个很好的用C#导出数据到Excel模板的方法