[AS 学习笔记] Activity生命周期和启动模式
1. Activity的生命周期
Activity有四种生命状态 ,分别是:running、paused、stopped、killed。
1.running:在屏幕的前台(Activity栈顶)
2.paused:如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
3.stopped: 如果一个Activity失去焦点,但是依然可见(一个新的非全屏的Activity 或者一个透明的Activity 被放置在栈顶),叫做暂停状态(Paused)。
4.killed:一个暂停状态的Activity依然保持活力(保持所有的状态,成员信息,和窗口管理器保持连接),但是在系统内存极端低下的时候将被杀掉。
1.1 正常生命周期
-
onCreate(): 表示此时activity正在创建,通常进行一些初始化的方法。
-
onStart(): 表示此时activity已经被创建,但没有位于前台,处于可见但不可交互的状态。
-
onResume(): 表示此时activity处于前台running的状态,既可见又可交互的状态。
-
onPause(): 表示此时activity处于paused的状态,一般紧接着会调用onStop(),此时处于可见但不可交互。在这个方法中进行一些存储、暂停的工作,但不能耗时过长。
-
onStop(): 表示Activity处于stopped状态,此时位于后台,处于不可见也不可交互状态。这个方法中能继续做一些不耗时的回收工作。
-
onDestroy(): 表示Activity即将被销毁。在这个最终的方法中,进行剩余所有资源的释放和回收。
Q&A
1.在Activity A中打开Activity B 调用方法顺序是什么?
--原栈顶的activity A会先调用onPause,然后新activity B依次调用onCreate ->onStart-> onResume。最后Activity B入栈,Activity A失去栈顶的位置,退入后台调用onStop。
2.分类情况:
(1)只有一个activity的时候:
流程如下: onCreate()-->onStart()-->onResume() 现在就是用户看到的界面如果,
按下back键,activity的生命周期将会结束。流程:onPause()-->onStop()-->onDestroy();
如果按下Home键,首先会保存当前activity的实例状态。OnSaveInstanceState(), 然后转入后台处理,onPause(),最后onStop();当前activity界面状态不可见。
(2)如果有多个activity,并且在启动第二个activity后,调用finish()函数。当从第一个activity跳转到第二个activity的时候,当第二个
activity正要显示出来的时候,第一个activity会执行onPause()方法,转入后台。同时第二个activity执行onCreate()-->onStart()-->onResume().显示出界面。
第一个activity继续执行onStop()-->onDestory()方法。第一个activity生命周期结束。同样,多个activity在彼此调用后,都是这样的流程。
(3)如果有多个activity,并且在启动第二个activity后,没有调用finish()函数。
流程如下: onCreate()-->onStart()-->onResume() 现在就是用户看到的界面。如果,按下back键,activity的生命周期将会结束。流程:onPause()-->onStop()-->onDestroy();
如果按下Home键,首先会保存当前activity的实例状态。OnSaveInstanceState(), 然后转入后台处理,onPause(),最后onStop()。
如果继续跳转activity,并利用back键返回前一个activity,流程如下:onRestart()-->onStart()-->onResume()-->onStop()-->onDestory().前一个activity生命周期结束。
2. Activity的启动模式
首先有一个android的概念叫做任务栈,系统会为每一个应用程序都分配一个任务栈,它就是我们常见的后进先出的栈结构。每次创建一个新的activity就入栈,每次按一下back键activity就出栈。
Activity的启动模式有四种分别是standard、singleTop、singleTask、singleInstance。
(1)standard
这也是默认的启动模式,每次启动activity都会新建一个实例入栈。谁启动了一个新的activity,那个新的activity就会入谁所在的栈。
程序启动的时候,会默认创建一个任务栈,Activity是放在任务栈里面的,比如我们新建一个项目,默认生成一个ActivityA,那么此时任务栈是这样的:
,比如我们在ActivityA中有一个按钮,点击按钮跳转到ActivityB,ActivityB中有一个按钮,点击按钮跳转到ActivityC,那么此时该栈是这样的:
那么如果在ActivityC中有个按钮跳转到ActivityB呢?没错,是再次创建一个ActivityB实例
那么此时,我们点击返回键,会首先移除栈顶的ActivityB,回到ActivityC,在移除栈顶的ActivityC回到ActivityB,以此类推。
当Activity全部退出时,系统会自动回收这个空栈。
(2)singleTop
standard存在一个问题,就是启动几次activity,就有几个新的实例,显然一些场景下是不合理的,因此有后面的几种启动模式。singleTop模式采用栈顶复用的情况,如果此时activity位于栈顶,启动自己时不会重新创建实例入栈,同时onNewIntent方法会被回调。注意如果不在栈顶,仍然会进行重建。
现在我们在ActivityB中点击按钮跳转ActivityB,因为当前栈顶就是ActivityB所以会直接复用,此时栈内仍是ActivityB和ActivityA,此时点击返回按钮会直接退回到ActivityA。
(3)singleTask
singleTop会出现一个问题就是,如果Actvity A 启动了Activity B,然后在Activity B中又启动Activity A。此时任务栈中的顺序是 A B A,这显然也是不合理的。用户从A中按一次back回到B,再按一次B又回到了A,显然是很奇怪的用户体验,因此singleTask便是如果activity处于栈内,就会将该activity调到栈顶,并且由于singleTask默认具有clearTop的效果,还附带将它顶部的所有activity全部出栈,然后调用onNewIntent。如果不在栈内的话,就新建一个入栈。如果需要的栈不存在,就新建一个栈然后再入栈。
比如现在有ActivityA 启动模式为singleTask ,在ActivityA中启动ActivityB,ActivityB在栈中不存在实例,则创建ActivityB实例,此时栈为:
假设现在在ActivityB中启动ActivityA,会在当前栈中是否有ActivityA,若有则将ActivityA移到栈内,将位于ActivityA之上的移出栈顶,那么现在栈为:
此时按返回键会直接退出程序,如果当前栈为
我们现在启动ActivityB中启动ActivityA,则会将位于ActivityA栈顶的ActivityB、ActivityC以及ActivityB移出栈顶,此时栈内只是有ActivityA。
2.3.1 不是当前栈
不是当前栈的情况比较特殊,这里简单介绍
假设当前任务栈是A,A栈中有ActivityA、ActivityB,在B中启动ActivityC,并且ActivityC所需的任务栈为B,栈B不存在所以会首先创建栈B,然后创建ActivityC实例放入栈B中
那么我们如何指定启动的Activity所需的栈名称,这里就要说TaskAffinity参数,这里我们参考官方文档:
https://developer.android.com/guide/topics/manifest/activity-element?hl=zh-cn#aff
TaskAffinity可以理解为任务亲属性或相关性,默认情况下,应用中的所有 Activity 都具有相同的亲和关系
默认任务栈的名字为应用包名,同样我们可以在配置文件中设置TaskAffinity属性,但必须和singleTask启动模式配对使用
(4)singleInstance
如果说singleTask是栈内唯一实例的话,singleInstance就是全局唯一,会为该实例单独分配一个任务栈,因此singleInstance也是。同一时间内,系统只会存在这一个实例。
2.2 使用:
1. android:launchMode="singleTask"
2.代码里:
Intent intent=new Intent();
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
本文地址:https://blog.csdn.net/weixin_38423311/article/details/107946976