Task Affinity

  • 我们都比较熟悉Activity的launch mode,但是很多人并不知道TaskAffinity这个属性,这个属性可以在AndroidManifest里面的activity配置:android:taskAffinity

Task

  • 一个Task就好像它的名字一样,是一个任务,Android上把一个任务抽象成一系列的UI(Activity)去完成,比如默认情况下一个App就是一个task,一个task把UI逻辑聚合起来,一个task中的Activity在逻辑上应该是完成同一个方法的
  • 在最简单的情况下,Android设备上的每一个App都至少对应一个Task,所以分前台Task和后台Task
  • 每一个Task都是一个栈的结构

Affinity

  • 其实我认为TaskAffinity更应该理解为Task的名字,默认不设置的时候Activity的TaskAffinity是你的包名,也就是说默认情况下,app里所有的actvity都放在名为的Task里面
  • 不同的TaskAffinity理应放在不同的Task中,但是其实会有多种情况:
    • 当一个Activity有singleTask/FLAG_ACTIVITY_NEW_TASK时,会先去寻找当前的task中有没有affinity是和该activity一样的,如果有没有就会重建一个Task,如果有就会去找task里面有没有对应的实例,如果有销毁该Activity上面的Activity,否则就直接压入栈
    • 如果一个Activity有TaskAffinity但是没有singleTask/FLAG_ACTIVITY_NEW_TASK时,那TaskAffinity无效
    • 如果一个Activity没有singleTask/FLAG_ACTIVITY_NEW_TASK,那么启动它后它会存在于启动它的那个Task内(如果允许的话)
  • 如果launch mode是single instance,那创建这个activity时无论它的Affinity是什么都会创建一个新的Task,而且这个Task不允许有其他Activity

表现

  • Android操作系统有三个键,一个Home,一个Back,还有一个查看app的按键(部分Rom可能改动了),查看app其实查看的是task,即同一个application有两个task,那点击查看app页面的按键也会显示两个
  • 如果一个Activity是singleInstance启动,那在点击查看运行app键时并不会显示这个只能存放一个Activity的Task,它被认为是启动它的那个Task的一部分
  • 例:在自己的App中启动微信的Activity且不设置FLAG_ACTIVITY_NEW_TASK,那这个微信的Activity会存在于自己app的Task中,而且查看当前app时这个Activity也显示在自己的App中

更多相关文章

  1. Android(安卓)启动异常:The connection to adb is down, and a se
  2. android之android.intent.category.DEFAULT的用途和使用
  3. android studio使用database navigator查看数据库
  4. Android(安卓)9.0——ActivityManagerService代码分析
  5. 完美解决Android中AVD模拟器启动慢(卡在Android启动界面)等问题
  6. Android(安卓)Activity 的四种启动模式
  7. android studio 中查看数据库
  8. 解决Android(安卓)Studio 不能启动或新建项目的情况
  9. linux下 在Android工程中查看framework java层的代码

随机推荐

  1. Android中如何优雅地自定义一个View
  2. Android(安卓)禁止安装没有授权的第三方
  3. Android编程学习笔记 之 基于回调的事件
  4. Android封装自定义Toast
  5. 【android】第三方集成之——微信登录
  6. Fragment实现底部功能栏
  7. 如何进行资源的热修复
  8. Android(安卓)百分比布局支持库介绍
  9. Android软件开发实例:用客户端写博客
  10. (一)基于android平台的智能家居控制系统之