一.AndroidActivity 四种启动模式 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. Android(安卓)Studio 解决Fetching android sdk component infor
  2. Android(安卓)Binder原理(四)ServiceManager的启动过程
  3. android Theme启动APP闪屏处理
  4. android Theme启动APP闪屏处理
  5. 从零开始学android-一行两个按钮居中 布局
  6. Android层次结构
  7. Android(安卓)Wear开发者预览配置过程
  8. Android系统启动流程
  9. Android启动流程篇总结

随机推荐

  1. android 自定义View 对话框
  2. Android Http通信(使用 标准Java接口)及
  3. 联系人存储ContactsProvider表分析
  4. android中Json数据保存方式
  5. android xml属性的单位大全
  6. Android 开发之JNI学习笔记
  7. Android为HttpClient设置证书(用户名和密
  8. Android开发学习笔记整理(16)-网络请求
  9. [Android] ListView 结合SimpleAdapter使
  10. Android Spinner不显示下拉箭头解决方案