本文截取了网络资源的结论部分 对singletask 启动模式做笔记记录。

尽管SubActivity的launchMode被设置为"singleTask"模式,可是它并不像官方文档描写叙述的一样:The system creates a new task and instantiates the activity at the root of the new task。而是在跟它有同样taskAffinity的任务中启动。而且位于这个任务的堆栈顶端,于是。前面那个图中,就会出现一个带着"singleTask"标签的箭头指向一个任务堆栈顶端的Activity Y了。

那么,我们有没有办法让一个"singleTask"的Activity在新的任务中启动呢?答案是肯定的。从上面的代码分析中,仅仅要我们可以进入函数startActivityUncheckedLocked的这个if语句中:

  1. if (r.resultTo == null && !addingToTask
  2. && (launchFlags&Intent.FLAG_ACTIVITY_NEW_TASK) != 0) {
  3. // todo: should do better management of integers.
  4. mService.mCurTask++;
  5. if (mService.mCurTask <= 0) {
  6. mService.mCurTask = 1;
  7. }
  8. r.task = new TaskRecord(mService.mCurTask, r.info, intent,
  9. (r.info.flags&ActivityInfo.FLAG_CLEAR_TASK_ON_LAUNCH) != 0);
  10. if (DEBUG_TASKS) Slog.v(TAG, "Starting new activity " + r
  11. + " in new task " + r.task);
  12. newTask = true;
  13. if (mMainStack) {
  14. mService.addRecentTaskLocked(r.task);
  15. }
  16. }

那么,这个即将要启动的Activity就会在新的任务中启动了。进入这个if语句须要满足三个条件,r.resultTo为null,launchFlags的Intent.FLAG_ACTIVITY_NEW_TASK位为1。而且addingToTask值为false。从上面的分析中能够看到。当即将要启动的Activity的launchMode为"singleTask",而且调用startActivity时不要求返回要启动的Activity的运行结果时,前面两个条件能够满足。要满足第三个条件,仅仅要当前系统不存在affinity属性值等于即将要启动的Activity的taskAffinity属性值的任务就能够了。

我们能够略微改动一下上面的AndroidManifest.xml配置文件来做一下这个实验:

  1. <?xml version="1.0" encoding="utf-8"?

    >

  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3. package="shy.luo.task"
  4. android:versionCode="1"
  5. android:versionName="1.0">
  6. <application android:icon="@drawable/icon" android:label="@string/app_name">
  7. <activity android:name=".MainActivity"
  8. android:label="@string/app_name"
  9. android:taskAffinity="shy.luo.task.main.activity">
  10. <intent-filter>
  11. <action android:name="android.intent.action.MAIN" />
  12. <category android:name="android.intent.category.LAUNCHER" />
  13. </intent-filter>
  14. </activity>
  15. <activity android:name=".SubActivity"
  16. android:label="@string/sub_activity"
  17. android:launchMode="singleTask"
  18. android:taskAffinity="shy.luo.task.sub.activity">
  19. <intent-filter>
  20. <action android:name="shy.luo.task.subactivity"/>
  21. <category android:name="android.intent.category.DEFAULT"/>
  22. </intent-filter>
  23. </activity>
  24. </application>
  25. </manifest>

注意,这里我们设置MainActivity的taskAffinity属性值为"shy.luo.task.main.activity",设置SubActivity的taskAffinity属性值为"shy.luo.task.sub.activity"。

又一次编译一下程序。在模拟器上把这个应用程序再次跑起来。用“adb shell dumpsys activity”命令再来查看一下系统执行的的任务,就会看到:

  1. Running activities (most recent first):
  2. TaskRecord{4069c020 #4 A shy.luo.task.sub.activity}
  3. Run #2: HistoryRecord{40725040 shy.luo.task/.SubActivity}
  4. TaskRecord{40695220 #3 A shy.luo.task.main.activity}
  5. Run #1: HistoryRecord{406b26b8 shy.luo.task/.MainActivity}
  6. TaskRecord{40599c90 #2 A com.android.launcher}
  7. Run #0: HistoryRecord{40646628 com.android.launcher/com.android.launcher2.Launcher}

这里就能够看到,SubActivity和MainActivity就分别执行在不同的任务中了。

至此,我们总结一下,设置了"singleTask"启动模式的Activity的特点:

1. 设置了"singleTask"启动模式的Activity,它在启动的时候,会先在系统中查找属性值affinity等于它的属性值taskAffinity的任务存在。假设存在这种任务,它就会在这个任务中启动。否则就会在新任务中启动。因此。假设我们想要设置了"singleTask"启动模式的Activity在新的任务中启动。就要为它设置一个独立的taskAffinity属性值。

2. 假设设置了"singleTask"启动模式的Activity不是在新的任务中启动时,它会在已有的任务中查看是否已经存在对应的Activity实例。假设存在,就会把位于这个Activity实例上面的Activity所有结束掉,即终于这个Activity实例会位于任务的堆栈顶端中。

最新文章

  1. sqlite嵌入式数据库C语言基本操作(2)
  2. SQL Server中一个隐性的IO性能杀手-Forwarded record
  3. C语言实现二叉树-利用二叉树统计单词数目
  4. js完美解决IE6不支持position:fixed的bug
  5. 搭建 Win CE6.0 设备开发环境
  6. 用Doxygen生成文档
  7. CEvent,CSemaphore,CCriticalSection,CMutex
  8. Oracle如何实现跨数据库查询
  9. C#中的Explicit和Implicit
  10. DEDECMS 留言薄模块的使用方法
  11. Effective C++ ——模板和泛型编程
  12. 思维导图软件比较-FREEMIND,XMIND,Mindjet Mindmanager
  13. ionic3项目 出现 No provider for ApplicationInitStatus!
  14. 文档工具GitBook使用
  15. Java动态追踪技术探究
  16. http系列(一)
  17. Java基础-SSM之mybatis快速入门篇
  18. 【小白的CFD之旅】小结及预告
  19. jzoj5875
  20. [转]有道云笔记markdown

热门文章

  1. HDU 1015.Safecracker【暴力枚举】【8月17】
  2. Navicat Premium 12 模型导出sql
  3. NPAPI——实现非IE浏览器的类似ActiveX的本地程序(插件)调用
  4. UINavi中push控制器的时候隐藏TabBar
  5. 一个登录页面的spring 逻辑过程
  6. tomcat映射路径(应用程序基本目录)的配置方法
  7. struts2学习之基础笔记1
  8. PHP中的类函数和类对象
  9. Could not Open Install.Log File解决方法
  10. 「JavaSE 重新出发」05.03.01 利用反射分析类