activity异常状况下生命周期分析

activity异常状况下生命周期分析_第1张图片
异常情况下Activity的重建过程

情况一:资源相关的西涌配置发生改变导致 Activity 被杀死并重新创建
例如:系统横竖屏切换时,默认情况下,activity 不做特殊处理,就会被销毁并重新创建。

当activity在异常情况下终止,系统会调用 onSaveInstanceState 来保存当前的状态,这个方法的调用时机是在onStop之前。并且该方法只会在异常终止情况下被调用。当Activity被重新创建后,系统会调用onRestoreInstanceState,并且把Activity销毁时所报存的Bundle对象作为参数传递给onRestoreInstanceState 和onCreate方法。从时序上来讲,onRestoreInstanceState 的调用时机在onStart之后。

代码示例:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if(savedInstanceState !=null){
            String state = savedInstanceState.getString("extra_state");
        }
    }
    

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putString("extra_state", "state");
    }


    @TargetApi(21)
    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState,
            PersistableBundle persistentState) {
        // TODO Auto-generated method stub
        super.onRestoreInstanceState(savedInstanceState, persistentState);
        String state = savedInstanceState.getString("extra_state");
    }

如果系统配置发生改变时,不想系统重新创建Activity可以给Activity指定configChanges属性。

android:configChanges = "orientation"

如果指定的minSdkVersion 和 targetSdkVersion有一个大于13,除了orientation属性,还要加上screenSize。

android:configChanges = "orientation| screenSize"

这时系统将不会调用onSaveInstanceState 和 onRestoreInstanceState来存储和恢复数据,而是调用了 onConfigurationChanged方法。

情况二:资源内存不足发生导致低优先级的 Activity 被杀死

Activity优先级从高到低,可以分如下三种:
(1)前台Activity -- 正在与用户交互的Activity,优先级最高。
(2)可见但是非前台Activity --比如 Activity 中弹出了一个对话框,导致Activity可见但是位于后台无法直接和用户交互。
(3)后台Activity -- 已经被暂停的Activity ,比如执行了onStop,优先级最低。

当系统内存不足时,系统就会按照上述优先级去杀死目标Activity所在进程,并在后续通过onSaveInstanceState 和 onRestoreInstanceState来存储和恢复数据。

你可能感兴趣的:(activity异常状况下生命周期分析)