savedInstanceState 与 getIntent().getExtras()

savedInstanceState vs getIntent().getExtras()

我遇到了 2 种不同的类型来获得我的 activity 运行 基于一些参数。第一个是 savedInstanceState 另一个是 getIntent.getExtras()

Q1) 所以我不明白的是,一旦我将 bundle 传递给我的 activity 然后启动它,它应该有捆绑包。 但是,如果由于某种原因再次重新创建 activity,它应该再次具有相同的包。 (我说得对吗?)

Q2) 基于 Q1 为真这一事实,以及一旦 activity 已经开始我就不能覆盖捆绑包这一事实,我想如果出于某种原因我已经开始 Activity,我想更改包的一些参数,我应该创建一些 activity 字段并在我的 activity 生活中使用这些字段。 如果出于某种原因我的 activity 将被重新创建,则覆盖 saveInstanseState 以保存新字段。是真的吗?

Q3) 基于以上所有事实,在 onCreate() 中 Android 世界中的每个 activity 都需要像这样开始这个:

if (savedInstanceState != null) {
    mType = savedInstanceState.getInt("some_val1");
    mCardId = savedInstanceState.getLong("some_val2");
    mQuery =  savedInstanceState.getString("some_val3");
    mCategory = savedInstanceState.getLong("some_val4");;
} else {
    mType = getIntent().getExtras().getInt("some_val1");
    mCardId  = getIntent().getExtras().getLong("some_val2");
    mQuery = getIntent().getExtras().getString("some_val3");
    mCategory = getIntent().getExtras().getString("some_val4");
}

Q4) 假设调用了 onSaveInstanceState 并保存了与启动 activity(getIntent.getExtras)的原始包不同的值,如果再次重新创建 activity,是否这意味着 saveInstanceState 与 getIntent.getExtras() 不同,或者它们现在相同? (如果它们相同,那么上面代码中的 if/else 没有真正的意义,因为它是相同的!)。

Q5) 如果我没有覆盖 onSaveInstanceState 但是当我创建 activity 时我将它传递给一个 Bundle,这是否仍然意味着我可以得到我的如果 activity 再次重新创建原始包? (我想这个问题会根据其他答案自行回答)

getIntent().getExtras()savedInstanceState 的主要区别在于它们的用法不同。目的是为了活动之间的通信,而保存的状态是当您离开 activity 时 UI 的当前状态,例如按主页按钮。因此它将保存您的 ListViews 和类似的位置或未保存的 TextEdits.

的值

Q1:是的,一般情况下信息不会丢失,只要您不再次打开 activity。

Q2:到目前为止是正确的。默认视图会保存它们的状态,所以你不需要自己做。但是,如果您的 Activity 使用不同的捆绑包第二次启动,您将拥有新值。

Q3:不需要,这取决于您的用例,但这不会破坏任何东西。关键是当您从互联网加载日期时,您只需等待一次,在第二次 onCreate() 调用时,数据将被恢复(如果您在具有 id 的 UI 元素中显示它们!) .

Q4:意图是初始值,而保存状态是值的修改状态。

Q5:总的来说应该是一样的。由于基本 ui 元素将默认保存它们的状态。

保存状态的要点是保持 ui 更改,即使您的应用在后台被销毁也是如此。因此,即使您的应用程序不再存在于您的设备内存中,您的应用程序也会在离开它的那个点恢复。