前言
Activity 生命周期及状态
文章目录
一、Activity的页面任务栈
1、简介
-
明确
- 一个
Activity
页面,会经历从开始到结束,从开始到结束会经历哪些生命周期?Activity
可以理解为一个活动,举办一场活动是有开始到结束的;- 对于页面也是有,页面开始创建、页面正式创建出来、页面与用户正在交互、最后退出页面;
- 页面在各个阶段都会调用对应的生命周期函数;
- 一个
-
Acitivity
之间进行跳可以实现存在多种页面的形式; -
多个页面在系统中是如何进行存储的;
2、栈与 Activity
1)栈结构
- 栈是用来存储数据的容器;
- 特点: 先进先出;
2)栈结构和Activity页面之间有什么关系?
- 在添加
Activity
页面时,在系统内部也有一个栈结构(Activity
任务栈,Task),在多个页面时,系统会把页面放到任务栈中; Activity
有没有退出任务栈决定Activity
是否被销毁,从任务栈中退出就意味着该Activity
被销毁了;
3)添加和退出 Activity 时,Activity 任务栈的变化
- 添加页面
![](https://img-blog.csdnimg.cn/direct/495e62f972004085befe59b32f7603bd.png)
- 退出页面
![](https://img-blog.csdnimg.cn/direct/ffeeec71f82d45eb935d139c56c00df4.png)
![](https://img-blog.csdnimg.cn/direct/da6fabb281bc40e88475e416bf27d94c.png)
二、生命周期
1、简介
- Activity的生命周期直接影响到与用户的交互,生命周期很重要!
- 生命周期是一个 Activity 在其整个生命周期中可以处于的状态集,从它被创建到被销毁以及系统回收其资源;
- 用户在应用程序中的 Activity 之间导航(进入和离开)时,Activity 会在其生命周期的不同状态间切换;
2、回调函数
- 通过函数指针调用的函数;
- 将函数的指针作为参数传递给另一个函数,此指针被用为调用它所指向的函数时,这就是回调函数;
- 回调函数的调用不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外一方调用,用于对该事件或条件进行响应;
- Activity 生命周期中每个阶段都有相应的回调方法,当 Activity 更改状态时,将调用关联的回调方法;
3、状态
1)目的
- 需要知道在哪些场景回到哪些生命周期;实现特殊功能选择在哪个生命周期进行实现;
- 了解 Activity 生命周期回调方法,Activity 更改及生命周期更改如何影响程序的运行;
2)生命状态周期图
![](https://img-blog.csdnimg.cn/6c6d85ff739143a1aa2f01226fb9ccdc.png)
![](https://img-blog.csdnimg.cn/460c9007ee914fa69fcba2b226d5e326.png)
3)生命周期函数
-
状态
Activity launched
:Activity 启动状态Activity running
:Activity 运行状态Activity shut down
:Activity 被关闭状态
-
回调函数
-
onCreate()
- 当 Activity 第一次创建时会被调用,这是生命周期的第一个方法;
- 做初始化工作,例如,调用
setContentView
加载界面布局资源、初始化数据、布局
-
onStart()
- 表示 Activity 正在被启动,即将开始,此时 Activity 已经出现,但是还没有出现在前台,无法与用户进行交互;可以理解为 Activity 已经显示出来,但是我们还看不到;此时 Activity 在后台
-
onResume()
- 与用户开始交互,当前 Activity 位于 Activity 栈顶(此时界面完全可见,用户可以进行交互);
- Activity 已经可见,出现在前台并开始活动
-
onPause()
- Activity 失去焦点或已暂停,Activity 界面部分可见;用于由一个Activity转到另一个Activity;由一个Activity转到另一个Activity ;退出当前 Activity;
- Activity 正在停止,仍可见,正常情况下,紧接着 onStop 就会被调用;
-
onStop()
- 表示 Acitivity 即将停止,不可见,位于后台;
- 可以做稍微重量级的回收工作,同样不能太耗时
-
onRestart()
- 重启已停止的 Activity
-
onDestroy()
- 销毁 Activity,释放该 Activity 的所有资源;
-
onSaveInstanceState()
- 在非正常关闭(系统回收界面)时回调,用于保存数据,不支持持久化数据;
-
onRestoreInstanceStat()
- 用于恢复数据;
-
页面部分遮挡
- 页面全遮挡
-
界面马上可见/消失需要保存数据:onStart()、onResume()、onPause()、onStop()
![](https://img-blog.csdnimg.cn/7f4328e1ebd44370b80e6a46e79f62bf.png)
4)生命周期的几种普通情况:
- 针对一个特定的 Activity,第一次启动,回调函数执行为:onCreate -> onstart -> onresume
- 用户打开一个新的 Activity 时,上述 Activity 执行的回调函数为:onPause -> onStop
- 再次回到原 Activity 时,回调函数执行为:onRestart -> onstart -> onresume
- 按 back 键回退,执行的回调函数为:onpause -> onstop -> ondestory
- 按 Home 键切换到桌面后又回到该 Activity,执行的回调函数为:onPause -> onstop -> onrestart -> onstart -> onresume
4、单个 Activity 生命周期执行过程
package com.example.lifetime;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = "MyActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "----------");
Log.d(LOG_TAG, "onCreate");
}
@Override
public void onStart() {
super.onStart();
Log.d(LOG_TAG, "onStart");
}
@Override
public void onPause() {
super.onPause();
Log.d(LOG_TAG, "onPause");
}
@Override
public void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "onRestart");
}
@Override
public void onResume() {
super.onResume();
Log.d(LOG_TAG, "onResume");
}
@Override
public void onStop() {
super.onStop();
Log.d(LOG_TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
}
1)启动 Activity
![](https://img-blog.csdnimg.cn/d7716141793a46bab32222f410a49b9e.png)
2)退回到桌面(处于不可见状态)
![](https://img-blog.csdnimg.cn/d42bf132acde4f4eb734694999b81a76.png)
3)退回到桌面后重新导航回到 Activity
![](https://img-blog.csdnimg.cn/7cf3afbd1d304410a0c8f66e6478ab45.png)
4)退出(后退)Activity
![](https://img-blog.csdnimg.cn/650a0495e34d4c46ab568d1b5aba9c04.png)
5)退出后重新回到 Activity
![](https://img-blog.csdnimg.cn/7da6ee885d824f0e8625108b628969f5.png)
5、Acitivity 跳转过程中的生命周期执行过程
- 第一个 Activity:A_Activity;第二个 Activity:B_Activity;
- 在第一个 Activity 中点击按钮跳转到第二个 Activity;
// 第一个 Activity - XML
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是 A_Activity"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.33" />
<Button
android:id="@+id/btnStartBAty"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="启动 B_Activity"
android:onClick="startBActivity"
tools:layout_editor_absoluteX="161dp"
tools:layout_editor_absoluteY="356dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
// 第一个 Activity - 程序
package com.example.lifetime;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
public class MainActivity extends AppCompatActivity {
private static final String LOG_TAG = "MyActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "----------");
Log.d(LOG_TAG, "A onCreate");
}
@Override
public void onStart() {
super.onStart();
Log.d(LOG_TAG, "A onStart");
}
@Override
public void onPause() {
super.onPause();
Log.d(LOG_TAG, "A onPause");
}
@Override
public void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "A onRestart");
}
@Override
public void onResume() {
super.onResume();
Log.d(LOG_TAG, "A onResume");
}
@Override
public void onStop() {
super.onStop();
Log.d(LOG_TAG, "A onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "A onDestroy");
}
public void startBActivity(View view) {
startActivity(new Intent(this, SecondActivity.class));
}
}
// 第二个 Activity - XML
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".SecondActivity">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="这是 B_Activity"
tools:layout_editor_absoluteX="162dp"
tools:layout_editor_absoluteY="284dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
// 第二个 Activity - 程序
package com.example.lifetime;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import java.text.BreakIterator;
public class SecondActivity extends AppCompatActivity {
private static final String LOG_TAG = "MyActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "B onCreate");
}
@Override
public void onStart() {
super.onStart();
Log.d(LOG_TAG, "B onStart");
}
@Override
public void onPause() {
super.onPause();
Log.d(LOG_TAG, "B onPause");
}
@Override
public void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "B onRestart()");
}
@Override
public void onResume() {
super.onResume();
Log.d(LOG_TAG, "B onResume");
}
@Override
public void onStop() {
super.onStop();
Log.d(LOG_TAG, "B onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "B onDestroy");
}
public void returnReply(View view) {
Log.d(LOG_TAG, "B End SecondActivity");
finish();
}
}
![](https://img-blog.csdnimg.cn/7da6ee885d824f0e8625108b628969f5.png)
- 在 B_Activity 呈现出来之前 A_Activity 还可呈现,只执行 OnPause() 暂停,只有在 B_Activity 完全呈现出现后 A_Activity 才会执行 onStop()
三、启动模式
- 每一个
Activity
是一个实例; - 任务栈: 一个堆栈,启动每一个
Activity
,依次放到栈中; - 场景:进入一层一层的页面,到达一个大图页面,在大图页面添加回到首页的功能;
1、标准启动模式(默认)
- 允许重复相同的页面:每启动一个页面会在任务栈中启动一个新的页面,不管栈中页面是否重复;
- 配置:在
mainifest.xml
文件;不配置默认为standard
模式;
![](https://img-blog.csdnimg.cn/d44402c991744ea9b385bc65a716d2aa.png)
2、SingleTop
- 不允许连续重复相同的页面
- 当
Activity_A
设置为singleTop
模式时,同一任务栈中,如果此Activity_A
处于栈顶,则只能创建一个当前实例,不能创建新的当前实例; - 如果此时
Activity_A
不处于栈顶,创建,会创建一个新的Activity_A
实例;
3、SingleTask
- 不允许同个任务栈内重复相同的页面;
- 在有多个页面的栈中,启动首页页面,会将上面的页面全部清掉;
- 同一任务栈,启动一个新的
Activity
任务栈中会弹出上一个Activity
;
4、SingleInstance
- 整个系统不允许重复相同的页面;
- 每一个
Activity
实例只存在于一个独立的任务栈中,一个任务栈只包含一个Activity
;