🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # Activity的启动模式 1、任务(Task)是一个【Activity的集合】,采用栈的方式来管理其中的Activity。这个栈被称为返回栈或任务栈。 2、任务栈中的Activity采用后进先出的方式。 ## Activity启动Activity 以下情况适用于Activity启动Activity,且使用的是默认的Intent,没有额外添加Flag。 Activity的启动模式一共有四种:standard(默认)、singleTop、singleTask和singleInstance。 1、Activity采用standard模式时,每次启动都会创建该活动的一个新的实例,添加到任务栈中,并处于栈顶的位置。 2、Activity采用singleTop模式时,启动时会先判断任务栈栈顶是否已经有该Activity实例,有的话可以直接使用并回调其onNewIntent方法,没有则创建新实例并添加到栈顶位置。 3、Activity采用singleTask模式时,启动时会先检查Activity所需的任务栈是否存在(根据taskAffinity判断),任务栈不存在就创建任务栈并新建实例;任务栈存在就查看任务栈中是否存在该Activity的实例,有实例直接使用该实例并回调其onNewIntent方法,同时把这个Activity之上的所有Activity全部出栈,没有Activity实例则直接创建新实例并添加到栈顶位置(如果任务栈位于后台会直接把整个任务栈移到前台)。 ![](https://img.kancloud.cn/92/81/92815a301a7d018a9d6c11bef44b10d7_550x309.png) 4、Activity采用singleInstance模式时,会先判断系统中是否存在一个实例,存在的话使用该实例并回调onNewIntent方法;不存在的话系统会启动一个新的任务栈,创建Activity实例并入栈,并且任务栈中只允许有它一个实例。 5、Activity采用singleTask模式时,为该Activity指定不同的taskAffinity,也会创建一个新的任务栈来管理Activity实例。 各种启动模式的使用场景: 1、standard模式:默认模式,适用于大多数场景。 2、singleTop模式:登录页面等,用户浏览了一些Activity后,需要使用登录功能,跳转到登录页面,如果不登录进行返回还可以回到之前的Activity。 3、singleTask模式:主页面等,从其他页面回到主页面时,会将顶部Activity全部出栈,再点击返回时退出应用,可以保证全部Activity销毁。 4、singleInstance模式:多用于多个程序使用同一个Activity,如系统launcher、来电界面等。 ## Intent的Flag 1、我们在调用startActivity方法启动Activity时,可以在Intent中加入一个Flag,来指定新启动的Activity如何与当前任务进行关联。 2、Activity A启动Activity B时,Activity B可以自己定义如何与当前任务进行关联(使用AndroidManifest文件定义),也可以由Activity A来决定Activity B如何与当前任务进行关联(使用Intent的Flag)。 3、二者同时使用时,Intent的Flag优先级更高。 ### Intent.FLAG_ACTIVITY_NEW_TASK 1、Intent.FLAG_ACTIVITY_NEW_TASK的目的是,在Activity的目标taskAffinity对应的任务栈中启动Activity。 2、Activity启动Activity时,singleTask模式和singleInstance模式被隐式的设置了Intent.FLAG_ACTIVITY_NEW_TASK,而standard模式和singleTop模式不会被设置Intent.FLAG_ACTIVITY_NEW_TASK。 3、非Activity(如Service)启动Activity时,需要显示的设置Intent.FLAG_ACTIVITY_NEW_TASK。 4、如果目标实例不存在或者Task不存在时,会新建实例或者任务栈,并移到前台。 ### Intent.FLAG_ACTIVITY_CLEAR_TASK 1、只能与Intent.FLAG_ACTIVITY_NEW_TASK一起使用。 2、目标task不存在新建task,目标task存在就清空目标task中的所有Activity。 3、优先级比启动模式、Intent的其他Flag更高。 ### Intent.FLAG_ACTIVITY_CLEAR_TOP 1、当前task中已经存在Activity实例时,会把Activity实例之上所有的Activity全部关闭。 2、目标Activity为standard模式,且没设置FLAG_ACTIVITY_SINGLE_TOP模式时,Activity实例会销毁重建;目标Activity为非standard模式或Intent中设置FLAG_ACTIVITY_SINGLE_TOP时,回调实例的onNewIntent方法。 3、经常与Intent.FLAG_ACTIVITY_NEW_TASK一起使用。 ### Intent.FLAG_ACTIVITY_SINGLE_TOP 和在launchMode中设置singleTop模式效果是一样的。 ## taskAffinity taskAffinity用于指定一个Activity更愿意依附于哪一个任务,默认情况下,同一个应用的所有Activity都具有相同的taskAffinity(默认为应用包名)。 # Activity的生命周期 ![](https://img.kancloud.cn/2c/a5/2ca5132c39375b32fee0a4351a8e4689_545x711.png) # Activity知识点 1、Task是Activity的集合,采用栈的方式来管理其中的Activity,称为返回栈或任务栈。 2、任务栈中的Activity采用后进先出的方式。 3、Activity的taskAffinity用于指定Activity更愿意依附于哪一个任务,默认情况下同一个应用的所有Activity的taskAffinity都相同,就是应用包名。 4、Activity A启动Activity B,B可以自己定义如何与当前任务关联(使用AndroidManifest定义),也可以由A来决定B如何与当前任务关联(使用Intent的flag)。 5、二者同时设置时Intent的flag级别更高。