一、前言
- 理解Activity生命周期图
- 掌握生命周期回调方法
- 利用日志类Log输出信息
- 当用户浏览、退出和返回到您的应用时,您应用中的 Activity 实例会在其生命周期的不同状态间转换。Activity 类会提供许多回调,这些回调会让 Activity 知晓某个状态已经更改:系统正在创建、停止或恢复某个 Activity,或者正在销毁该 Activity 所在的进程。
二、笔记
(一)Activity生命周期
1、了解Activity生命周期
- 当用户浏览、退出和返回到您的应用时,您应用中的 Activity 实例会在其生命周期的不同状态间转换。Activity 类会提供许多回调,这些回调会让 Activity 知晓某个状态已经更改:系统正在创建、停止或恢复某个 Activity,或者正在销毁该 Activity 所在的进程。
- 在生命周期回调方法中,您可以声明用户离开和再次进入 Activity 时 Activity 的行为方式。例如,如果您正构建流媒体视频播放器,当用户切换至另一应用时,您可能要暂停视频或终止网络连接。当用户返回时,您可以重新连接网络并允许用户从同一位置继续播放视频。换言之,每个回调都支持您执行适合给定状态变更的特定作业。在合适的时间执行正确的作业,并妥善处理转换,这将提升应用的稳健性和性能。例如,良好的生命周期回调实现有助于防止应用出现以下问题:
- 当用户在使用应用时接听来电,或切换至另一应用时崩溃。
- 当用户未主动使用它时,消耗宝贵的系统资源。
- 当用户离开应用并在稍后返回时,丢失用户的进度。
- 当屏幕在横向和纵向之间旋转时,崩溃或丢失用户的进度。
2、Activity生命周期简化图
- 为了在Activity生命周期各个阶段之间导航转换,Activity类提供六个核心回调方法:
onCreate()
、onStart()
、onResume()
、onPause()
、onStop()
和onDestroy()
。当 Activity 进入新状态时,系统会调用其中每个回调方法。
(1)Activity存在与否
- Activity整个生命周期从onCreate()方法开始,到最终调用onDestroy()方法结束。对于Activity的全局资源在onCreate()方法中设置,最终在onDestroy()方法中进行资源回收。
(2)Activity可见与否
- Activity触发onStart()方法后处于可见状态,但未必能与用户进行交互。当Activity完全不可见时,触发onStop()方法。重新可见时,先触发onRestart()方法,再触发onStart()方法。onStart()方法和onStop()方法可以被多次调用。
(3)Activity可交互与否
- Activity在onResume()方法和onPause()方法之间时处于活动状态,此时可以与用户进行交互。
3、Android进程优先级
- 应用程序的生命周期是在Android系统中进程从启动到终止的所有阶段,也就是Android从启动到停止的全过程。Android应用程序的生命周期的终结这个动作并非由应用程序进程本身执行,而是取决于Android系统。那么,系统是根据一个怎样的重要性标准来终止Android应用程序呢?Android根据应用程序的组件以及组件当前运行状态将所有的进程按重要性程度从高到低划分为五个,如下图所示:
(二) Activity生命周期回调方法
1、Activity生命周期回调方法
-
您必须实现此回调,它会在系统首次创建 Activity 时触发。Activity 会在创建后进入“已创建”状态。在 onCreate() 方法中,您需执行基本应用启动逻辑,该逻辑在 Activity 的整个生命周期中只应发生一次。例如,onCreate() 的实现可能会将数据绑定到列表,将 Activity 与 ViewModel 相关联,并实例化某些类作用域变量。此方法会接收 savedInstanceState 参数,后者是包含 Activity 先前保存状态的 Bundle 对象。如果 Activity 此前未曾存在,Bundle 对象的值为 null。
-
如果您有一个生命周期感知型组件与您的 Activity 生命周期相关联,该组件将收到 ON_CREATE 事件。系统将调用带有 @OnLifecycleEvent 注释的方法,以使您的生命周期感知型组件可以执行已创建状态所需的任何设置代码
2、onStart()回调方法
- onCreate() 退出后,Activity 将进入“已启动”状态,并对用户可见。此回调包含 Activity 进入前台与用户进行互动之前的最后准备工作。
3、onResume()回调方法
-
系统会在 Activity 开始与用户互动之前调用此回调。此时,该 Activity 位于 Activity 堆栈的顶部,并会捕获所有用户输入。应用的大部分核心功能都是在 onResume() 方法中实现的。
-
onResume() 回调后面总是跟着 onPause() 回调。
4、onPause()回调方法
-
当 Activity 失去焦点并进入“已暂停”状态时,系统就会调用 onPause()。例如,当用户点按“返回”或“最近使用的应用”按钮时,就会出现此状态。当系统为您的 Activity 调用 onPause() 时,从技术上来说,这意味着您的 Activity 仍然部分可见,但大多数情况下,这表明用户正在离开该 Activity,该 Activity 很快将进入“已停止”或“已恢复”状态。
-
如果用户希望界面继续更新,则处于“已暂停”状态的 Activity 也可以继续更新界面。例如,显示导航地图屏幕或播放媒体播放器的 Activity 就属于此类 Activity。即使此类 Activity 失去了焦点,用户仍希望其界面继续更新。
-
您不应使用 onPause() 来保存应用或用户数据、进行网络呼叫或执行数据库事务。有关保存数据的信息,请参阅保存和恢复 Activity 状态。
-
onPause() 执行完毕后,下一个回调为 onStop()或 onResume(),具体取决于 Activity 进入“已暂停”状态后发生的情况。
5、onStop()回调方法
- 当 Activity 对用户不再可见时,系统会调用 onStop()。出现这种情况的原因可能是 Activity 被销毁,新的 Activity 启动,或者现有的 Activity 正在进入“已恢复”状态并覆盖了已停止的 Activity。在所有这些情况下,停止的 Activity 都将完全不再可见。
- 系统调用的下一个回调将是 onRestart()(如果 Activity 重新与用户互动)或者 onDestroy()(如果 Activity 彻底终止)。
6、onRestart()回调方法
-
当处于“已停止”状态的 Activity 即将重启时,系统就会调用此回调。onRestart() 会从 Activity 停止时的状态恢复 Activity。
-
此回调后面总是跟着 onStart()。
7、onDestroy()回调方法
- 系统会在销毁 Activity 之前调用此回调。
- 此回调是 Activity 接收的最后一个回调。通常,实现 onDestroy() 是为了确保在销毁 Activity 或包含该 Activity 的进程时释放该 Activity 的所有资源。
(三)利用Log类输出信息
- 在调试代码时,需要查看调试信息,就需要用安卓的android.util.Log类,它有5个常用方法。注意:不同打印方法使用时,都带上(String tag, String msg)参数,tag表示打印信息的标签,msg表示需要打印的信息。
1、Log.v()方法
- v:verbose;输出颜色为黑色的,任何消息都会输出,这里的v代表verbose啰嗦的意思,平时使用就是Log.v(“”,“”);
2、Log.d()方法
- d:debug;输出颜色是蓝色的,仅输出debug调试信息,但会输出上层的信息,过滤起来可以通过DDMS的Logcat标签来选择。
3、Log.i()方法
- i:information;输出颜色为绿色,输出一般提示性消息,不会输出Log.v和Log.d的信息,但会显示i、w和e的信息。
4、Log.w()方法
- w:warning;输出颜色为橙色,输出警告信息,一般需要我们注意优化安卓代码,同时选择它后还会输出Log.e的信息。
5、Log.e()方法
- e:error;输出颜色为红色,仅显示红色的错误信息,需要我们认真分析,查找出错原因。
(四)回调方法案例演示
1、创建安卓应用
-
基于
Empty Activity
模板,创建安卓应用-LifeCycle
-
单击【Finish】按钮,完成项目初始化
2、主布局资源文件
- 主布局资源文件 -
activity_main.xml
- 将约束布局改成线性布局,并设置标签控件相关属性
3、字符串资源文件
- 在
strings.xml
文件里修改app_name
变量值,添加新变量test_life_cycle
4、主界面类实现功能
-
在
MainActivity
里定义标记常量AG
-
在onCreate和onDestroy回调方法里输出一条调试信息
-
在onStart和onStop回调方法里输出一条调试信息
-
在onResume和onPause回调方法里输出一条调试信息
- 在onRestart回调方法里输出一条调试信息(在完全不可见⟹完全可见的过程中)
- 查看MainAcitivity源代码
package net.zwq.lifecycle;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends AppCompatActivity {
private final static String TAG = "life_cycle";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "onCreate invoked .");
}
@Override
protected void onStart(){
super.onStart();
Log.d(TAG, "onStart invoked .");
}
@Override
protected void onResume(){
super.onResume();
Log.d(TAG, "onResume invoked .");
}
@Override
protected void onPause(){
super.onPause();
Log.d(TAG, "onPause invoked .");
}
@Override
protected void onStop(){
super.onStop();
Log.d(TAG, "onStop invoked .");
}
@Override
protected void onRestart(){
super.onRestart();
Log.d(TAG, "onRestart invoked .");
}
@Override
protected void onDestroy(){
super.onDestroy();
Log.d(TAG, "onDestroy invoked .");
}
}
5、添加消息过滤器
- 为了更好地查看本应用的调试信息,需要添加消息过滤器。创建消息过滤器
life_cycle_filter
,日志标记为life_cycle
6、启动应用,查看日志
-
启动应用,查看LogCat里的消息(然后我们切换应用状态:前台 ⟹后台⟹前台⟹关闭)
-
单击【Home】键,返回手机应用桌面
-
此时,查看日志消息
-
单击【Overview】键,查看最近应用列表
-
最近打开的应用就是【生命周期】
-
单击在后台运行的【生命周期】应用,其窗口又重回前台,查看日志信息
- 按【Back】按键,其实无法关闭【生命周期】应用
-
应该按【Overview】键,选中【生命周期】应用向上滑动,即可关闭该应用
-
从日志信息可以看出三层架构
- 最外层(onCreate - onDestory)——(存在 - 不存在)
- 中间层(onStart - onStop)—— (可见 - 不可见)
- 最内层(onResume - onPause)—— (可交互 - 不可交互)
三、总结
(一)Fragment所在Activity的生命周期会直接影响Fragment的生命周期,其表现为,Activity的每次生命周期回调都会引发每个Fragment的类似回调。
- 例如,当 Activity 收到 onPause() 时,Activity 中的每个片段也会收到 onPause()。不过从实验来看Activity和Fragment的onPause()到底哪个先执行是没有定论的。
(二)片段还有几个额外的生命周期回调,用于处理与 Activity 的唯一交互,从而执行构建和销毁片段界面等操作。这些额外的回调方法是:
- onAttach()在片段已与 Activity 关联时进行调用(Activity 传递到此方法内)。
- onCreateView()调用它可创建与片段关联的视图层次结构。
- onActivityCreated()当 Activity 的 onCreate() 方法已返回时进行调用。
- onDestroyView()在移除与片段关联的视图层次结构时进行调用。
- onDetach()在取消片段与 Activity 的关联时进行调用。