Activity 生命周期描述 以及特殊情况下的生命周期

下面回忆下Activity的生命周期:
activity常用生命周期主要是:
onCreate() —> onStart() –>onResume() –> onPause() –> onStop() –> onDestroy()

如图所示:

这里写图片描述

Activity第一次启动,回调如下:
onCreate-->onStart --> onResume.
当用户打开一个新的Activity或者按Home健回到桌面时,回调如下:
onPause--> onStop.
当用户再次回到此Activity时,回调如下:
onRestart -->onStart-->onResume.
当用户按返回键或者调用finish()结束此Activity时,回调如下:
onPause -->onStop-->onDestroy.
onCreat和onDestroy 分别表示Activity的创建和销毁,只会调用一次.
onStart和onStop 表示Activity是否可见,此时是后台可见;可以调用很多次,随着用户操控屏幕点亮熄灭会被调用;
onResume 和onPause 表示Activity是否位于前台 可以调用很多次;
下面介绍特殊情况下的生命周期:
1.资源相关的系统配置发生改变导致的Activity被杀死重新创建 如:横竖屏切换
系统配置发生改变后,Activity会被销毁,
因为是异常情况下Activity发生的停止,此时会调用 onSaveInstanceState
来保存当前Activity状态,此方法在onStop之前,和onPause 没有时间顺序
此时调用的生命周期为
onPause -->onSaveInstanceState --> onStop --> onDestroy
或者
onSaveInstanceState -->onPause --> onStop --> onDestroy
接着activity会重新创建,系统会调用onRestoreInstanceState,并把
activity销毁时onSaveInstanceState保存的Bundle对象作为参数传递给
onRestoreInstanceState和onCreate方法,我们可以取出保存的数据并恢复,
此时生命周期为:    
onCreate --> onStart -->onRestoreInstanceState -->onResume

我们来看下效果,代码如下:

public class MainActivity extends AppCompatActivity {
    TextView tv_textview;
    EditText et_edittext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //初始化
        tv_textview = (TextView) findViewById(R.id.tv_textview);
        et_edittext = (EditText) findViewById(R.id.et_edittext);

        tv_textview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                tv_textview.setText("此时为点击后数据");
            }
        });
        //判断Bundle 是否为空.如果为空,则表明不是异常终止,  不为空,则表明是异常终止
        if (savedInstanceState != null){
            Log.d("MainActivity","onCreate里获取保存点击的数据: "+savedInstanceState.getString("textview"));
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        //保存textview点击后的数据
        outState.putString("textview",tv_textview.getText().toString());
        Log.d("MainActivity","保存点击的数据: "+tv_textview.getText().toString());
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
        //拿到textview点击后的数据
        Log.d("MainActivity","获取保存点击的数据: "+savedInstanceState.getString("textview"));
    }
}

下面贴上log日志
这里写图片描述
下面贴上效果图 竖屏和横屏
这里写图片描述
这里写图片描述
可以看出系统会自动默认view的默认状态,但是一些状态就不能恢复,我们可以自己保存,然后重建是获取.
注意: 系统只会在Activity异常终止时才会调用
onSaveInstanceState和onRestoreInstanceState方法来存储和恢复数据;
如果我们给Activity指定 configChanges =”orientation”属性,这样屏幕旋转就不会重新创建activity了

2.资源内存不足导致低优先级的Activity被杀死
activity优先级分为
前台Activity——正和用户交互的,优先级最高
可见Activity——非前台,比如弹窗对应的activity,不可与用户直接交互
后台Activity——已经暂停的,比如执行了onStop,优先级最低
此时activity的生命周期和资源相关的系统配置发生改变导致的Activity被杀死重新创建 生命周期一样,也会调用onSaveInstanceState和onRestoreInstanceState方法来存储和恢复数据.

猜你喜欢

转载自blog.csdn.net/shanshan_1117/article/details/80435415