android activity lifecycle (doc)

发表于:,更新于:,By Sally
大纲
  1. 1. 暂停(pause your activity)
    1. 1.1. 一般在onPause()方法中,应该做一下几件事:
  2. 2. 重新开始(resume your activity)
  3. 3. 停止和重启(stopping and restarting an activity)
    1. 3.1. 以下3种情况下,你的activity会stopped, restarted
    2. 3.2. stop your activity
  4. 4. 重新创建(recreating an activity)
    1. 4.1. 保存activity的状态(save your activity state)
    2. 4.2. 恢复activity的状态(restore your activity state)

暂停(pause your activity)

一般在onPause()方法中,应该做一下几件事:

  • 停止动画以及一些消耗cpu的操作

  • 提交未保存的改动;那些在用户离开时,希望持久化的但是尚未保存的改动,例如:邮件草稿

  • 释放系统资源,例如:广播、传感器(gps)、其他用户不需要且影响系统电量的资源

1
2
3
4
5
6
7
8
9
10
// 官方示例:camera
@override
public 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()中持久化数据,除非你确定用户期望持久化。但是绝对不能在onPause()方法中执行消耗cpu的工作,如写入数据库,它会延缓用户进入下一个activity。应该在onStop()方法中做这些事

重新开始(resume your activity)

  • onResume()方法中初始化在onPause()方法中释放的组建

  • 初始化其他一些在resumed state需要执行的操作,例如:开始动画,一些activity获得用户焦点时需要的组建

1
2
3
4
5
6
7
8
9
// 官方例子:初始化在onPause()方法中释放的camera
@override
public 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();
}
}

停止和重启(stopping and restarting an activity)

以下3种情况下,你的activity会stopped, restarted

  • 用户从当前app进入到另一个app,当前app的前台activity就stopped。如果用户通过home页面的app图标或者最近打开的app窗口回到你app的activity,那activity就restart了

  • 在同一个app中,用户从当前activity进入到另一个activity,则当前activity就stopped,如果用户通过back button回到前一个activity,那activity就restart了

  • 在使用app的过程中,接电话

stop your activity

  • 当app stopped以后,如果system需要内存时,就会destroy activity的实例

  • 极端情况:系统只是简单的kill了app的进程,并没有调用onDestroy()方法,为了防止内存泄漏,手动调用onStop()方法是很必要的

  • 尽管在onStop()方法之前会调用onPause()方法,但是你仍需要在onStop()方法中执行一些大的,消耗的cpu的操作,比如写入数据到数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 官方案例:
@override
protected void onStop() {
super.onStop(); // always call the superclass method first
// save the note's current draft, because the activity is stopping and we want to be sure the current note progress isn't lost
ContentValue values = new ContentValue();
values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText());
values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle());
getContentResolver().update(
mUri, // the url for the note to update
values, // the map of column names and new values to apply to them
null, // no select criteria are used
null, // no where columns are used
);
}

重新创建(recreating an activity)

  • destroy activity: 当使用back button 或者 调用finish()方法结束activity,这种情况的销毁,系统认为activity instance已经销毁

  • destroy activity: 长时间在后台不运行的activity,且系统需要内存,这种情况的系统强制销毁,尽管activity instance已经不在了,但是系统仍然认为它存在,当你使用导航再次回到该activity时,系统会创建一个new instance使用之前存储的数据

注意:当屏幕旋转时,activity会经过destroyed 和 recreated两个过程。当横竖屏切换时,activity可能需要重新加载可选的资源文件

  • onSaveInstanceState() onRestoreInstanceState() onCreate() Bundle

保存activity的状态(save your activity state)

  • 在activity准备停止stop时,系统会调用onSaveInstanceState()方法,你可以使用key-value键值对保存一些信息。默认的,该方法会存储view的层级结构,listview的滑动位置,edittext的文字等。如果需要额外的信息,就需要Bundle对象
1
2
3
4
5
6
7
8
9
10
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);
}

恢复activity的状态(restore your activity state)

  • 可以在onCreate()方法中恢复
1
2
3
4
5
6
7
8
9
10
11
@override
protected void onCreate(Bundle savedInstanceState) {
super.oncreate(savedInstanceState);
// 判断是否存过
if(savedInstanceState != null) {
// 恢复之前存取的数据
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}
// 重新创建
}
  • 也可以在onRestoreInstanceState()方法中恢复,该方法在onStart()之后进行
1
2
3
4
5
6
7
@override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// always call the superclass so ite can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
mCurrentLevel = savedInstanceState.getInt(STATE_LEVEL);
}