Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。
原文: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。
Android Activity 的四种启动模式 lunchMode 和 Intent.setFlags();singleTask的两种启动方式。的更多相关文章
- Activity的启动模式全解standard,singleTop,singleTask,singleInstance
在android中控制Activity的启动模式的属性主要控制两大功能: 1,控制activity 进入哪一个任务task 中, 有两种可能,进入启动task中,进入指定taskAffinity的 ...
- 关于Activity启动模式(launchMode)和intent设置测试后 发现和网上说的不符 是不是我错了 求解
看了很多关于Activity启动模式(launchMode)和intent设置intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);发现网上说的和我测试结果 ...
- Doctype的作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义?
Doctype作用?严格模式与混合模式,如何触发者这两种模式,区分它们有何意义? 1.1 Doctype作用 <!DOCTYPE>声明叫做文件类型定义(DTD),声明的作用为了告诉浏览器该 ...
- springboot项目启动成功后执行一段代码的两种方式
springboot项目启动成功后执行一段代码的两种方式 实现ApplicationRunner接口 package com.lnjecit.lifecycle; import org.springf ...
- Android Activity的四种LaunchMode!!!
本文转自: http://marshal.easymorse.com/archives/2950. 写的非常好,分享给大家!!! 在多Activity开发中,有可能是自己应用之间的Activity跳转 ...
- Android Activity的四种经典传值方法
文/ http://blog.csdn.net/sk719887916/article/details/41723613 skay 开发中遇到多个activity的传值问题 相邻两个之间的传值 或者 ...
- Android 之Activity启动模式(二)之 Intent的Flag属性
首页博客链接关于我留言板 前面介绍了通过launchMode设置Activity的启动模式.本章接着介绍Activity的启动模式相关内容,讲解的内容是Intent与启动模式相关的Flag,以及and ...
- Android Activity的加载的模式
---恢复内容开始--- 本文来自http://www.cnblogs.com/lwbqqyumidi/p/3771542.html launchMode在多个Activity跳转的过程中扮演着重要的 ...
- Android中Intent传递对象的两种方法(Serializable,Parcelable)
今天要给大家讲一下Android中 Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是 Bundle.putP ...
随机推荐
- vim highlight whitespace at end of line and auto delete them
install Vundle.vim mkdir ~/.vim/bundle git clone https://github.com/gmarik/Vundle.vim.git ~/.vim/bun ...
- 05-0. 求序列前N项和(15)
本题要求编写程序,计算序列 2/1+3/2+5/3+8/5+... 的前N项之和.注意该序列从第2项起,每一项的分子是前一项分子与分母的和,分母是前一项的分子. 输入格式: 输入在一行中给出一个正整数 ...
- JQuery DataTables Editor---只修改页面内容
近来在工作中需要对JQuery DataTables进行增,删,改的操作,在网上找了一些资料,感觉比较的好的就是(http://editor.datatables.net/)文章中所展示的操作方法(如 ...
- Javascript 之内置对象
JS提供了11种引用类型:Object.Array.Date.Function.Error.RegExp.Math.Number.String.Boolean.Globle.其中包括了三种基本包装类型 ...
- MySQL----基本数据类型
1.数值型: tinyint:1字节 smallint:2字节 mediumint:3字节 int:4字节 bigint:8字节 float:4字节 double:8字节 decimal(m,c):m ...
- Oracle EBS-SQL (PO-10):检查过期采购未接收订单.sql
Select pha.segment1 采购订单, MSI.SEGMENT1 物料编码, MSI.DESC ...
- 2014第11周四Eclipse开发问题记
今天开发中eclipse工具使用上又学到几点: 1.去除代码空行:在Find输入框中输入:^\s*\n然后替换为空即可: 2.eclipse插件的加载:对于单一个jar文件的插件,直接放在plugin ...
- web本地存储-UserData
userData,IE中持久化用户数据的方法. 使用userData用户数据首先必须使用css指定userData行为.代码示例: var ud = document.createElement(&q ...
- Centos6.5 telnet wireshark
yum -y install telnet-server telnet vim /etc/xinted.d/telnet disable = no vim /etc/pam.d/remote #aut ...
- Android Notivation的使用
官方帮助文档:http://wear.techbrood.com/guide/topics/ui/notifiers/notifications.html 博文推荐:http://blog.csdn. ...