老生常谈之Android 启动模式

关于启动模式网上一堆一堆的文章可以参考,我只是通过自己实践记录一下实验过程

Tip1. adb shell

dumpsys | grep "DUMP OF SERVICE"  //列举当前手机所有支持的dumpsys命令
查看activity 堆栈
dumpsys activity 包名

找到 Running activities (most recent first): 这一行下面的就是task信息

Task

  1. Task 是一个堆栈。里面维护了一系列Activity
  2. 不同应用的Activity 可以包含在一个Task 里边,比如系统发送邮件等等

实验1 在一个app中建立两个Task

  1. 目前有四个Activity ,让Main4 在一个新的Task中,设置 Main4 taskAffinity 为 ‘.task2’,启动模式设置为 singleTask,这样我们从task3 启动task4 时自动会把Main4 放入新的task(.task2)中去了
图1

2. 若Main2Activity 不设置TaskAfinity, 启动模式为singleTask, Main4Activity启动Main2Activity 会复用Main2并把 main2 上面的 Main3 干掉。变成如下

图2

假如上不管设置不设置taskaffinity ,Main2Activity 启动模式为standard,直接会到当前task2中添加Main2 ,变成如下

在此情况下若需将main2 添加到默认的task,则需设置flag=FLAG_ACTIVITY_NEW_TASK 此时如下显示

我指定Main4的 Affinity为.task2,我们长按home 的时候会出现两个窗口分别对应不同的任务,我把task2 改成应用程序的包名,将只会出现一个窗口。但是,我们再去看task个数居然是1,也就是根本没有创建新的task ,因此默认affinity 为包名,只有改变了affinity 才会创建出一个新的task, 结论 要想创建task 一定要设置 taskAffinity属性并且和发起者的task名称不一致才行,代码中设置FLAG_ACTIVITY_NEW_TASK或者或者启动模式singleTask,

补充实验: task1的ActivityA start task2的activityB 如果task2中的activityB 之上有ActivityC ,singleTask 模式会把C 干掉(destroy),然后activityB调用newIntent 。

其他的flag 试试看

  1. Intent.FLAG_ACTIVITY_CLEAR_TOP
    跳转到的目标Activity 之后的activity 全部finish掉。但是只是其所在task的。
  2. 上面描述有不足,如果不想重新创建main2 可设置main2启动模式为singleTask, 会自动清除main2之上的act,并复用main2,并不一定非得设置singleTop
  3. 如果Main4只添加了FLAG_ACTIVITY_NEW_TASK ,它和设置main2为singeTask不一样,不会亲空默认栈中后面的act。如上图2所示
  4. Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    设置后在任务列表中不显示这个窗口,这和设置相同的taskAffinity 不显示原理不一样。
  5. FLAG_ACTIVITY_NO_ANIMATION
    不用系统界面跳转动画
  6. FLAG_ACTIVITY_REORDER_TO_FRONT
    a b c d 从d start b 并且带这个参数,b 不重新创建 task栈变为 a c d b 。但是从其他task中启动 b则无效

实验2 singleInstance

会另外启一个task,名字和 最原始task的名字一致(此时再任务列表中只会出现一个窗口,如果设置了taskAffinity 属性,就会和task一样出现两个窗口) ,再按home 点击app图标会回到启动app根(第一个)task的最后一个activity Main3。 Main4 这个activity 一直在自己的Task中,这个task只保留这一个activity 再次start 这个Activity的时候不再调用onCreate 而是 onNewIntent 方法。

singleTop

调用者调用之后,如果该 activity 在所在栈的栈顶,则不创建 ,如果不再栈顶,则在的task栈顶中新增一个activity。该值和FLAG_ACTIVITY_CLEAR_TOP 有相同作用,如果task2中启动singleTop的act,则会将改act添加到task2中,若task2的act 要让singleTop的在原来的栈中处理,则设置flag为FLAG_ACTIVITY_NEW_TASK

Leave a Reply

Your email address will not be published. Required fields are marked *