2021-12-04 taskAffinity 属性详解

问题描述:一个应用里多个Activity出现在多个任务栈,在最新任务中可以看到,如图


同一应用多个task.jpg

原因:集成第三方sdk,sdk里设置了application的taskAffinity,自己应用没有设置,所以所有设置singleTask的Activity会创建新的task

参考:https://www.cnblogs.com/aademeng/articles/11061449.html

  1. 每个 Activity 运行时都有一个其归属的 task栈,可以用 activity.getTaskId() 的方法得到当前 activity 的taskId。如果两个 activity 的 taskId 不同,则他们肯定不会属于同一个 task。
  2. taskaffinity 可以单独对一个 activity 使用,代表该 activity 所想归属的 task;
    也能对application 使用,代表该 application 内声明的所有 activity 都归属于这个task。
  3. Android 手机的任务列表就是根据不同 task 弹出的,我们可以根据任务管理器有几个 item 图标,来知道我们开启了几个 task。
  4. 指定了一个 Activity 的 taskAffinity 值(跟包名不同),运行该 Activity 时,是否就会新开这个 task栈呢?
    答案是否定的,一个 Activity 运行时所归属的task,默认是启动它的那个Activity 所在的 task
  5. taskAffinity 单独使用并不会生效。
    要想其生效,需要配合其他属性使用,配合 Intent.FLAG_ACTIVITY_NEW_TASKandroid:launchMode="singleTask"),或者配合allowTaskReparenting 。
  6. task 是可以跨进程的,即一个 task 中的 Activities 是可以运行在不同的进程中的

验证:A在 app1,B在app2,此时 B 的默认 task 肯定是和 A 不同的。 通过隐式启动的方式启动B,B 是标准启动模式。指定B为singleTask启动模式,则task不同

  1. allowTaskReparenting 这个属性指的是一个 Activity 运行时,可以重新选择自己所属的task。基本是在跨app 间调用时

验证:在上面验证基础上,B标准启动模式,但设置android:allowTaskReparenting="true" ,当 A 启动 B 时,这时虽然是在两个进程中的,但其归属的task 是同一个,这时回到后台,在桌面点击 B 的应用图标,B又重新创建新task( 若Activity taskAffinity指定的task 已经存在,是会复用之前的task,而不会再重新创建一个新的task。)

你可能感兴趣的:(2021-12-04 taskAffinity 属性详解)