Activity生命周期

362 阅读4分钟

最基本三对六个核心回调方法

  • onCreate/onDestroy

  • onStart/onStop onStart后可见,onStop后不可见

  • onResume/onPause onResume后可交互,onPause后不可交互

注:文档上说,onStart后可见,但实践证明,即使到onResume扔不可见(可以在onResume中执行长时间的代码来验证),当调用onWindowFocusChanged时UI才可见。

阿里巴巴Android开发手册说onAttachedToWindow()时,Activity 会与它的 Window 关联,这时UI才会开始绘制,在 Activity#onWindowFocusChanged() 时,UI 才变成可交互状态,可以提示用户使用。

onResume

动态注册广播registerReceiver

onPause

适合做: 停止动画或者是其他正在运行的操作,那些都会导致CPU的浪费; 提交没有保存的改变,但是仅仅是在用户离开时期待保存的内容(such as a draft email); 释放系统资源,例如broadcast receivers(unregisterReceiver), sensors (like GPS), 或者是其他任何会影响到电量的资源。 例如, 如果你的程序使用Camera,onPause()会是一个比较好的地方去做那些释放资源的操作。

不适合做: 耗时较长的工作。因为前一个Activity的onPause方法执行结束后才会执行下一个Activity的onCreate方法,所以在 onPause 方法中不适合做耗时较长的工作,这会影响到页面之间的跳转效率。

onCreate

示范代码

TextView textView;

// some transient state for the activity instance
String gameState;

@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) {
        gameState = 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
    textView = (TextView) findViewById(R.id.text_view);
}

onWindowFocusChanged(boolean hasFocus)

一个Activity启动后onCreate、onStart、onResume等过程后,Activity并不是真正可见的,只有当 onWindowFocusChanged 方法最后调用并且参数为true的时候Activity才是真正的可见,这个时候才可以和用户进行交互。

我们可以这 onWindowFocusChanged 可以做一些事情。比如, 获取布局中的控件的尺寸。

保存和恢复实例状态

onSaveInstanceState/onRestoreInstanceState savedInstanceState可能性有这么几种情况: 1.当用户按下Home键时; 2.长按Home键,选择运行其他的程序时; 3.按下电源键(关闭屏幕显示)时; 4.从Activity A启动一个新的Activity时; 5.屏幕方向切换时,如从横屏切换到竖屏; 6.电话打入等情况发生时;

// 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) {
    // 总是调用超类,以便它可以恢复视图层次超级??
    super.onRestoreInstanceState(savedInstanceState);
// 系统onRestoreInstanceState()只有在存在保存状态的情况下才会恢复,因此您不需要检查是否Bundle为空
textView.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, gameState);
    outState.putString(TEXT_VIEW_KEY, textView.getText());

    // call superclass to save any view hierarchy
    super.onSaveInstanceState(outState);
}

Activity#onSaveInstanceState()方法只能用于保存临时性数据(存到传入的Bundle对象),不能进行持久化存储(持久化存储应该在Activity#onPause()/onStop() 中实现)。

1、如果是用户自动按下返回键,或程序调用finish()退出程序,是不会触发onSaveInstanceState()和onRestoreInstanceState()的。 2、每次用户旋转屏幕时,您的Activity将被破坏并重新创建。当屏幕改变方向时,系统会破坏并重新创建前台Activity,因为屏幕配置已更改,您的Activity可能需要加载替代资源(例如布局)。即会执行onSaveInstanceState()和onRestoreInstanceState()的。

isFinishing()

该方法只是简单地返回mFinished,该变量在activity的finish()中赋值。

在onPause或onStop中可以结合该方法判断它是否被关闭(继而销毁),从而做一些资源回收处理。

《阿里巴巴Android开发手册》

  1. 【推荐】不要在Activity#onDestroy()内执行释放资源的工作,例如一些工作线程的销毁和停止,因为onDestroy()执行的时机可能较晚。可根据实际需要,在Activity#onPause()/onStop()中结合isFinishing()的判断来执行。

切换Activity时的生命周期函数顺序

Activity A 启动 Activity B ,其生命周期方法调用如下:

  1. Activity A onPause()
  2. Activity B onCreate()
  3. Activity B onStart()
  4. Activity B onResume()
  5. Activity A onStop()

如果启动Activity B时A仍可见(可能情况包括B是一个Dialog或透明的,或以多窗口方式启动B),则不会调用A的onStop,因为A仍然可见。其生命周期方法调用如下:

  1. Activity A onPause()
  2. Activity B onCreate()
  3. Activity B onStart()
  4. Activity B onResume()

生命周期监听器

AppCompatActivity 会自动继承来自父ComponentActivity 的方法 getLifeCycle。可以addObserver