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. 如何解决安卓SDK无法下载Package的问题
  2. Android(安卓)系统第三方应用系统修改权限及在应用上层显示权限
  3. Android周报第二十一期
  4. Android(安卓)Service教程
  5. 一句话_理解Activity四种启动模式
  6. Android(安卓)launchMode 笔记---taskAffinity属性和Intent标记
  7. Android的开机流程
  8. Android(安卓)中一些小经验总结
  9. Android点击WebView中的图片查看大图

随机推荐

  1. android > tabHost > 微博布局风格
  2. Android autoLink的注意点
  3. android 程序分享。。
  4. [Android UI] listview 自定义style
  5. Android 之 SeekBar用法介绍
  6. Android 7.1.2(Android N) Android系统启
  7. Android安装
  8. Android 控件常用属性
  9. JAVA & Android 系统环境变量配置
  10. Android 7.1 去掉桌面上的谷歌搜索框