我想保存和恢复的状态,Activity
使用方法onSaveInstanceState()
和onRestoreInstanceState()
。
问题在于它永远不会进入onRestoreInstanceState()
方法。谁能向我解释为什么?
我想保存和恢复的状态,Activity
使用方法onSaveInstanceState()
和onRestoreInstanceState()
。
问题在于它永远不会进入onRestoreInstanceState()
方法。谁能向我解释为什么?
Answers:
通常,您在中恢复状态onCreate()
。也可以还原它onRestoreInstanceState()
,但不是很常见。(onRestoreInstanceState()
在之后调用onStart()
,而onCreate()
在之前调用onStart()
。
使用put方法将值存储在onSaveInstanceState()
:
protected void onSaveInstanceState(Bundle icicle) {
super.onSaveInstanceState(icicle);
icicle.putLong("param", value);
}
并恢复以下值onCreate()
:
public void onCreate(Bundle icicle) {
if (icicle != null){
value = icicle.getLong("param");
}
}
onRestoreInstanceState()
仅在 OS 杀死活动后重新创建活动时才调用。在以下情况下会发生这种情况:
相比之下:如果您正在活动中,并且Back
在设备上单击了按钮,则活动已完成(即认为它正在退出桌面应用程序),而下次启动应用程序时,它将“新鲜”启动,即没有保存状态,因为您在点击时有意退出了状态Back
。
造成混淆的另一个原因是,当一个应用失去对另一个应用的关注时,onSaveInstanceState()
将调用该方法,但是当您导航回该应用时,onRestoreInstanceState()
可能不会被调用。这是原始问题中描述的情况,即,如果您的活动在“其他活动”之前没有被杀死,onRestoreInstanceState()
则不会被调用,因为您的活动非常“活跃”。
总而言之,如文档中所述onRestoreInstanceState()
:
大多数实现将只使用onCreate(Bundle)来恢复其状态,但是在完成所有初始化或允许子类决定是否使用默认实现之后,有时在这里这样做很方便。此方法的默认实现将还原以前由onSaveInstanceState(Bundle)冻结的任何视图状态。
如我所读:onRestoreInstanceState()
除非您是子类化Activity
,否则没有任何理由要重写,并且应该有人会子类化您的子类。
您保存在的状态onSaveInstanceState()
以后可以在onCreate()
方法调用时使用。因此,请使用onCreate
(及其Bundle
参数)恢复您的活动状态。
作为解决方法,您可以将捆绑包和要维护的数据存储在用于启动活动A的Intent中。
Intent intent = new Intent(this, ActivityA.class);
intent.putExtra("bundle", theBundledData);
startActivity(intent);
活动A必须将此传递回活动B。您将在活动B的onCreate方法中检索意图。
Intent intent = getIntent();
Bundle intentBundle;
if (intent != null)
intentBundle = intent.getBundleExtra("bundle");
// Do something with the data.
另一个想法是创建一个存储库类来存储活动状态,并让您的每个活动都引用该类(可能使用单例结构。)尽管如此,这样做可能比其价值更大。
最主要的是,如果您不存储在其中,onSaveInstanceState()
则onRestoreInstanceState()
不会被调用。这是restoreInstanceState()
和之间的主要区别onCreate()
。确保您确实存储了一些东西。这很可能是您的问题。
不必总是在onSaveInstanceState之后调用onRestoreInstanceState。
请注意:当旋转活动(当未处理方向时)或打开您的活动然后打开其他应用程序时,总是会调用onRestoreInstanceState,以便操作系统将您的活动实例从内存中清除。
在文档“使用保存的实例状态还原活动UI状态”中,其表示为:
您可以选择实现onRestoreInstanceState(),而不是在onCreate()期间恢复状态,系统在onStart()方法之后调用该方法。仅当存在要还原的保存状态时,系统才调用onRestoreInstanceState(),因此您无需检查 Bundle 是否为null:
IMO,这是比在onCreate上进行检查更清晰的方法,并且更适合单一职责原则。
我刚遇到这个问题,并注意到文档中有我的答案:
“此函数永远不会以空状态调用。”
就我而言,我想知道为什么在初始实例化时未调用onRestoreInstanceState。这也意味着,如果您不存储任何内容,则在重建视图时将不会调用它。
我可以那样做(很抱歉,它是c#而不是java,但这不是问题...):
private int iValue = 1234567890;
function void MyTest()
{
Intent oIntent = new Intent (this, typeof(Camera2Activity));
Bundle oBundle = new Bundle();
oBundle.PutInt("MYVALUE", iValue); //=> 1234567890
oIntent.PutExtras (oBundle);
iRequestCode = 1111;
StartActivityForResult (oIntent, 1111);
}
和您的活动结果
private int iValue = 0;
protected override void OnCreate(Bundle bundle)
{
Bundle oBundle = Intent.Extras;
if (oBundle != null)
{
iValue = oBundle.GetInt("MYVALUE", 0);
//=>1234567890
}
}
private void FinishActivity(bool bResult)
{
Intent oIntent = new Intent();
Bundle oBundle = new Bundle();
oBundle.PutInt("MYVALUE", iValue);//=>1234567890
oIntent.PutExtras(oBundle);
if (bResult)
{
SetResult (Result.Ok, oIntent);
}
else
SetResult(Result.Canceled, oIntent);
GC.Collect();
Finish();
}
最后
protected override void OnActivityResult(int iRequestCode, Android.App.Result oResultCode, Intent oIntent)
{
base.OnActivityResult (iRequestCode, oResultCode, oIntent);
iValue = oIntent.Extras.GetInt("MYVALUE", -1); //=> 1234567890
}