The Activity Lifecycle

系统提供了 6 个回调方法来处理 Activity 生命周期中不同的状态:
onCreate(), onStart(), onResume(), onPause(), onStop(), and onDestroy()

image

系统杀死一个 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里完成。该方法完成后,它有可能调用 onResumeonStop,取决于 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 时回调方法执行顺序

  1. Activity A's onPause() method executes.
  2. Activity B's onCreate(), onStart(), and onResume() methods execute in sequence. (Activity B now has user focus.)
  3. Then, if Activity A is no longer visible on screen, its onStop() method executes.

你可能感兴趣的:(The Activity Lifecycle)