Activity生命周期

本文详细解析了Android中Activity的生命周期,包括关键方法如onCreate、onStart、onResume等的调用时机,以及如何通过onSaveInstanceState和onRestoreInstanceState实现状态保存与恢复。通过实验代码演示了不同场景下生命周期的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Activity生命周期要点

activity_lifecycle

  1. 重写生命周期方法必须调用super方法
  2. onSaveInstanceState会在onPause和onStop间调用,onRestoreInstanceState会在onStart和onResume间调用. 如果Activity实例没有销毁,onRestoreInstanceState是不会调用的.
  3. onCreate和onRestoreInstance都带有Bundle参数,这两者有何区别? 其实两者都可以做状态恢复,但有一点要注意:子View(比如在layout xml文件中定义的带id的EditText)会在onRestoreInstance中做状态恢复,也就是说在onCreate/onStart时,子View其实还没有恢复状态的。

实验代码:

GitHub: LearnAndroid

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.EditText;
public class MainActivity extends AppCompatActivity {
    private String TAG = "MainActivity.TEST";

    private int saveState = 0;
    private EditText editText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        Log.v(TAG, "In onCreate...");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        if (savedInstanceState == null) {
            Log.v(TAG, "saveInstanceState is null");
        } else {
            saveState = savedInstanceState.getInt("saveState", 0);
            Log.v(TAG, String.format("onCreate saveInstanceState is not null.saveState:%d", saveState));
        }

        editText = (EditText) findViewById(R.id.editText);
        Log.v(TAG, "onCreate editText value:" + editText.getText());
    }

    @Override
    protected void onStart() {
        Log.v(TAG, "In onStart...");
        super.onStart();
        Log.v(TAG, "onStart editText value:" + editText.getText());
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        Log.v(TAG, "In onRestoreInstanceState...");
        super.onRestoreInstanceState(savedInstanceState);

        Log.v(TAG, String.format("restore saveInstanceState is not null.saveState:%d", saveState));
        Log.v(TAG, "onRestoreInstanceState editText value:" + editText.getText());
    }

    @Override
    protected void onResume() {
        Log.v(TAG, "In onResume...");
        super.onResume();
    }

    @Override
    protected void onPause() {
        Log.v(TAG, "In onPause...");
        super.onPause();
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        Log.v(TAG, "In onSaveInstanceState...");
        super.onSaveInstanceState(outState);
        outState.putInt("saveState", 1);
    }

    @Override
    protected void onStop() {
        Log.v(TAG, "In onStop...");
        super.onStop();
    }

    @Override
    protected void onRestart() {
        Log.v(TAG, "In onRestart...");
        super.onRestart();
    }

    @Override
    protected void onDestroy() {
        Log.v(TAG, "In onDestroy...");
        super.onDestroy();
    }
}
应用启动

WechatIMG26

MainActivity.TEST: In onCreate...
MainActivity.TEST: saveInstanceState is null
MainActivity.TEST: onCreate editText value:Hello World!
MainActivity.TEST: In onStart...
MainActivity.TEST: onStart editText value:Hello World!
MainActivity.TEST: In onResume...

Note:
(1) 首次启动时onCreate的savedInstanceState参数为null;
(2) 首次启动时onRestoreInstanceState并没有调用

切换应用/切换Activity/熄屏/亮屏
MainActivity.TEST: In onPause...
MainActivity.TEST: In onSaveInstanceState...
MainActivity.TEST: In onStop...
...
MainActivity.TEST: In onRestart...
MainActivity.TEST: In onStart...
MainActivity.TEST: onStart editText value:Hello World!
MainActivity.TEST: In onResume...

Note:
(1) 这组场景并没有销毁Activity,所以只是在onStart <-> onStop 的可见周期内状态切换
(2) 调用了onSaveInstanceState, 没有调用onRestoreInstanceState

旋转屏幕
MainActivity.TEST: In onPause...
MainActivity.TEST: In onSaveInstanceState...
MainActivity.TEST: In onStop...
MainActivity.TEST: In onDestroy...
MainActivity.TEST: In onCreate...
MainActivity.TEST: onCreate saveInstanceState is not null.saveState:1
MainActivity.TEST: onCreate editText value:Hello World!
MainActivity.TEST: In onStart...
MainActivity.TEST: onStart editText value:Hello World!
MainActivity.TEST: In onRestoreInstanceState...
MainActivity.TEST: restore saveInstanceState is not null.saveState:1
MainActivity.TEST: onRestoreInstanceState editText value:Hello World!
MainActivity.TEST: In onResume...

在EditText输入HelloWord2!, 重做实验:

MainActivity.TEST: In onPause...
MainActivity.TEST: In onSaveInstanceState...
MainActivity.TEST: In onStop...
MainActivity.TEST: In onDestroy...
MainActivity.TEST: In onCreate...
MainActivity.TEST: onCreate saveInstanceState is not null.saveState:1
MainActivity.TEST: onCreate editText value:Hello World!
MainActivity.TEST: In onStart...
MainActivity.TEST: onStart editText value:Hello World!
MainActivity.TEST: restore saveInstanceState is not null.saveState:1
MainActivity.TEST: onRestoreInstanceState editText value:Hello World2!
MainActivity.TEST: In onResume...

Note:
(1) 旋转屏幕时,Activity先销毁后重建, 此时onSaveInstanceState和onRestoreInstanceState被调用,onCreate的saveInstanceState 非null
(2) 当在editText输入"Hello Word2!"后再做旋转操作,发现直到onRestoreInstanceState时才得到改变的值,即在onCreate/onStart中editText还没恢复状态

后退键/Kill
MainActivity.TEST: In onPause...
MainActivity.TEST: In onStop...
MainActivity.TEST: In onDestroy...

Note:
Activity都要销毁了,当然没有调用onSaveInstanceState

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值