savedInstanceState与getIntent().getExtras()的区别

12

我发现有两种不同的方法可以根据一些参数使我的活动运行。第一种是savedInstanceState,另一种是getIntent.getExtras()

问题1)我不理解的是,一旦我将bundle传递给我的活动,然后启动它,它应该具有bundle。 但是,如果由于某种原因再次重新创建活动,则应始终具有相同的bundle。(我是对的吗?)

问题2)基于问题1为真实的事实,以及我无法在活动已经启动的情况下覆盖bundle的事实,我想如果出于某种原因我希望在已经启动的Activity中更改bundle的某些参数, 我应该创建一些活动字段并在我的活动生命周期中使用这些字段。 并重写saveInstanseState以保存新字段,以防万一我的活动被重新创建。对吗?

问题3)基于以上所有内容,每个Android世界中的活动是否都需要像这样在onCreate()中启动:

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 被调用并保存了与启动活动的原始 bundle(即 getIntent.getExtras())不同的值,那么如果活动被重新创建,这是否意味着 saveInstanceState 与 getIntent.getExtras() 不同,还是它们现在相同?(如果它们相同,那么上面代码中的 if/else 就没有真正的意义,因为它们是相同的!)
Q5) 如果我没有重写 onSaveInstanceState,但在创建活动时传递了一个 Bundle,这是否仍意味着如果活动重新创建,我仍然可以获得原始的 bundle?(我猜这个问题根据其他答案会自行回答)
1个回答

8
getIntent().getExtras()savedInstanceState之间的主要区别在于它们有不同的用途。意图是为活动之间的通信而设计的,而保存状态则是为了当前 UI 的状态,例如通过按 home 按钮离开活动时。因此,它将保存您的ListView的位置和类似元素或未保存的TextEdit的值。
Q1: 是的,一般情况下信息不会丢失,只要您不打开活动第二次。
Q2: 到目前为止是真的。默认视图将保存其状态,因此您不需要自己执行此操作。但是,如果使用不同的 bundle 启动 Activity,则会有新值。
Q3: 不一定需要,这取决于您的用例,但这不会造成任何问题。问题在于,当您从互联网加载数据时,您只需等待一次,在第二个onCreate() 调用时,数据将被恢复(如果在具有 ID 的 UI 元素中显示)。
Q4: 意图将是初始值,而保存的状态是值的修改状态。
Q5: 一般而言,应该可以使用相同的方式。由于基本的 UI 元素将自动保存其状态。
保存状态的重点是即使您的应用在后台中被销毁,也要保持 UI 更改。因此,即使它不再是您设备内存中的一部分,您的应用也将在上次离开它的地方恢复。

您是说当活动被重新创建时,意图额外信息不会丢失吗? - Manuel
2
正确。只要您不获取“新意图”(例如通过从不同的意图或应用程序启动相同的意图),它就不会改变。 - rekire

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接