Activity启动模式

261 阅读3分钟

一、介绍

1.四种启动模式(launchMode)

1.standard(标准模式):如果在AndroidMainfest中不设置就默认standard;新建一个Activity在栈中一个实例。

2.singleTop(栈顶复用模式):启动的Activity在栈顶已存在将不再创建新新的实例;与standard相比栈顶复用可以有效减少activity重复创建对资源的消耗。

3.singleTask(栈内单例模式):栈内只有一个Activity实例,其他Activity启动该实例,Android直接把这个实例上其他Activity实例踢出栈GC掉。

4.singleInstance(堆内单例模式):整个手机操作系统中只有一个Activity实例存在,就是内存单例。

在singleTop、singleTask、singleInstance中
如果在应用内存在Activity实例,并且再次发生startActivity(Intent intent)回到该Activity,由于并不是重新创建Activity而是复用栈中的实例。
因此Activity再获取焦点后并没调用onCreate、onStart,而是直接调用了onNewIntent(Intent intent)函数;

2.关于taskAffinity属性

taskAffinity是Activity在AndroidMainfest中配置的一个属性,可以理解为宿主的Activity指定了存放的任务栈[不同于App中其他的Activity的栈],设置属性名时,不能和当前项目的包名相同,因为taskAffinity默认设置为该包名的任务栈。

taskAffinity只有和singleTask启动模式匹配使用时,启动的Activity才会运行在名字和taskAffinity相同的任务栈中。

3.Intent中Flag设置启动模式

通过Intent.setFlags(int flags)动态设置启动模式;

  • Intent.FLAG_ACTIVITY_SINGLE_TOP:等同于AndroidManifest中配置的singleTop。

  • Intent.FLAG_ACTIVITY_CLEAR_TOP:等同于AndroidManifest中配置的singleTask。

  • Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:等同于AndroidManifest中的属性android:excludeFromRecents=“true”,当用户按了“最近任务列表”时候,该Task不会出现在最近任务列表中,可达到隐藏应用的目的。

  • Intent.FLAG_ACTIVITY_NO_HISTORY: 等同于AndroidManifest中的属性:android:noHistory=“true”,这个FLAG启动的Activity,一旦退出,它不会存在于栈中。

  • Intent.FLAG_ACTIVITY_NEW_TASK: 这个属性需要在被start的目标Activity在AndroidManifest.xml文件配置taskAffinity的值【需要和startActivity的调用者Activity的包名不一样,若跳转其他App的Activity,可以省略taskAffinity的设置】,会在新标记的Affinity所存在的taskAffinity中压入这个Activity。

4.startActivity场景

在App中打开新的Activity的基本上分为两种情况:

  • 目标Activity是本应用中的Activity,它的启动模式是可以直接在AndroidManifest中配置或者默认为standard,任务栈也可以自己随意设置;

  • 目标Activity是第三方App中的Activity,这个时候就需要先考虑打开新的Activity是和自己App放在同一任务栈中还是新的任务栈中【这个是很重要的因为在Android的机制中:同一个任务栈中的Activity的生命周期是和这个task相关联的】,然后考虑Activity的启动模式; 所以Android提供了优先级更高的设置方式在Intent.setFlags(int flags),通过这setFlags就可以为打开第三方的App中Activity设置任务栈和启动模式了。

二、Activity四种启动模式常见使用场景:

LauchMode运用场景
standardmainfest中没有配置就默认标准模式
singleTop登录页面、微信页(WXEntryActivity) 、推送通知栏
singleTask模块逻辑入口:主页面、WebView页面、扫一扫页面、电商中:购物界面,订单界面,付款界面
singleInstance系统Launcher、锁屏键、来电显示等系统应用