哪里可以使用onSaveInstanceState,其中参数传递的是不同的Activity?

时间:2016-05-25 05:58:20

标签: android android-activity activity-lifecycle

对于Acitivity,已经有一个名为onSaveInstacestate(Bundle)的方法,用于存储被覆盖方法的活动数据。

如我所见,有两个不同的onSaveInstanceState,其中参数的传递方式如下所示。

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
    {
        super.onSaveInstanceState(outState, outPersistentState);
        Log.i("test", "onSaveInstanceState called **********");
    }

@Override
    protected void onSaveInstanceState(Bundle outState)
    {
         super.onSaveInstanceState(outState);
          Log.i("test", "onSaveInstanceState with bundle only called");
    }

那么,在什么情况下这两种方法都可以使用? 请详细说明。 提前谢谢。

3 个答案:

答案 0 :(得分:6)

从API级别21开始,onSaveInstanceState()有一个名为PersistableBundle的对象的新参数。您可以在Docs

上阅读有关PersistableBundle的更多信息

简而言之,

对于API 21及以上

@Override
    public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState)
    {
        super.onSaveInstanceState(outState, outPersistentState);
        Log.i("test", "onSaveInstanceState called **********");
    }

对于少于20的API

@Override
    protected void onSaveInstanceState(Bundle outState)
    {
         super.onSaveInstanceState(outState);
          Log.i("test", "onSaveInstanceState with bundle only called");
    }

答案 1 :(得分:3)

这值得扩展。正如公认的答案所述,由于API级别21,onSaveInstanteState还有一个额外的重载。

从API级别1(Docs)开始可用:

void onSaveInstanceState (Bundle outState)

API级别21(Docs)引入的附加功能:

void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState)

带有PersistableBundle的后一个不能代替前一个。仅在Activity属性R.attr.persistableMode设置为persistAcrossReboots时使用。当这样的Activity要保留时,onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState)将被调用,并且您会收到一个PersistableBundle来存储实例状态。

要恢复R.attr.persistableMode设置为Activity的{​​{1}}的状态,有

persistAcrossReboots

请注意,如果调用了void onRestoreInstanceState (Bundle savedInstanceState, PersistableBundle persistentState)的对象,则不会调用onRestoreInstanceState (Bundle savedInstanceState)。我假设PersistableBundle的情况也是如此,但是我没有检查它,并且在API级别28时文档也没有提及它。

onCreate()也有适当的重载。

答案 2 :(得分:0)

我只能说些什么,但这是一些帮助您的帮助代码 我在基本活动中执行此操作,以确保始终保存我的数据

public abstract void saveInstanceState(Bundle outState, PersistableBundle outPersistentState);

@Override
public final void onSaveInstanceState(@NonNull Bundle outState, PersistableBundle outPersistentState) {
    saveInstanceState(outState, outPersistentState);
    super.onSaveInstanceState(outState, outPersistentState);
}

@Override
protected final void onSaveInstanceState(@NonNull Bundle outState) {
    saveInstanceState(outState, null);
    super.onSaveInstanceState(outState);
}

我使用的是final关键字,所以我不会忘记并覆盖其中一种方法 而不是我的自定义摘要