老生常谈之Android 启动模式

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

tip1 adb shell

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

Task

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

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

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

(Main2 不设置TaskAfinity) Main4Activity启动Main2Activity 会在默认task中添加Main2

-wang.xiunian.packagename-------                       -----.task2----
Main3Activity                                          Main4Activity
Main2Activity                  -->                     ----wang.xiunian.packagename---
MainActivity                                           Main2Activity
------.task2------                                     Main3Activity 
Main4Activity                                          Main2Activity
                                                       MainActivity

上面可以知道Main2 被添加到默认的task栈中了,
Main2 设置了TaskAfinity为.task2 直接会到当前task中添加Main2

-wang.xiunian.packagename-------                        ----wang.xiunian.packagename---
Main3Activity                                          Main3Activity
Main2Activity                  -->                     Main2Activity
MainActivity                                           MainActivity
------.task2------                                     -----.task2----
Main4Activity                                          Main2Activity
                                                       Main4Activity 

正如上面,我指定Main4的 Affinity为.task2,我们长按home 的时候会出现两个窗口分别对应不同的任务,我把task2 改成应用程序的包名,将只会出现一个窗口。但是,我们再去看task个数居然是1,也就是根本没有创建新的task ,因此默认affinity 为包名,只有改变了affinity 才会创建出一个新的task, 结论 要想创建task 一定要设置 taskAffinity属性并且和发起者的task名称不一致才行(当然还要和配合new_task flag 或者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. Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
    设置后在任务列表中不显示这个窗口,这和设置相同的taskAffinity 不显示原理不一样。

  3. FLAG_ACTIVITY_NO_ANIMATION
    不用系统界面跳转动画

  4. 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根(第一个)task的最后一个activity Main3。 Main4 这个activity 一直在自己的Task中,这个task只保留这一个activity 再次start 这个Activity的时候不再调用onCreate 而是 onNewIntent 方法。

singleTop

调用者调用之后,如果该 activity 在所在栈的栈顶,则不创建 ,如果不再栈顶,则在的task栈顶中新增一个activity。

发表评论

电子邮件地址不会被公开。 必填项已用*标注