savedInstanceState vs getIntent()。getExtras()

时间:2016-02-20 21:01:40

标签: android android-activity android-lifecycle

我遇到了两种不同的类型,可以根据一些参数来运行我的活动。第一个是 savedInstanceState ,另一个是 getIntent.getExtras()

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

Q2)基于Q1是真的这一事实,以及一旦活动已经开始我无法覆盖捆绑的事实,我想如果由于某些原因在我已经开始的Activity中,我想要改变捆绑的一些参数,我应该创建一些活动字段并在我的活动生活中使用这些字段。 如果由于某种原因重新创建我的活动,则覆盖saveInstanseState以保存新字段。这是真的吗?

Q3)基于以上事实都是正确的事实,在 onCreate()中,Android世界中的每个活动都需要像这样开始:

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被调用并且保存的值与启动活动的原始包(getIntent.getExtras)不同,如果再次重新创建活动,这是否意味着saveInstanceState与getIntent.getExtras不同( )或者他们现在是一样的? (如果它们是相同的,那么上面代码中的if / else没有真正含义,因为它是相同的!)。

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

1 个答案:

答案 0 :(得分:7)

getIntent().getExtras()savedInstanceState之间的主要区别在于它们具有不同的用法。目的是在活动之间进行通信,而保存状态是在您离开活动时用于当前UI状态,例如按主页按钮。因此,它会保存在ListView s的位置以及类似的或未保存的TextEdit的值。

Q1:一般情况下,只要您不再次打开活动,信息就不会丢失。

Q2:到目前为止。默认视图将保存其状态,因此您无需自己执行此操作。但是,如果您的活动第二次使用不同的捆绑包启动,您将获得新值。

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

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

问题5:总的来说,它应该是一样的。由于基本的ui元素默认会保存它们的状态。

即使您的应用在后台被销毁,保存状态的目的是保持ui更改。因此,即使您的应用程序不再存在于您设备的内存中,您的应用程序也会在此处恢复。