首页 » Android程序设计:第2版 » Android程序设计:第2版全文在线阅读

《Android程序设计:第2版》Fragment生命周期

关灯直达底部

正如到目前为止所描述的,如果你运行这个应用并在运行时旋转屏幕,你会发现每当屏幕旋转时,显示的日期会发生变化。旋转屏幕导致应用被销毁并重新创建。每次旋转屏幕时,这个示例应用的所有状态都会丢失。

注意:这是测试你的应用的一种非常好的方式。按下Ctrl+F11键会使模拟器旋转90°。为了响应这个旋转操作,Android启动了几乎在整个生命周期都会一直存在的一个活动。通过这个按键,你的测试可以覆盖到大部分的代码!

在这个简单的示例应用中,状态丢失没有什么影响。但是,对于实际应用,一般不允许丢失状态。例如,在查看某个Web页面时,如果旋转手机为横向模式后导致浏览器回到主页将会显得非常烦人。

可以对应用执行两个小小的修改以使其能够保存住状态。首先,覆盖DateTime fragment的方法onSaveInstanceState以保存其状态。其次,改变onCreate方法以恢复之前保存的状态。正如在P84“活动生命周期”一节中所讲的,当挂起一个fragment时,Android框架会为前一个方法提供Bundle对象。当重新构建被挂起的fragment副本时,它会提供该bundle给onCreate方法。

以下是为了支持状态保存所修改的两个方法:


@Overridepublic void onCreate(Bundle state) {    super.onCreate(state);    if (null != state) { time = state.getString(TAG_DATE_TIME); }    if (null == time) {        time = new SimpleDateFormat("d MMM yyyy HH:mm:ss")            .format(new Date);    }}@Overridepublic void onSaveInstanceState(Bundle state) {    super.onSaveInstanceState(state);    state.putString(TAG_DATE_TIME, time);}  

就是这么简单。对于这个版本的程序,在其生命周期内运行它不会再发生状态丢失。顺便提一下,因为变量time(一般来说,对于任何的fragment状态)是在onCreate方法中初始化的,所以不能把它声明为final类型。这使得使用构造函数初始化fragment状态没有太大意义,这也和之前提到的Android开发文档建议的Fragment子类不要有任何显式的构造函数一致。

Android开发文档介绍了完整的fragment生命周期。然而,还有一个生命周期回调方法值得特别关注:onPause。onPause方法之所以重要是因为它在活动中很重要。应用要在Android环境中良好工作,当该应用不可见时,就不应该执行操作(占用CPU、消耗电池等)。当某个fragment变得不可见时,Android环境会调用这个fragment的onPause方法。在这个方法中,fragment应该释放其持有的所有资源,中止它所启动的任何长时间运行的进程等。