博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android Activity launch mode 一个实例 singleTask
阅读量:5086 次
发布时间:2019-06-13

本文共 3260 字,大约阅读时间需要 10 分钟。

参考:http://blog.csdn.net/ljz2009y/article/details/26621815

一个应用 三个页面 第二个页面设置为 singlTask 

  

在命令行中执行以下命令 adb shell dumpsys activity , 有以下输出:

TaskRecord{412ded08 #8 A com.jg.zhang.androidtasktest}
Run #2: ActivityRecord{412c91e8 com.jg.zhang.androidtasktest/.SecondActivity}
Run #1: ActivityRecord{412c08a0 com.jg.zhang.androidtasktest/.MainActivity}

且点击MainActivity界面中的按钮,开启SecondActivity。在该示例中SecondActivity的启动模式为singleTask。按照官方文档的说法,SecondActivity会在一个新的任务中开启。但是查看打印出的log,发现MainActivity和SecondActivity所在的任务的Id相同。

所以,和官方文档表述的不同,MainActivity和SecondActivity是启动在同一个任务中的。其实,把启动模式设置为singleTask,framework在启动该activity时只会把它标示为可在一个新任务中启动,至于是否在一个新任务中启动,还要受其他条件的限制。现在在SecondActivity增加一个taskAffinity属性

lt;/activity>

  重新运行该示例

在命令行中执行adb shell dumpsys activity命令,有以下输出:

TaskRecord{411e6a88 #6 A com.jg.zhang.androidtasktest.second}
Run #3: ActivityRecord{411c8ea0 com.jg.zhang.androidtasktest/.ThirdActivity}
Run #2: ActivityRecord{412bc870 com.jg.zhang.androidtasktest/.SecondActivity}
TaskRecord{412ece18 #5 A com.jg.zhang.androidtasktest}
Run #1: ActivityRecord{412924c0 com.jg.zhang.androidtasktest/.MainActivity}

 

由此可见,MainActivity和SecondActivity运行在不同的任务中了,并且被SecondActivity启动的ThirdActivity和SecondActivity运行在同一个任务中。

 

 

taskAffinity可以影响当activity以FLAG_ACTIVITY_NEW_TASK标志启动时,它会被启动到哪个任务中。这句话的意思是,当新启动的activity(SecondActivity)是以FLAG_ACTIVITY_NEW_TASK标志启动时(可以认为FLAG_ACTIVITY_NEW_TASK和singleTask作用相同,当启动模式为singleTask时,framework会将它的启动标志设为FLAG_ACTIVITY_NEW_TASK),framework会检索是否已经存在了一个affinity为com.jg.zhang.androidtasktest.second的任务(即一个TaskRecord对象)

 

  • 如果存在这样的一个任务,则检查在这个任务中是否已经有了一个SecondActivity的实例,
    • 如果已经存在一个SecondActivity的实例,则会重用这个任务和任务中的SecondActivity实例,将这个任务调到前台,清除位于SecondActivity上面的所有Activity,显示SecondActivity,并调用SecondActivity的onNewIntent();
    • 如果不存在一个SecondActivity的实例,会在这个任务中创建SecondActivity的实例,并调用onCreate()方法
  • 如果不存在这样的一个任务,会创建一个新的affinity为com.jg.zhang.androidtasktest.second的任务,并且将SecondActivity启动到这个新的任务中

 

 

 

上面讨论的是设置taskAffinity属性的情况,如果SecondActivity只设置启动模式为singleTask,而不设置taskAffinity,即三个Activity的taskAffinity相同,都为应用的包名,那么SecondActivity是不会开启一个新任务的,framework中的判定过程如下:

 

  1. 在MainActivity启动SecondActivity时,发现启动模式为singleTask,那么设定他的启动标志为FLAG_ACTIVITY_NEW_TASK
  2.  然后获得SecondActivity的taskAffinity,即为包名com.jg.zhang.androidtasktest
  3. 检查是否已经存在一个affinity为com.jg.zhang.androidtasktest的任务,这个任务是存在的,就是MainActivity所在的任务,这个任务是在启动MainActivity时开启的
  4.  既然已经存在这个任务,就检索在这个任务中是否存在一个SecondActivity的实例,发现不存在
  5.  在这个已有的任务中启动一个SecondActivity的实例

 

为了作一个清楚的比较,列出SecondActivity启动模式设为singleTask,并且taskAffinity设为com.jg.zhang.androidtasktest.second时的启动过程

 

  1. 在MainActivity启动SecondActivity时,发现启动模式为singleTask,那么设定他的启动标志为FLAG_ACTIVITY_NEW_TASK
  2. 然后获得SecondActivity的taskAffinity,即com.jg.zhang.androidtasktest.second
  3. 检查是否已经存在一个affinity为com.jg.zhang.androidtasktest.second的任务,这个任务是不存在的
  4. 创建一个新的affinity为com.jg.zhang.androidtasktest.second的任务,并且将SecondActivity启动到这个新的任务中

 

转载于:https://www.cnblogs.com/wjw334/p/4789228.html

你可能感兴趣的文章
Linux最大文件打开数
查看>>
hdu1009
查看>>
[BZOJ4246]两个人的星座(计算几何)
查看>>
PowerDesigner常用设置
查看>>
.NET下XML文件的读写
查看>>
ORACLE 根据 sql_id 查询绑定变量的传入值
查看>>
BZOJ.2456.mode(绝对众数)
查看>>
CODE[VS] 2664 上厕所
查看>>
UCOSIII-常用API
查看>>
mysql事件 修改事件
查看>>
hdu-2594 kmp模板
查看>>
c#读写注册表示例分享
查看>>
阿里云ssh断开处理办法
查看>>
lua创建文件
查看>>
面向对象 空参有参构造
查看>>
抓老鼠啊~亏了还是赚了?
查看>>
oc29--property修饰符
查看>>
oc63--协议@protocol1
查看>>
mybatis14 动态sql
查看>>
MySQL5.7免安装版配置图文教程
查看>>