2016-02-20 31 views
7

我遇到了2种不同的类型,让我的活动基于一些参数运行。第一个是savedInstanceState,另一个是getIntent.getExtras()savedInstanceState vs getIntent()。getExtras()

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

Q2)基于Q1为真的事实,以及事实上,我不能只是在活动已经开始时重写包,我猜如果由于某种原因我已经开始活动,我想改变一些束的参数,我应该创建一些活动领域,并在我的活动生活中使用这些领域。 并重写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没有真正的含义,因为它是相同的!)。如果我没有覆盖onSaveInstanceState,但是当我创建活动时,我将它传递给一个Bundle,这是否仍然意味着如果活动再次重新创建,我可以获得我的原始包? (我猜这个问题会根据其他答案回答自己)

回答

6

getIntent().getExtras()savedInstanceState之间的主要区别是它们有不同的用法。其意图是在活动之间进行通信,而保存的状态用于当您离开活动时用户界面的当前状态,例如通过按主页按钮。所以它会保存你的ListView的位置和类似的值或未保存的TextEdit s的值。

问题1:是的,一般情况下,信息不应该丢失,只要您不要再次打开该活动。 Q2:到目前为止确实如此。默认视图将保存它们的状态,所以你不需要自己做。但是,如果您的活动第二次使用不同的包开始,您将获得新值。

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

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

问题5:一般来说应该是一样的。由于基本的UI元素将默认保存它们的状态。

保存状态的要点是保持UI更改,即使您的应用程序在后台被销毁。因此,即使您的应用程序不再存储在您的设备内存中,您的应用程序仍然会在该位置恢复。

相关问题