Activity的生命周期之Pause和Resume
- 在一个app的运行期间,前台的activity有时可能会被其他的视图组件打断,然后进入pause状态。
- 比如打开一个半透膜的activity (比方一个dialog风格的activity),前一个activity就会进入pause。
- 其实这个时候前一个activity是部分可见的,只是被后来的视图组建挡住了而 失去焦点,这种情况下,失去焦点的activity就处于pause状态。
- 但是,当一个activity被打断,并且完全不可见时(即使没被挡住也看不到),这时activity就是处于stops状态。
注:当activity收到onPause()命令的时候, 暗示着这个activity会暂停一会儿,用户可能会再次回到这个activity。但是实际情况中, 用户离开一个应用的第一个先兆也是暂停某个activity,很可能是真的要离开了.
图 1.当一个半透明的activity挡住了你的activity,系统将会调用onPause()方法,同时这个activity在pause 阶段(1)等待。如果用户回到activity的时候还是pause状态,系统将会调用onResume()(2).
暂停(pause)你的Activity
- 当系统调用activity的onPause()时, 虽然从技术角度来讲你的activity是可见的,但是更通常这也预示着用户会离开这个activity,然后你的activity会进入stop状态。
基于这种实际情况,通常你应该在onPause()方法里面做如下事情(应该这样做,但不强制,你可以什么也不做-译者注):
停止一切动画效果,或者其他消耗cpu的行为
在离开之前提交未被保存改动,你应该只保存那些用户认为应该保存的数据,比如在邮箱应用中,用户正在向文本输入框中写入文字,那么这种改动 被保存下来才显得合理
释放系统资源,比如广播接受者,传感处理器(gps等),或者其他影响电池消耗的东西,因为在pause状态下用户并不需要他们
比如你的应用在使用Camera,那么onPause()方法是你释放它的好地方:1
2
3
4
5
6
7
8
9
10@Override
public void onPause() {
super.onPause(); // Always call the superclass method first
// Release the Camera because we don't need it when paused
// and other activities might need to use it.
if (mCamera != null) {
mCamera.release()
mCamera = null;
}
}一般来说,你不要在onPause()中保存用户的改动(比如用户正在填写的私人信息的表格),只有当你确信用户希望自己修改的东西被保存的时候 ,比如刚刚提到的用户在写一封邮件的草稿。另外,在onPause中要避免发生cpu敏感的行为,比如写入数据库,这会影响切换到下一个activity的显示效果。
总之,在onPause中的操作都应该是非常简单的,低性能消耗的,确保在onStop()被调用时,用户向其他界面的切换是迅速流畅的。
注:当activity处于pause状态的时候,activity的实例继续常驻在内存中,当onresume发生的时候被重新调用。 你不需要重新初始化在onResume之前的任何阶段创建的控件
Resume 你的 Activity
当用户从pause状态回到activity,系统将会调用onResume()方法。
值得注意的是每次activity回到前台显示的时候onResume方法都会被调用,即使在第一次启动activity的时候也是如此。所以,你应该实现onResume() 来初始化你在onPause()中释放了资源的控件,同时主动触发activity在进入resume状态的时候会发生的其他所有初始化(比如在activity获得用户焦点的时候动画效果和控件的初始化)。
下面的onResume()方法的具体实现是和前面提到的camera例子中的onPause()方法相对应的。在onPause()中我们释放了camera资源,当activity 重新回来的时候我们应该在onResume()中重新初始化它。
1
2
3
4
5
6
7
8@Override
public void onResume() {
super.onResume(); // Always call the superclass method first
// Get the Camera instance as the activity achieves full user focus
if (mCamera == null) {
initializeCamera(); // Local method to handle camera init
}
}