Android launchMode 笔记---taskAffinity属性和Intent标记体会

  次阅读 来源:互联网(转载协议) 2016-01-14 09:27 我要评论(0)

launchmode的四种模式,不需要细说:standard、singleTop、singleTask、singleInstance。

此博客关注的是,关于Activity中关于Affinity(亲和力)&Intent标记的东西,即使是Android老鸟,也不一定将其中的细节理解透彻。

使用Intent启动一个Activity,有如下标记:

1、FLAG_ACTIVITY_NEW_TASK

2、FLAG_ACTIVITY_CLEAR_TOP

3、FLAG_ACTIVITY_RESET_TASK_IF_NEEDED

4、FLAG_ACTIVITY_SINGLE_TOP

使用最多的,当然是FLAG_ACTIVITY_NEW_TASK。

主要的Activity属性有:

1、taskAffinity

2、launchMode

3、allowTaskReparenting

4、clearTaskOnLaunch

5、alwaysRetainTaskState

6、finishOnTaskLaunch

当Affinity与LaunchMode结合起来使用,就比较让人蛋疼的事情了。在实际项目中,灵活使用各种属性,可以让程序运行流畅,界面直接的导航跳转流畅,用户体验良好。反之,则让人摸不着头脑,让人蛋疼。绝知此事须躬行的道理,才油然而生。

关于上述的各种属性,可以参看Google文档,Tasks and Back Stack ,文档中将各种情况分析得较为全面,网上的资料,均是翻译其内容。

FLAG_ACTIVITY_NEW_TASK 讲解:

case 1:当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中。

case 2:如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task。

上面的两个case,可以简单的理解为:

FLAG_ACTIVITY_NEW_TASK标记,不一定会启动一个新的栈,其策略是:先查找有没有和这个Activity的affinity相同的task栈,如果有,则直接在这个task栈里启动,没有才创建一个新的task栈。

case 3:如果同一个应用中Activity的taskAffinity都使用默认值或都设置相同值时,应用内的Activity之间的跳转使用这个标记是没有意义的,因为当前应用task就是目标Activity最好的宿主。

为了更好的说明其中的扯淡关系,使用案例进行说明上述的case 1、case 2、case 3

一个简单的app中,MainActivity点击按钮启动一个新的Activity。case 1:在AndroidManifest.xml中定义的属性为:

... .... .... ....

app运行效果如下:

在OtherActivity界面,多次点击“Start AppOther OtherActivity in AppOther”按钮,会启动多个Activity Instance,由于两个Activity拥有共同的taskAffinity,将处于同一个task里面。case 2:在AndroidManifest.xml中定义的属性为:app运行效果如下:

在OtherActivity界面,点击“Start AppOther OtherActivity in AppOther”按钮,创建新的Activity Instance,由于两个Activity拥有的taskAffinity不同,新的instant将处于另外的task里面,其task id 为23.PS:此处多次点击点击“Start AppOther OtherActivity in AppOther”按钮,不会产生新的Activity Instance。

在case 2中,当界面停留在OtherActivity时,此时按Home键,让app进入后台运行,再次启动app,将直接显示MainActivity界面,而不是OtherActivity界面。主要原因是,该app的启动时,系统将寻找root Activity所处的那个task,而该app的root activity为MainActivity,所以显示MainActivity界面。case 3:在AndroidManifest.xml中定义的属性为与case 1一致。

此时Activity之间的导航,与普通的跳转一致,task的创建与否,直接根据launchMode来确定。allowTaskReparenting讲解:

这个属性用来标记一个Activity实例在当前应用退居后台后,是否能从启动它的那个task移动到有共同affinity的task,“true”表示可以移动,“false”表示它必须呆在当前应用的task中,默认值为false。

本站部分文章来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

    Oculus公布原型机,大幅度提升可视角,能实现140°的视场水平

  • 2018深圳国际人工智能展览会 2018 shenzhen International Artif

    2018深圳国际人工智能展览会 2018 shenzhen International Artif

  • teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

    teamLab创始人猪子寿之: 抛去衣食住行,我还剩下什么?

  • Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

    Michael I. Jordan带你解读百万奖金ATEC蚂蚁人工智能大赛

网友点评网友点评
阅读推荐阅读推荐

据外媒报道,STEER打造了首款完全自动驾驶停车技术,旨在使常规车辆转变为无人驾驶车辆。STEER的首款技术应用是4级自动驾驶及网络安全停车...

近日,美国软性机器抓手制造商 Soft Robotics 宣布,获得 2000 万美元的融资,本轮投资者包括 Scale Venture Partners,Calibrate Ventures...

据外媒报道,加州车管局发布了《2017自动驾驶脱离报告(California Autonomous Vehicle Disengagement Reports)》,其中谈及了脱离的具体...

用人机语音交互,来解决智能家居适老的问题;通过家庭门禁与安防套件、空气净化套件、可燃气体与有害气体监控套件等相互联动,在不同生活情...