你好,游客 登录 注册 搜索
背景:
阅读新闻

[Android Training视频系列]2.2 Pausing and Resuming an Activity -

[日期:2013-04-14] 来源:  作者: [字体: ]

1.主要内容
本讲介绍onPause和onResume,主要分析了在onPause函数中应该执行哪些操作。

2.视频讲解

http://www.eyeandroid.com/thread-11291-1-1.html

3.翻译参考

在正常的程序使用中,处于前台运行的activity有时会被另外一些可见的组件遮挡,从而造成activity被暂停。比如,一个半透明的activity(类似一个对话框)被打开,先前那个activity就会被暂停。虽然这个activity还有部分可见,但是当前的焦点不在这个activity上,因此它保持在paused状态。

 
不过,一旦这个activity被全部遮挡,处于不可见的状态,那么它就是被停止了。(下个教程讨论)
 
如果你的activity要进入paused状态,系统会调用你的activity种的onPause()方法,这个方法让你能够暂停那些不应该继续运行的行为(比如暂停视频播放),或者保存那些应该永久保存的用户数据。一旦用户从paused状态返回,系统能够调用onResume()方法恢复以前的运行。
 
提示:当activity接收调用onPause()时,这可能表明activity要暂时进入paused状态,用户可能马上就重新获得activity的焦点。但是,它也是用户离开这个activity时会调用的第一个方法。
basic-lifecycle-paused.png
图解:当一个半透明的activity覆盖你的activity时,系统调用onPause(),activity就会在Paused状态中等待(1)。系统调用onResume()方法返回activity。
 
暂停你的activity

当系统调用onPause()方法的时候,技术上说明activity还是能部分可见的,但是大部分情况表明用户要离开activity,它将进入Stopped状态。你通常使用onPause()函数做下面的事:
  • 停止消耗cpu的动画或者运行中的动作。
  • 提交未保存的更改,但是只是保存用户离开后期望永久保存的东西(比如邮件草稿)。
  • 释放系统资源,比如广播接收器,传感器(比如GPS),或者消耗电量的资源,这些资源是activity暂停后用户不再需要的。
例如,如果你的程序需要使用摄像头,onPause()方法中是释放它的好地方。

 
  1. @Override  
  2. public void onPause() {  
  3.     super.onPause();  // 通常先调用父类方法  
  4.   
  5.     // 释放摄像头资源  
  6.     if (mCamera != null) {  
  7.         mCamera.release()  
  8.         mCamera = null;  
  9.     }  
  10. }  

通常情况下,你不需要使用onPause()方法储存用户的修改(比如填写信息的表单)到固定存储器。只有在用户真的期望自动保存数据(比如邮件草稿)的时候才需要在onPause()方法中保存。你应该尽量避免在onPause()方法中让CPU进行密集的工作,比如写入数据到数据库,因为这样会减慢你进入下一个activity的速度(你应该在onStop()中执行这些高负载的关闭操作)。
 
如果你的activity确实需要被停止话,你应该保持你onPause()方法尽量的简单,这样能够保证快速的转换到用户的下一个目的地。
 
提示:当你的activity已经被paused,这个activity实例会被保持在内存中,当activity需要被恢复的时候被调用。你不需要再重新初始化组件。
 
恢复你的activity

当用户从Paused状态恢复你的activity的时候,系统调用onResume()函数。
 
需要了解的是activity每次进入前台都会调用这个方法,包括activity被第一次创建的时候。这样的话,你必须在onResume()方法中初始化那些onPause()中释放的组件,并且执行任何需要在Resumed状态中需要的初始化工作。(比如开始动画和初始化activity前台状态需要的组件)
 
下面的例子和上面onPause()的例子相对应,这里初始化暂停时释放的摄像头资源。
 
  1. @Override  
  2. public void onResume() {  
  3.     super.onResume();  // 调用父类方法  
  4.   
  5.     // 当activity取得用户焦点时取得摄像头实例  
  6.     if (mCamera == null) {  
  7.         initializeCamera(); // 摄像头初始化的本地方法  
  8.     }  
  9. }  





收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻