三分钟教你完全掌握Activity的生命周期

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()

大功告成!

发布了65 篇原创文章 · 获赞 26 · 访问量 2893

猜你喜欢

转载自blog.csdn.net/weixin_43332735/article/details/104868236