Activity的生命周期
什么是Activity?
当用户浏览、退出和返回应用时,应用中的
Activity
实例会在其生命周期的不同状态间转换。
Activity
类会提供许多回调,这些回调会让 Activity 知晓某个状态已经更改:系统正在创建、停止或恢复某个 Activity,或者正在销毁该Activity 所在的进程。
在生命周期回调方法中,我们可以声明用户离开和再次进入 Activity 时 Activity 的行为方式。
例如,如果您正在构建流式视频播放器,则当用户切换至另一应用时,您可能要暂停视频并终止网络连接。当用户返回时,您可以重新连接到网络,并允许用户从同一位置继续播放视频。
Activity的作用?
良好的生命周期回调实现有助于确保应用避免:
- 当用户在使用应用时接听来电,或切换至另一应用时崩溃。
- 当用户未积极使用它时,消耗宝贵的系统资源。
- 当用户离开应用并在稍后返回时,丢失用户的进度。
- 当屏幕在横向和纵向之间旋转时,崩溃或丢失用户的进度。
Activity 生命周期概念
为了在 Activity 生命周期的各个阶段之间导航转换,Activity 类提供六个核心回调:onCreate()
、onStart()
、onResume()
、onPause()
、onStop()
和 onDestroy()
。当 Activity 进入新状态时,系统会调用每个回调。
下图是Activity的总生命周期:
Activity 生命周期每个方法的含义和作用
在这里,我尽量将每个方法的功能进行简化,方便大家理解。
1. onCreate
:创建方法
- 生命周期的第一个方法
- 进行Activity初始化工作
- 此时Activity还在后台,不可见,故动画不应在此初始化
2. onStart
:启动方法
- 生命周期的第二个方法
- Activity可见,但未出现在前台
- 由于未出现在前台,无法交互
3. onResume
:继续/重新开始方法
- Activity出现前台且可见
- 可交互
4.onPause
:暂停方法
- Activity要跳到另一个Activity或应用正常退出时都会执行此方法
- Activity在前台并可见
5. onStop
:停止方法
- Activity不可见
- Activity对象仍在内存中,没有被销毁
- 主要参与资源回收工作
6. onDestroy
:毁灭方法
- Activity被销毁,不可见
- 可以将剩余资源释放,以及回收工作
7. onRestart
:重新开始方法
- Activity可见
- 当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法
- 一般不进行操作
下面这张图片很好地总结了几种方法的特点:
实际测试
Activity其实是继承了ApplicationContext这个类,如下代码:
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
为了更好理解,我们可以重写以上方法,用Log进行输出,源码如下:
package com.example.activitycreate;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_example);
Log.i("MainActivity","调用onCreate()方法");
}
//当页面可见时
@Override
protected void onStart() {
super.onStart();
Log.i("MainActivity","调用onStart()方法");
}
//当Activity获取焦点开始与用户交互时
@Override
protected void onResume() {
super.onResume();
Log.i("MainActivity","调用onResume()方法");
}
//Activity被覆盖锁屏执行
@Override
protected void onPause() {
super.onPause();
Log.i("MainActivity","调用onPause()方法");
}
//页面不可见
@Override
protected void onStop() {
super.onStop();
Log.i("MainActivity","调用onStop()方法");
}
//页面销毁
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("MainActivity","调用onDestroy()方法");
}
//页面重新启用
@Override
protected void onRestart() {
super.onRestart();
Log.i("MainActivity","调用onRestart()方法");
}
}
运行工程后,打开Logcat视窗,加一个过滤器,如下图:
下面开始测试:
打开应用:onCreate()->onStart()->onResume
Back键:onPause()->onStop()->onDestory()
Home键:onPause()->onStop()
Home键后再次启动:onRestart()->onStart()->onResume()
大功告成!