Android官方培训课程学习(二): 管理activity的生命周期

原创 2016年08月30日 14:24:06

Android官方培训课程学习第二部分,主要包括:

  1. activity的生命周期
  2. 销毁Activity
  3. 保存Activity状态
  4. 恢复Activity状态

activity的生命周期
activity的生命周期

生命状态中只有三个状态是静态的,这三个状态下activity可以存在一段比较长的时间。(其它几个状态会很快就切换掉,停留的时间比较短暂)

  • Resumed:该状态下,activity处在前台,用户可以与它进行交互。(通常也被理解为”running” 状态)
  • Paused:该状态下,activity的部分被另外一个activity所遮盖:另外的activity来到前台,但是半透明的,不会覆盖整个屏幕。被暂停的activity不再接受用户的输入且不再执行任何代码。
  • Stopped:该状态下, activity完全被隐藏,对用户不可见。可以认为是在后台。当stopped,activity实例与它的所有状态信息(如成员变量等)都会被保留,但activity不能执行任何代码。

其它状态 (Created与Started)都是短暂的,系统快速的执行那些回调函数并通过执行下一阶段的回调函数移动到下一个状态。也就是说,在系统调用onCreate(), 之后会迅速调用onStart(), 之后再迅速执行onResume()。

销毁Activity

activity的最后一个回调是onDestroy().当收到需要将该activity彻底移除的信号时,系统会调用这个方法。

大多数 app并不需要实现这个方法,因为局部类的references会随着activity的销毁而销毁,并且我们的activity应该在onPause()与onStop()中执行清除activity资源的操作。然而,如果activity含有在onCreate调用时创建的后台线程,或者是其他有可能导致内存泄漏的资源,则应该在OnDestroy()时进行资源清理,杀死后台线程。

@Override
public void onDestroy() {
    super.onDestroy();  // Always call the superclass

    // Stop method tracing that the activity started during onCreate()
    android.os.Debug.stopMethodTracing();
}

Note: 除非程序在onCreate()方法里面就调用了finish()方法,系统通常是在执行了onPause()与onStop() 之后再调用onDestroy() 。在某些情况下,例如我们的activity只是做了一个临时的逻辑跳转的功能,它只是用来决定跳转到哪一个activity,这样的话,需要在onCreate里面调用finish方法,这样系统会直接调用onDestory,跳过生命周期中的其他方法。

保存Activity状态

当我们的activity开始Stop,系统会调用 onSaveInstanceState() ,Activity可以用键值对的集合来保存状态信息。这个方法会默认保存Activity视图的状态信息,如在 EditText 组件中的文本或 ListView 的滑动位置。

为了给Activity保存额外的状态信息,你必须实现onSaveInstanceState() 并增加key-value pairs到 Bundle 对象中,例如:

static final String STATE_SCORE = "playerScore";
static final String STATE_LEVEL = "playerLevel";
...

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    // Save the user's current game state
    savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
    savedInstanceState.putInt(STATE_LEVEL, mCurrentLevel);

    // Always call the superclass so it can save the view hierarchy state
    super.onSaveInstanceState(savedInstanceState);
}

注意: 必须要调用 onSaveInstanceState() 方法的父类实现,这样默认的父类实现才能保存视图状态的信息。

恢复Activity状态

当Activity从Destory中重建,我们可以从系统传递的Activity的Bundle中恢复保存的状态。 onCreate() 与 onRestoreInstanceState() 回调方法都接收到了同样的Bundle,里面包含了同样的实例状态信息。

由于 onCreate() 方法会在第一次创建新的Activity实例与重新创建之前被Destory的实例时都被调用,我们必须在尝试读取 Bundle 对象前检测它是否为null。如果它为null,系统则是创建一个新的Activity实例,而不是恢复之前被Destory的Activity。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); // Always call the superclass first

    // Check whether we're recreating a previously destroyed instance
    if (savedInstanceState != null) {
        // Restore value of members from saved state
        mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
        mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
    } else {
        // Probably initialize members with default values for a new instance
    }
    ...
}

我们也可以选择实现 onRestoreInstanceState() ,而不是在onCreate方法里面恢复数据。
onRestoreInstanceState()方法会在 onStart() 方法之后执行. 系统仅仅会在存在需要恢复的状态信息时才会调用 onRestoreInstanceState() ,因此不需要检查 Bundle 是否为null。

public void onRestoreInstanceState(Bundle savedInstanceState) {
    // Always call the superclass so it can restore the view hierarchy
    super.onRestoreInstanceState(savedInstanceState);

    // Restore state members from saved instance
    mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
    mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Android 插件化原理解析——Activity生命周期管理

之前的 Android插件化原理解析 系列文章揭开了Hook机制的神秘面纱,现在我们手握倚天屠龙,那么如何通过这种技术完成插件化方案呢?具体来说,插件中的Activity,Service等组件如何在A...
  • huangkun125
  • huangkun125
  • 2016年08月11日 16:39
  • 1066

Android之Activity生命周期浅析(一)

Activity作为四大组件之一,出现的频率相当高,基本上我们在android的各个地方都能看见它的踪影,因此深入了解Activity,对于开发高质量应用程序是很有帮助的。今天我们就来详细地聊聊Act...
  • javazejian
  • javazejian
  • 2016年07月17日 15:31
  • 25342

Unity 2D 游戏开发 官方视频学习顺序

按照我觉得的观看先后顺序吧:1)Unity 2D 游戏开发官方初学者教程1~15:这个系列第一集是整体介绍,适合先看下,后...
  • hack_tian
  • hack_tian
  • 2017年11月28日 10:50
  • 341

Activity 生命周期 ——各种情况测试

首先上个官方图:http://developer.android.com/reference/android/app/Activity.html 程序两个Activity: ...
  • qiantujava
  • qiantujava
  • 2014年03月21日 14:54
  • 2396

Android:聊聊 MVP 中 Presenter 的生命周期

问题背景 前几天写了篇 MVP 入门级的文章,文章结尾有个疑问没有解决,如何避免 Presenter 内存泄漏情况的发生?我查看了一些资料后,发现这个问题可以转成另外一个问题,如何保证 Pre...
  • osle123
  • osle123
  • 2016年10月08日 12:25
  • 2074

SAP Hybris培训-标准课程/企业内训

SAP Hybris培训-标准课程   Hybris标准课程,主要包含hybris Commerce Product Overview、SAP Hybris CommerceCockpit End...
  • eala2016
  • eala2016
  • 2016年11月14日 14:44
  • 945

AWS官方培训课程介绍

AWS的课堂培训课程是指由AWS公司的专业讲师讲授的短期课程,而且一般会在课程中给学员提供动手实验练习。AWS的培训课程是根据用户工作的角色来设计和划分,其目前主要分为:解决方案架构师(Solutio...
  • u012365585
  • u012365585
  • 2014年03月10日 10:48
  • 8124

Android 监听各个Acitivity的生命周期

Android Application 监听Activity生命周期
  • csm_qz
  • csm_qz
  • 2016年03月21日 15:23
  • 677

Android之Activity生命周期的浅析(二)

上一篇文章,我们主要分析了Activity的正常情况下生命周期及其方法,本篇主要涉及内容为Activity的异常情况下的生命周期。Activity异常生命周期  异常的生命周期是指Activity被系...
  • javazejian
  • javazejian
  • 2016年07月17日 15:32
  • 4971

AMS对Activity的管理

转载地址:http://blog.csdn.net/huanxido/article/details/7913783 一、Activity的生命周期 Activity的管理同样是基于C/S...
  • u010753159
  • u010753159
  • 2016年09月19日 17:19
  • 466
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android官方培训课程学习(二): 管理activity的生命周期
举报原因:
原因补充:

(最多只允许输入30个字)