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

        Intent intent = new Intent();intent.setClass(this, AsecondActivity.class);startActivity(intent);
Log 打印如下:


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


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

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

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

(2)修改启动代码:
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);

多添加了一行
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
在修改 Mnaifest 中AsecondActivity 配置多添加一行
android:taskAffinity="com.xjp"

看Log打印:

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


分析:

由此看出,代码里设置

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
和配置文件中设置
android:launchMode="singleTask"
的效果是一样的。 但是请注意,这里要两个条件满足才 会让两个activity 不在同一个Task 中。必须 加上 属性
android:taskAffinity="com.xjp"
有些人会奇怪,一般Manifest 配置文件中 很少看见 这个属性,这个属性的意思 是 “task 空间”=== “任务空间” 是的,当你没有设置的时候也是系统默认给设置 成为 当前应用的包名。我们这里设置 的和包名不一样。所以两个activity 的任务空间是不一样的,所以两个 activity 不在同一个 Task 中。 当然了,只是设置了
android:taskAffinity="com.xjp"
没有设置
android:launchMode="singleTask"
或者
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
两个 activity 也是在同一个任务空间的。亲测。


总结:当设置了

android:launchMode="singleTask"
时,系统会查找 对应的
taskAffinity
任务空间是否 有启动过 这个activity ,如果没有启动,则在这个taskAffinity 任务空间启动,如果有启动过,则 将 这个activity 推送到栈顶, 那么在这个activity 之上的activity 都被推送出栈了,不在任务Task 中,也就是 Ondestroy 了。


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

看Log 打印:

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


写的很乱,只是为了便于自己 理解。要想弄明白 还需自己去测试。


四:代码设置启动模式解析如下:

1.Intent.FLAG_ACTIVITY_REORDER_TO_FRONT: Activity启动栈顺序如下 A->B->C->D; 现在 从D启动 B, 结果顺序如下:A->C->D->B;规律就是不改变原来栈的顺序,如果跳转到目标Activity的时候带有 此标志,且目标Activity已经存在于栈中,这就是这种栈顺序。

2.Intent.FLAG_ACTIVITY_CLEAR_TOP:Activity启动栈顺序如下 A->B->C->D; 现在 从D启动 B,结果顺序如下:A->B;此时栈只剩下两个Activity,跳转到目标Activity之上的Activity自动弹出栈,所以当前栈只剩下两个Activity,值得注意的是,跳转到目标Activity 会先自动销魂然后重新执行onCreate->onStart..........。

3.Intent.FLAG_ACTIVITY_SINGLE_TOP:和android:launchMode="singleTop"是一样的意思。

4.Intent.FLAG_ACTIVITY_CLEAR_TASK需要和Intent.FLAG_ACTIVITY_NEW_TASK一起使用,Activity启动栈顺序如下 A->B->C->D; 现在 从D启动 B,结果栈中只有一个Activity B了,因为清除了当前栈中的所有activity,重新创建只有一个Activity B的栈。


更多相关文章

  1. Android启动续-------SystemSever启动
  2. activity的xml详解
  3. 开机自启动3
  4. Android(安卓)7.1.2(Android(安卓)N) Android系统启动流程
  5. Android——实现两个控件水平居中
  6. Android(安卓)Handler机制13之AsyncTask源码解析
  7. Android异步处理系列文章四篇之四 AsyncTask的实现原理
  8. Android(安卓)核心分析 之八------Android(安卓)启动过程详解
  9. Android(安卓)JobIntentService

随机推荐

  1. Android(安卓)静默更新apk
  2. android恶意程序分析 (四)
  3. Android消息机制不完全解析(下)
  4. android 存储联系人(save contact) 总结
  5. 整理出15个Android很有用的代码片段
  6. Android(安卓)中数据库查询方法query()中
  7. Android消息推送机制调研
  8. 关于Android中的radioGroup选择
  9. Android通过tcpdump抓包(wifi, 2g, 3g都
  10. android.database.CursorIndexOutOfBound