Activity 从生到死

Posted by Young Ken on 2016-05-31

通过实现回调方法管理 Activity 的生命周期对开发强大而又灵活的应用至关重要。 Activity 的生命周期会直接受到 Activity 与其他 Activity、其任务及返回栈的关联性的影响。
Activity基本有三种状态

  • 运行中
    这个时候的Activity位于前,能得到用户的焦点。
  • 暂停
    另一个Activity位于屏幕前,并且获得用户焦点,但是这个Activity还是看见的。也就是被透明的或者是半遮盖的情况,在内存极端不足的情况下,这个Activity可能被杀死。
  • 停止
    这个Activity被另一个Activity完全遮盖。在内存不足的情况被杀死。

生命周期方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
}

上面是Activity的生命周期方法。

  • 整个生命周期发生在onCreate()和onDestroy()中,在onCreate()中初始化Activity所需要的资源,在onDestroy()中进行释放。
  • 可见生命周期发生在onStart()和onStop()中,在这回时期用户可以与其进行交互。
  • 前台生命周期发生在onResume()和onPause()之间。这个期间用户一直能对这个Activity进行操作,也就是得到这Activity的焦点,当设备休眠或者弹出对话拉框的时候,调用onPuse()。

这个是非常经典的图示,展示的android的Activity的生命周期。

保存 Activity 状态

当Activity处于暂停或者是停止状态的时候,Activity对象仍保持在内存中,当Activity重新处于运行状态的时候,这样继续运行。但是如果内存不足的情况,Activity的内存被释放,这个是时候就没有办法恢复开始时候的状态了,这个时候你就要用到onSaveInstanceState()。
系统会先调用 onSaveInstanceState(),这样销毁Activity,系统会小该方法传递一个Bundle对象。当系统恢复这个Activity的时候,会被Bundle对象传递给onCreate()和onRestoreInstanceState()

注:无法保证系统会在销毁您的 Activity 前调用 onSaveInstanceState(),因为存在不需要保存状态的情况(例如用户使用“返回” 按钮离开您的 Activity 时,因为用户的行为是在显式关闭 Activity)。 如果系统调用 onSaveInstanceState(),它会在调用 onStop() 之前,并且可能会在调用 onPause() 之前进行调用,这个非常重要。

当然了,你也可以设置不保存状态,可以通过android:saveEnabled = “false”,通常不这样设置。

一个Activity启动另一Activity的生命周期

首先一个A启动B,这个时候这时候是A被B完全遮挡,B是一个新的Activity。经过这样的推理B的生命周期非常好预测。

  • B的生命周期是 onCreate(),onStart(),onResume(),这个是一个Activity启动的生命周期。

那么A的生命周期是什么呢?A是一个被B遮盖的过程,也就是在可见生命周期中走了一圈由此推理

  • A的生命周期是onPause(),onStop()。

那问题来了,是在onPause()之前调用B的生命周期还是在之后,是在onPause()之后onStop()之前,这样有人问题A启动B的生命周期就明白了。

既然都分析到这里了,那我们在增加点难度,这个时候按手机返回键,两个Activity的生命周期怎么走。
按返回键的时候B是一个习销毁过程,那么B的生命周期就是

  • B的生命周期onPause(),onStop(),onDestory()。

那A是一个恢复的过程,自然生命周期就是

  • A的生命周期就是onRestart(),onStart(),onResume()。

那问题有来了,是在B销毁之后调用A的恢复吗?当然不是,先调用B的onPause()在调用A的恢复,最后调用B的onStop()和onDestroy()。发现没有发现一个问题,当两个Activity的生命周期进行切换的时候,都是先调用当前Activity的onPause(),然后调用另一Activity的正常生活周期,最后在返回来调用当前Activity剩下的生命周期。

总结一下:当A启动B的时候,先把A暂停(调用onPause()),调用B的剩余生命周期,在返回来调用A剩下的生命周期。

旋转屏幕的生命周期

其实旋转屏幕是一个销毁从新创建的过程,那么就简单了

  • onPause(),onStope(),onDestory()。

重新创建

  • onCreate(),onStart(),onResume()。