savedInstanceState vs getIntent()。getExtras()

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

Q1)所以我不明白的是,一旦我把捆绑到我的活动,然后开始,它应该有捆绑。 但是,如果由于某种原因再次重新创build活动,则应该重新包装相同的包。 (我对吗?)

Q2)基于事实Q1是真实的,事实上,我不能只是一旦活动已经开始重写捆绑,我猜如果由于某种原因在我已经开始的活动,我想改变一些params的捆绑,我应该创build一些活动领域,并在我的活动生活中使用这些领域。 并重写saveInstanseState保存新的字段,如果由于某种原因我的活动将被重新创build。 这是真的吗?

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)不同的值,如果再次重新创build活动,这是否意味着saveInstanceState与getIntent.getExtras()不同?现在是一样的吗? (如果它们是相同的,那么上面的代码中的if / else没有真正的含义,因为它是相同的!)。

Q5)如果我没有重写onSaveInstanceState,但是当我创build活动时,我把它传递给一个Bundle,这是否意味着如果活动再次被重新创build,我可以得到我的原始包? (我猜这个问题会根据其他答案自行回答)

Solutions Collecting From Web of "savedInstanceState vs getIntent()。getExtras()"

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

问题1:一般来说,只要不再次打开活动,信息就不会丢失。

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

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

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

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

即使您的应用程序在后台被销毁,保存状态的重点仍然是保持UI更改。 因此,即使您的应用程序不在您的设备的内存中,您的应用程序仍会继续保留。