欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

[AS 学习笔记] Activity生命周期和启动模式

程序员文章站 2022-06-21 19:16:53
1. Activity的生命周期Activity有四种生命状态 ,分别是:running、paused、stopped、killed。1.1 正常生命周期onCreate(): 表示此时activity正在创建,通常进行一些初始化的方法。onStart(): 表示此时activity已经被创建,但没有位于前台,处于可见但不可交互的状态。onResume(): 表示此时activity处于前台running的状态,既可见又可交互的状态。onPause():...

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 正常生命周期

  1. onCreate(): 表示此时activity正在创建,通常进行一些初始化的方法。

  2. onStart(): 表示此时activity已经被创建,但没有位于前台,处于可见但不可交互的状态。

  3. onResume(): 表示此时activity处于前台running的状态,既可见又可交互的状态。

  4. onPause(): 表示此时activity处于paused的状态,一般紧接着会调用onStop(),此时处于可见但不可交互。在这个方法中进行一些存储、暂停的工作,但不能耗时过长。

  5. onStop(): 表示Activity处于stopped状态,此时位于后台,处于不可见也不可交互状态。这个方法中能继续做一些不耗时的回收工作。

  6. onDestroy(): 表示Activity即将被销毁。在这个最终的方法中,进行剩余所有资源的释放和回收。

 

[AS 学习笔记] 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就出栈。

2.1 LaunchMode

Activity的启动模式有四种分别是standard、singleTop、singleTask、singleInstance。

(1)standard

这也是默认的启动模式,每次启动activity都会新建一个实例入栈。谁启动了一个新的activity,那个新的activity就会入谁所在的栈。

程序启动的时候,会默认创建一个任务栈,Activity是放在任务栈里面的,比如我们新建一个项目,默认生成一个ActivityA,那么此时任务栈是这样的:
[AS 学习笔记] Activity生命周期和启动模式

 

,比如我们在ActivityA中有一个按钮,点击按钮跳转到ActivityB,ActivityB中有一个按钮,点击按钮跳转到ActivityC,那么此时该栈是这样的:

[AS 学习笔记] Activity生命周期和启动模式

那么如果在ActivityC中有个按钮跳转到ActivityB呢?没错,是再次创建一个ActivityB实例

[AS 学习笔记] Activity生命周期和启动模式

那么此时,我们点击返回键,会首先移除栈顶的ActivityB,回到ActivityC,在移除栈顶的ActivityC回到ActivityB,以此类推。

[AS 学习笔记] Activity生命周期和启动模式

当Activity全部退出时,系统会自动回收这个空栈。

(2)singleTop

standard存在一个问题,就是启动几次activity,就有几个新的实例,显然一些场景下是不合理的,因此有后面的几种启动模式。singleTop模式采用栈顶复用的情况,如果此时activity位于栈顶,启动自己时不会重新创建实例入栈,同时onNewIntent方法会被回调。注意如果不在栈顶,仍然会进行重建。

[AS 学习笔记] Activity生命周期和启动模式

现在我们在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实例,此时栈为:

[AS 学习笔记] Activity生命周期和启动模式

假设现在在ActivityB中启动ActivityA,会在当前栈中是否有ActivityA,若有则将ActivityA移到栈内,将位于ActivityA之上的移出栈顶,那么现在栈为:

[AS 学习笔记] Activity生命周期和启动模式

此时按返回键会直接退出程序,如果当前栈为

[AS 学习笔记] Activity生命周期和启动模式

我们现在启动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 都具有相同的亲和关系

[AS 学习笔记] Activity生命周期和启动模式

默认任务栈的名字为应用包名,同样我们可以在配置文件中设置TaskAffinity属性,但必须和singleTask启动模式配对使用

(4)singleInstance

如果说singleTask是栈内唯一实例的话,singleInstance就是全局唯一,会为该实例单独分配一个任务栈,因此singleInstance也是。同一时间内,系统只会存在这一个实例。

[AS 学习笔记] Activity生命周期和启动模式

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

相关标签: android