Android编程权威指南(第二版)第三章-Activity的生命周期
每个Activity实例都有其生命周期。在其生命周期内, activity在运行、暂停和停止三种可
能的状态间进行转换。每次状态发生转换时,都有对应的Activity方法将状态改变的消息通知
给activity。图3-1显示了activity的生命周期、状态以及状态切换时系统调用的方法。

我们已经熟悉了这些方法中的onCreate(Bundle)方法。在创建activity实例后,但在此实例
出现在屏幕上之前, Android操作系统会调用该方法。
通常, activity通过覆盖onCreate(...)方法来准备以下用户界面相关的工作:
实例化组件并将组件放置在屏幕上(调用setContentView(int)方法) ;
引用已实例化的组件;
为组件设置监听器以处理用户交互;
访问外部模型数据。
千万不要自己去调用onCreate(...)方法或任何其他Activity生命周期方法,记住这一点
很重要。我们只需在activity子类里覆盖这些方法, Android会适时去调用它们。
Point 1.输出日志 LogCat工具
private static final String TAG = "你的activity类名";
//标记这个类的tag,加入到Lod输出中便于定位调试信息的位置,也可用于删选调试信息
Log.d(TAG, "onCreate(Bundle) called" );
//调用Log.d(...)方法记录日志信息,进入到调用的方法时,可以在LogCat中看到这些信息
Point 2.设备旋转与activity的生命周期
旋转设备会改变设备配置(device configuration)。在旋转设备时,只要设备配置发生了改变, Android就会销毁当前activity,然后再创建新的activity。当然OnCreat等等的方法都会重新被调用。另外,虽然在应用运行中也会发生可用键盘或语言的改变,但设备屏幕方向的改变最为常见。
设备旋转时,还可以设计水平模式布局使界面更加美观。在项目工具窗口中,右键单击res目录后选择New → Android resource directory菜单项。创建资源目录界面列出了资源类型及其对应的资源特征,如图3-9所示。从资源类型(Resource type)列表中选择layout,保持Source Set的main选项不变。接下来选中待选资源特征列表中的Orientation,然后单击>>按钮将其移动至已选资源特征区域。最后,确认选中Screen Orientation下拉列表中的Landscape选项,并确保目录名显示为layout-land,如图3-10所示。点击OK按钮让Android Studio创建res/layout-land。
Point 3.解决设备旋转丢失数据的问题
在设备运行中发生配置变更时,如设备旋转,需采用某种方式保存以前的数据。覆盖以下
Activity方法就是一种实现方式:
protected void onSaveInstanceState(Bundle outState)
该方法通常在onPause()、 onStop()以及onDestroy()方法之前由系统调用。
第一步定义一个键
private static final String KEY_INDEX = "index";
第二步重写onSaveInstanceState,用键把变量值保存到bundle中
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
Log.i(TAG, "onSaveInstanceState");//日志,可以不要
savedInstanceState.putInt(KEY_INDEX, 你要保存的值);
}
第三步onCreate(...)方法中检查存储的bundle信息,得到传送的值
if (savedInstanceState != null) {
值要保存的地方= savedInstanceState.getInt(KEY_INDEX, 0);
}
基于用户体验考虑, Android从不会为了回收内存,而去销毁正在运行的activity。 activity只
有在暂停或停止状态下才可能会被销毁。此时,会调用onSaveInstanceState(...)方法。调用onSaveInstanceState(...)方法时,用户数据随即被保存在Bundle对象中。然后操作系统将Bundle对象放入activity记录中。
POINT 3.activity周期之暂停状态
activity暂存后, Activity对象不再存在,但操作系统会将activity记录对象保存起来。这样,
在需要恢复activity时,操作系统可以使用暂存的activity记录重新激活activity。
注意, activity进入暂存状态并不一定需要调用onDestroy()方法。不过, onPause()和onSaveInstanceState(...) 通常是我们需要调用的两个方法 .常见的做法是,覆盖onSaveInstanceState(...)方法,将数据暂存到Bundle对象中,覆盖onPause()方法处理其他需要处理的事情。

有时, Android不仅会销毁activity,还会彻底停止当前应用的进程。不过,只有在用户离开
当前应用时才会发生这种情况。即使这种情况真的发生了,暂存的activity记录依然被系统保留着,以便于用户返回应用时activity的快速恢复。用户按了后退键后,系统会彻底销毁
当前的activity。此时,暂存的activity记录同时被清除。此外,系统重启或长时间不使用activity
时,暂存的activity记录通常也会被清除。
Point 4.more about 日志记录
使用android.util.Log类记录日志信息,不仅可以控制日志的内容,还可以控制用来区分
信息重要程度的日志级别。 Android支持如图所示的五种日志级别。每一个级别对应着一个
Log类方法。要输出什么级别的日志,调用对应的Log类方法就可以了。

需要说明的是,所有的日志记录方法都有两种参数签名: string类型的tag参数和msg参数;
除tag和msg参数外再加上Throwable实例参数。 附加的Throwable实例参数为应用抛出异常时记录异常信息提供了方便。
(两种日志使用例子)


浙公网安备 33010602011771号