系统提供了 6 个回调方法来处理 Activity 生命周期中不同的状态:
onCreate(), onStart(), onResume(), onPause(), onStop(), and onDestroy()
系统杀死一个 APP 进程时,有可能进程依然存在于内存中,这取决于当时 Activity 的状态。
onCreate(Bundle savedInstanceState)
这个方法只在 Acitvity 启动时调用一次,通常用来设置布局视图setContentView()
,和初始化变量。
savedInstanceState 参数记录了上次 Activity 的状态(onSaveInstanceState(Bundle outState)
方法里保存的状态)
恢复状态可以在 onCreate 和 onRestoreInstanceState 里完成。
TextView mTextView;
// some transient state for the activity instance
String mGameState;
@Override
public void onCreate(Bundle savedInstanceState) {
// call the super class onCreate to complete the creation of activity like
// the view hierarchy
super.onCreate(savedInstanceState);
// recovering the instance state
if (savedInstanceState != null) {
mGameState = savedInstanceState.getString(GAME_STATE_KEY);
}
// set the user interface layout for this activity
// the layout file is defined in the project res/layout/main_activity.xml file
setContentView(R.layout.main_activity);
// initialize member TextView so we can manipulate it later
mTextView = (TextView) findViewById(R.id.text_view);
}
// This callback is called only when there is a saved instance that is previously saved by using
// onSaveInstanceState(). We restore some state in onCreate(), while we can optionally restore
// other state here, possibly usable after onStart() has completed.
// The savedInstanceState Bundle is same as the one used in onCreate().
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
mTextView.setText(savedInstanceState.getString(TEXT_VIEW_KEY));
}
// invoked when the activity may be temporarily destroyed, save the instance state here
@Override
public void onSaveInstanceState(Bundle outState) {
outState.putString(GAME_STATE_KEY, mGameState);
outState.putString(TEXT_VIEW_KEY, mTextView.getText());
// call superclass to save any view hierarchy
super.onSaveInstanceState(outState);
}
onStart
这个方法代表 Acitivity 已经准备好进入前台了,可以和用户交互了。通常这里可以放置初始化用户 UI 的代码。
onResume
这个状态下 APP 处于与用户的交互中,并一直保持到失去焦点,例如来电、息屏、用户转到另一个 APP 等。APP 可能会在 Resume 和 Pause 状态之间来回跳转。
onPause
Activity 失去焦点后进入暂停状态,恢复后从新进入 resume 状态。这个方法执行时间应该很短,不应该在这里执行一些耗时的工作,例如保存用户数据、执行网络操作、处理数据库事务等,这些工作可以在 onStop
里完成。该方法完成后,它有可能调用 onResume
或onStop
,取决于 Activity 是被重新恢复或者变得完全不可见。
onStop
这个方法在 Activity 变得不可见,或者 APP 即将终止时调用。在这里可以释放一些 APP 不再需要的资源、保存数据等操作。在这个状态, Acitvity 任然在内存里,因此不需要做数据保存和恢复。系统可能因为需要内存而随时销毁 Activity。这个方法结束后有两个选择:onRestart()
或 onDestroy()
onDestroy
onDestroy 的调用分两种情况:
由于用户完全关闭 Activity,或者 onFinish 被调用。
由于设备配置改变(如旋转方向)临时销毁 Acitvity,然后重建。
通过 isFinishing
方法可以区分这两种情况。第一种情况 onCleared()
会被调用。第二种情况onCreate()
被调用。
Activity 状态与内存释放的关系
Likelihood of being killed | Process state | Activity state |
---|---|---|
Least | Foreground (having or about to get focus) | Created, Started,Resumed |
More | Background (lost focus) | Paused |
Most | Background (not visible) | Stopped, Empty, Destroyed |
系统不会单独释放 Acitvity,而是释放整个 进程。
保护和恢复 UI 状态
ViewModel, onSaveInstanceState()
当系统因内存压力或配置改变而关闭 Acitivity 时会自动保存状态,恢复时自动重建。状态保存在 Bundle 对象里,但它只能保存简单的数据,会占用系统内存,如果要保存大量数据,需要用onSaveInstanceState(), ViewModel class
将数据保存到本地存储。
恢复对象可以在onCreate() 和 onRestoreInstanceState()
里,前置需要判断 Bundle 是否为空,后者不需要,只有系统有 state 要恢复时它才在onStart
之后调用。
从一个 Acitivity 启动另一个 Activity
通过传递一个 Intent 对象给startActivity() 或 startActivityForResult()
创建。
使用startActivityForResult()
创建带返回值的 Acitvity,用 onActivityResult(int, int, Intent)
方法接收结果,在子 Acitvity 中用 setResult(int)
设置返回结果。
public class MyActivity extends Activity {
// ...
static final int PICK_CONTACT_REQUEST = 0;
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
// When the user center presses, let them pick a contact.
startActivityForResult(
new Intent(Intent.ACTION_PICK,
new Uri("content://contacts")),
PICK_CONTACT_REQUEST);
return true;
}
return false;
}
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
if (requestCode == PICK_CONTACT_REQUEST) {
if (resultCode == RESULT_OK) {
// A contact was picked. Here we will just display it
// to the user.
startActivity(new Intent(Intent.ACTION_VIEW, data));
}
}
}
}
一个 Acitvity 打开另一个 Activity 时回调方法执行顺序
- Activity A's onPause() method executes.
- Activity B's onCreate(), onStart(), and onResume() methods execute in sequence. (Activity B now has user focus.)
- Then, if Activity A is no longer visible on screen, its onStop() method executes.