Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android savedInstanceState vs getIntent().getExtras()_Android_Android Activity_Android Lifecycle - Fatal编程技术网

Android savedInstanceState vs getIntent().getExtras()

Android savedInstanceState vs getIntent().getExtras(),android,android-activity,android-lifecycle,Android,Android Activity,Android Lifecycle,我遇到了两种不同的类型,以使我的活动基于一些参数运行。第一个是savedInstanceState,另一个是getIntent.getExtras() Q1) 所以我不明白的是,一旦我将bundle传递给我的活动,然后启动它,它就应该有bundle了。 但是,如果出于某种原因再次创建该活动,那么它应该重新拥有相同的包。(我说得对吗?) Q2)基于Q1为真的事实,以及一旦活动已经启动,我就不能覆盖捆绑包的事实,我想如果出于某种原因,我已经启动了活动,我想更改捆绑包的一些参数,我应该创建一些活动字段

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

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

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

问题3)基于上述事实,在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就没有真正的含义,因为它是相同的!)


问题5)如果我没有覆盖saveInstanceState上的但当我创建活动时,我向它传递了一个捆绑包,这是否仍然意味着如果再次创建活动,我可以获得我的原始捆绑包?(我想这个问题会根据其他答案自行回答)

savedInstanceState
之间的主要区别在于它们有不同的用法。目的是在活动之间进行通信,而保存状态是在您离开活动时的UI当前状态,例如按下“主页”按钮。因此,它将保存您的
列表视图
s的位置和类似内容,或未保存的
文本编辑
s的值

问题1:是的,一般来说,只要您不再次打开活动,信息就不应该丢失

问题2:到目前为止是这样。默认视图将保存它们的状态,因此您无需自己进行操作。但是,如果您的活动是使用另一个包再次启动的,那么您将拥有新的值

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

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

问题5:一般来说,这应该是一样的。因为基本ui元素在默认情况下会保存它们的状态


保存状态的要点是即使你的应用程序在后台被销毁,也要保持用户界面的更改。因此,即使你的应用程序不再存在于你的设备内存中,你的应用程序也会在离开它的位置恢复。

你是说当重新创建活动时,意图附加不会丢失吗?正确。只要你没有得到“新的意图”(例如,从不同的意图或应用程序启动相同的意图),它就不会改变。