首页 理论教育 深入解析Android Activity生命周期管理

深入解析Android Activity生命周期管理

时间:2023-06-30 理论教育 版权反馈
【摘要】:掌握对话框风格的Activity界面的设计。掌握Activity的生命周期函数调用过程。Activity在这个阶段已经出现在界面中,并且可以和用户进行交互。另外,本实验将通过代码验证Activity生命周期回调函数的调用过程。Main Activity相关配置是默认生成的,仍为启动类,无须修改。

深入解析Android Activity生命周期管理

1.实验目的

(1)熟悉控件Edit Text(输入文本框)、Text View(文本)、Button(按钮)的应用。

(2)掌握styles.xml文件的使用。在styles.xml文件中定义样式,通过样式的复用统一界面风格,减少界面代码量。

(3)掌握对话框风格的Activity界面的设计。

(4)掌握Activity的生命周期函数调用过程。

(5)进一步熟悉不同Activity之间的跳转实现,以及使用Intent传值的方式。

(6)熟练使用Logcat,通过Logcat定义过滤器,查看各类信息。

2.Activity生命周期

Activity生命周期指Activity从启动到最终销毁调用函数的过程,每个函数在Activity的不同阶段被调用,一般根据代码逻辑选择不同的回调函数。图2.29所示为Google公司提供的Android API手册中Activity动态调用的流程图,从中可以看出各个生命周期回调函数被调用的顺序,本实验将通过动态的方式来验证该流程。

图2.29 Activity生命周期调用

(1)onCreate():初始化方法,即对Activity的初始化代码放在该方法中。一般情况下,在该方法中先调用父类的onCreate()方法进行初始化,再使用setContent View()加载布局,然后可以对一些控件和变量进行初始化。动画不应该在该方法中进行初始化。

(2)onStart():Activity可见时调用该方法。与Activity界面绘制相关的代码可以放在该方法中。

(3)onResume():Activity可以接受用户事件时调用该方法。Activity在这个阶段已经出现在界面中,并且可以和用户进行交互。

(4)onPause():当一个Activity被部分遮挡、被完全遮挡或销毁前调用该方法。当从一个Activity跳转到另一个Activity时,只有在前一个Activity执行完onPause()方法后,另一个Activity才会启动。同时,Android中设定如果onPause()方法在500 ms内没有执行完毕,就会强制关闭Activity。

(5)onStop():Activity被完全遮挡或销毁前调用该方法。此时Activity进入停止状态,已经不可见了,但Activity对象还在内存中,没有被销毁,调用该方法主要的工作是做一些资源的回收。

(6)onDestroy():Activity被销毁时调用该方法,可将未释放的资源在该方法中释放。在两种情况下该方法会被调用:程序中调用了finish()方法,该Activity被系统终止。

(7)on Restart():Activity从停止状态进入活动状态时调用该方法。

3.实验界面与功能

该App由两个界面组成:Main Activity和Result Activity。在图2.30所示的界面的两个文本框中输入两个数字,如100和23,单击“计算”按钮,会弹出图2.31所示的Result Activity界面,并且在该界面中会显示100乘以23的结果。另外,本实验将通过代码验证Activity生命周期回调函数的调用过程。

图2.30 Main Activity界面

图2.31 Result Activity界面

4.实验步骤

步骤1:新建工程App03,该工程由两个Activity组成,将该工程默认的Java代码Main Activity.java和布局文件activity_main.xml各复制一份,并分别重命名为Result Activity.java和activity_result.xml,过程和本章的实验2相同。

步骤2:在Android Manifest.xml中注册Result Activity。Main Activity相关配置是默认生成的,仍为启动类,无须修改。

步骤3:打开styles.xml文件,在原来的样式文件中添加新的样式的定义,供布局文件使用。

图2.32 界面编辑器中拖完控件后效果

图2.33 界面编辑器中建完约束后效果

步骤5:在界面编辑器中为每个控件设置外边距。选中要调整的控件,在右侧的“Properties”面板中单击控件外边缘的数字,并设定边距为8像素,如图2.34所示。

图2.34 为控件设定边距

步骤6:对activity_main.xml基本设置完成后,单击“Text”标签打开布局文件的文本编辑器,对该界面控件做如下调整。

(www.xing528.com)

步骤7:按照步骤6中的方法,为布局文件activity_result.xml中默认的Text View标签添加ID属性值“result”,为其设置样式“BaseStyle.Text View”,并修改该Activity的调用类为Result Activity。

步骤8:在strings.xml中增加键值对,供界面使用。

步骤9:打开Main Activity.java文件,对应界面布局在该文件中定义4个成员变量,在onCreate()方法中通过find View ById()方法获取4个控件实例,并对ID为“operator”的文本控件和ID为“calculate”的按钮控件设定显示文本。

步骤10:在Main Activity.java文件中定义一个监听器,该监听器归属的包路径为android.view.View.OnClick Listener,并实现onClick()方法,在该方法中获取用户输入的值,将其保存在Intent中传递给Result Activity.java。

注意:Calculate Listener类是Main Activity的内部类,这里代码所在位置和onCreate()方法是同级的。

步骤11:在Main Activity.java的onCreate()方法中,为“计算”按钮绑定步骤10中定义的监听器。

步骤12:在Result Activity.java中使用activity_result.xml作为布局文件,获取布局中的文本框并定义为result View。通过父类中提供的getIntent()方法获取Main Activity传递过来的Intent,从Intent中获取的Main Activity传递过来的两个值相乘后,放入result View文本框中。

步骤13:打开Main Activity.java文件,加入其他生命周期回调函数,这里的方法无须逐个字母键入,输入方法的关键字后通过快捷键“Alt+/”便可快速完成代码部署。在每个生命周期回调函数中通过自带的Log类(需要引入android.util.Log包)将各方法名记入日志,日志级别是“Info”。

步骤14:参照步骤13,打开Result Activity.java文件,将所有生命周期回调函数全部加入该类中,并在每个生命周期回调函数中通过Log类将类名和各自方法名记入日志,日志级别同样为“Info”。

步骤15:运行该程序,在图2.30所示窗口的两个文本框中输入两个整数,点击“计算”按钮,在图2.31所示的界面中会显示结果,点击底部的返回按钮将回到图2.30所示的界面。然后,打开Android Studio底部的“Android Monitor”,选择“logcat”标签页,单击右侧的下拉列表,选择“Edit Filter Configuration”选项,如图2.35所示。

图2.35 使用Logcat过滤器

步骤16:在随后出现的图2.36所示的窗口中可以输入过滤器的名称(Filter Name);日志标签(Log Tag)是日志的键值,步骤13中定义的键值为“APP03”,所以这里输入“APP03”;日志信息(Log Message)处可以根据日志的内容进行查找,这里可以不输入或者输入希望查找日志的内容特征;包路径(Package Name)处可以根据应用程序的包路径进行查找;PID是应用程序所在进程的ID,从图2.36中可以看出该应用程序的ID为4868;日志级别(Log Level)有Verbose、Debug、Info、Warn、Error、Assert这6种。单击左边的按钮可以增加一个过滤器,单击按钮可删除选中的过滤器。这里可以仅输入日志标签,根据日志标签“APP03”过滤出生命周期回调函数的日志,单击“OK”。

图2.36 定义Logcat过滤器

步骤17:图2.37显示了生命周期回调函数中的日志。从日志中可以看出,Activity生命周期回调函数的动态过程与图2.29中描述的一致:

•当启动第一个Activity时,按顺序调用了Main Activity的onCreate()、onStart()、on Resume()方法;

•点击“计算”按钮后,先调用了Main Activity的onPause()方法进入暂停状态,然后先后调用了Result Activity的onCreate()、onStart()、on Resume()方法;

•点击返回按钮后,先调用了Result Activity的onPause()方法进入暂停状态,然后调用了Main Activity的on Resume()方法恢复暂停的第一个Activity,又调用了onStop()和onDestroy()方法进行销毁。

图2.37 生命周期回调函数日志

知识拓展:Logcat日志工具

(1)Logcat是Android Studio自带的日志工具,除了可以按照本实验步骤16中定义的过滤器进行过滤,Logcat还可以根据日志级别进行过滤,不同级别过滤出来的日志结果如下所述。

•Verbose:过滤输出所有调试信息,包括Verbose、Debug、Info、Warn、Error。

•Debug:调试信息过滤器,输出Debug、Info、Warn、Error调试信息,一般供程序员打印调试信息时使用。

•Info:一般信息过滤器,输出Info、Warn、Error调试信息。

•Warn:告警信息过滤器,输出Warn和Error调试信息。

•Error:错误信息过滤器,只输出Error调试信息。

(2)在编写Android的代码时,可以使用Log.v()、Log.d()、Log.i()、Log.w()、Log.e()方法在程序中打印Verbose、Debug、Info、Warn、Error类型的日志。

思考

(1)模仿Windows自带的计算器,如何实现?

(2)在步骤2中,如果将Result Activity在Android Manifest.xml文件中注册时的“android:theme="@style/Theme.AppCompat.Dialog"”属性值删除,那么对生命周期回调函数有什么影响?请通过实验进行验证。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈