Activity生命周期管理之二——Pausing或者Resuming一个Activity

来源:互联网 发布:ubuntu安装步骤失败 编辑:程序博客网 时间:2024/05/21 09:59

app使用期间,前台Activity经常被其他的可视组件遮挡,进入paused状态,例如一个对话框弹出时,只要Activity部分可见,但没获得焦点,就处在paused状态

然而,一旦Activity完全不可见,就处在stopped状态

当Activity进入paused状态时,系统调用onPause()方法,其中你可以停止一些任务,或者保存一些数据防止用户其后又退出,如果用户又返回,可以调用onResume()方法脱离paused状态

Note: 当Activity接到一个onPause()调用时,可能预示着用户是暂时离开,还会回来,也通常是用户离开时的第一个提示

 

Pause你的Activity

当Activity接到一个onPause()调用,技术上意味着Activity部分可见,但通常表示用户离开这个Activity,即将进入stopped状态,在onPause()中,通常要做一下事情:

  • 停止动画或者其他正在进行的耗费CPU的动作
  • 提交未保存的变化,但是只有在用户认为数据应该被保存的时候,例如邮件的草稿
  • 释放系统资源,例如broadcast receivers, 传感器句柄(例如GPS),或者其他影响电池电量而用户有不用的资源

例如,使用照相机,在onPause()中就可以关掉

@Overridepublic 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()中关闭CPU敏感的资源,像database connection,会延缓Activity之间的转换,他们最好在onStop()中实现

如果Activity将要进入Stopped状态,在onPause()中就要相对简单的完成操作以使用户能尽快转到下一个Activity,免得影响用户体验

Note: Activity处于paused状态时,Activity的实例还在内存中存在,回到Resumed状态时不需要重新初始化

Resume你的Activity

从paused状态到resumed状态调用onResume()

只要Activity到前台就要调用onResume()方法,包括第一次创建Activity,所以在onRe()方法中要初始化onPause()中释放的组件和其他每次进入resumed状态要实现的动作,例如动画或者只有在获得用户焦点才需要初始化的组件

例如,下面的例子初始化在onPause()中释放的Carema

@Overridepublic 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    }}