Android Activity的启动模式基础

Android Activity的启动模式基础

Activity启动过程

Activity之间的启动流程见下图,从图中可以看出,启动的过程中会受很多因素的影响,导致启动的现象千变万化。
Android Activity的启动模式基础

Task

管理并存放Activity实例的单元,它是Activity的组合,方便用户完成一系列操作。栈结构,符合先进后出特点。
Android系统全局统一管理Task,Task不属于任何App,两个App的Activity可以放在一个Task内。

四大启动模式

1.Standard模式
默认模式,此模式的Activity依照顺序压入Task中,可以被创建多个对象,不受限制。此模式的使用场景最广泛,大多数普通的Activity都使用此模式。

2.SingleTop模式
SingleTop模式下的Activity的启动效果基本与默认模式相同,但比默认模式多一条限制,当Task顶部已有本类的实例时,无法再创建,只能调用已存在实例的onNewIntent()。

使用场景:避免重复创建。此模式避免连续重复创建Activity实例,比如由于点击Button跳转慢,用户连续点击而导致的多次创建。

3.SingleTask模式
SingleTask模式下的Activity会主动在系统中寻找属于自己的Task及实例,有则复用,无则创建Task和实例。复用时会将已存在的实例置顶并销毁阻碍的实例,调用onNewIntent()。

使用场景:主页面。此模式主要是为了避免系统中存在多个实例,并且避免实例存放到其他App的Task中,因此很适合主页面。

4.SingleInstance模式
SingleInstance模式下的Activity会主动寻找系统中是否已经存在实例,如果没有则创建一个Task,并单独存放于其中;否则会复用已存在的实例,并把所在的Task移到最前端显示,调用onNewIntent()。

使用场景:独立功能的页面。此模式适用于程序的独立功能的页面,同时拥有独立的快捷方式,比如一键加速功能。

跨应用启动Activity

启动方式

关于Activity的启动方式,我们熟知的有显式启动和隐式启动两种,但身为一个追求知根知底的开发者,不能不去了解其底层含义。
显式启动准确的说是Component启动,也就是组件启动,是精准到系统中的某一具体组件的。
隐式启动准确的说是Action启动,也就是行为启动,是对要做的行为进行匹配,包含的范围会广一些。
通过下图,我们可以看出,这两种启动的区别在于Intent对象的创建方式不同。显式启动是通过创建ComponentName对象来创建Intent对象,而隐式启动是传递Action字符串来创建Intent对象。
Android Activity的启动模式基础

跨应用启动模式场景情况

1.AppA启动AppB的Standard模式Activity
被启动的Activity压入启动者所在的Task中,同样可以被创建多个对象,不受限制,现象与同App内启动一样。
2.AppA启动AppB的SingleTop模式Activity
被启动的Activity压入启动者所在的Task中,当Task顶部已有本类的实例时,无法再创建,只能调用已存在实例的onNewIntent()。现象与同App内启动一样.
3.AppA启动AppB的SingleTask模式Activity
会优先寻找系统中是否已存在实例,若没有会创建对应的Task和实例;如果有会检查其中是否已存在实例,如果没有则创建,否则会onNewIntent()复用并置顶,同时销毁阻碍的实例。
4.AppA启动AppB的SingleInstance模式Activity
会优先寻找系统中是否已存在实例,若没有会创建对应的Task和实例,此Task只能存放此一个实例;如果有就复用旧实例,将其所在的Task移入前台显示

常用的Activity启动Flag

1.SINGLE_TOP
效果与启动SingleTop模式的Activity一样。
2.CLEAR_TOP
如果Task中已存在实例,清理已存在实例之上的其他实例,同时销毁已存在的实例并重建,走onCreate()。
3.CLEAR_TOP + SINGLE_TOP
如果Task中已存在实例,清理已存在实例之上的其他实例,复用已存在的实例,走onNewIntent().
4.CLEAR_TOP + SINGLE_TOP + NEW_TASK
如果Task中已存在实例,清理已存在实例之上的其他实例,复用已存在的实例,走onNewIntent()。并且可以在其他Task中实现
适用场景:点击Notification的跳转
5.CLEAR_TASK
销毁被启动的Activity所对应的Task内的所有Activity实例,新建被启动Activity实例,放在Task的底部
适用场景:切换用户登录账号
注意:启动Standard和SingleTop时,CLEAR_TASK单独使用无效,必须与NEW_TASK一同使用;启动SingleTask和SingleInstance时,CLEAR_TASK单独使用有效
6.EXCLUDE_FROM_RECENTS
当新建Activity并且存放在新的Task中的根部时,被启动的Activity从RecentApp列表中消失
注意:部分手机需要先按Home键回到桌面,然后按RecentApp键,才能有效
7.NO_HISTORY
带着这条Flag启动的Activity,一旦onStop,Activity就会被销毁。按Home键就会销毁。不会留在Recent列表中。
适用场景:敏感信息的页面。比如输入密码的页面。
8.REORDER_TO_FRONT
将Task中已存在的实例,置顶,不影响其他实例。
若Task中已存在实例并且在顶部,那么Task顺序保持不变,复用旧实例,回调onNewIntent()
若Task中已存在实例并且不在顶部,会将其移到Task顶部,其余Activity被向下压一层,回调onNewIntent()
9.TASK_ON_HOME
如果被启动的Activity的实例存放到了另一个Task中,那么按Back键回退的时候,当第一个Task中的Activity回退完之后,会回到桌面,而不会回到启动页面的Task。
适用场景:使用Activity覆盖其他App的情形