这是我的savedInstaceState代码:
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
savedInstanceState.putStringArrayList("todo_arraylist", Altodo);
Log.v("bundle", "Saved");
super.onSaveInstanceState(savedInstanceState);
}
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
if (savedInstanceState != null)
{
Altodo = savedInstanceState.getStringArrayList("todo_arraylist");
Log.v("bundle", "Restored");
}
else
{
Log.v("bundle", "null");
}
setContentView(R.layout.main);
}
日志始终显示“捆绑保存”标记。
但在onCreate
方法中,SavedInstanceState
始终为空。
答案 0 :(得分:48)
我在项目中观察到完全相同的症状(报告为issue 133394),其中两个活动 A 和 B 延伸ActionBarActivity
。活动 A 是主要活动,当从详细信息视图活动 B返回时,我的列表片段的null
中的savedInstanceState
始终会收到onCreate
即可。经过几个小时,这个问题暴露给我作为伪装的导航问题。
以下内容可能与我的设置有关,并且来自此页面上的其他答案:
onSaveInstanceState
来电,则无法覆盖super
。AndroidManifest.xml
中被指定为acitivy B 的父级,同时使用android:parentActivityName
属性和相应的{早期版本Android的{1}}标记(请参阅" Providing Up Navigation")。已经没有任何相应的创建代码,例如meta-data
getActionBar()
,活动 B 在其操作中有一个正常运行的后退按钮(< )酒吧。点按此按钮后,活动 A 重新出现,但(a)所有先前的实例状态丢失,(b) .setHomeButtonEnabled(true)
被叫,(c) onCreate
总是savedInstanceState
。
有趣的是,当我点击模拟器显示屏底部边缘提供的后退按钮(一个指向左侧的空心三角形)时,活动 A 会再次出现(就像它的实例一样)状态完全保留)而不调用null
。那么导航可能有问题吗?
在more reading之后,我实施了自己的导航说明,以便在活动 B 中点按后退按钮时运行:
onCreate
与恢复实例活动状态 A 无关。 @Override
public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId() == android.R.id.home)
NavUtils.navigateUpFromSameTask(this);
return true;
}
return super.onOptionsItemSelected(item);
}
还提供了一种方法NavUtils
和getParentActivityIntent(Activity)
,允许我们修改导航意图,以明确指示活动 A 未重新开始(因此未保存)实例状态提供)通过设置navigateUpTo(Activity, Intent)
标志:
如果设置,则正在启动的活动已在运行中 当前任务,然后而不是启动它的新实例 活动,其上的所有其他活动将被关闭 这个意图将作为一个传递到(现在在顶部)旧活动 新的意图。
在我手中,这解决了实例状态丢失的问题,可能看起来像:
FLAG_ACTIVITY_CLEAR_TOP
请注意,在其他用户可以从其他任务中直接切换到活动 B 的情况下,这可能不是完整的解决方案(请参阅here)。此外,不使用public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()== android.R.id.home) {
Intent intent = NavUtils.getParentActivityIntent(this);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, intent);
return true;
}
return super.onOptionsItemSelected(item);
}
的可能相同的行为解决方案是简单地调用NavUtils
:
finish()
这两种解决方案都在我手中。我只是推测原始问题是后退按钮的稍微不正确的默认实现,它可能与调用某种public boolean onOptionsItemSelected(MenuItem item) {
if (item.getItemId()== android.R.id.home) {
finish();
return true;
}
return super.onOptionsItemSelected(item);
}
错过navigateUp
的实现有关。
答案 1 :(得分:14)
您是否检查过是否为该视图设置了Id(如果视图是/有......)。否则不会调用onSaveInstanceState()。
选中link。
答案 2 :(得分:13)
以这种方式保存的状态不会持续存在。如果整个应用程序在调试过程中被杀死,则在onCreate
中该包将始终为空。
这个IMO是另一个糟糕的Android文档的例子。这也是为什么市场上的大多数应用程序都没有正确实现保存状态(根本)。
答案 3 :(得分:7)
为活动添加此行
android:launchMode="singleTop"
例如:
<activity
android:name=".ActivityUniversity"
android:label="@string/university"
android:launchMode="singleTop"
android:parentActivityName="com.alkhorazmiy.dtm.ActivityChart">
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.alkhorazmiy.dtm.ActivityChart" />
</activity>
答案 4 :(得分:3)
你如何测试它?
Imo测试它的最佳方法是在设置&gt;中使用“不要保持活动” - 标志。开发者选项。如果您在“设置”中没有“开发者选项”,请参阅Enabling On-device Developer Options。
答案 5 :(得分:3)
不应该super.onSaveInstanceState(savedInstanceState);
成为覆盖的第一行吗?
修改:War_Hero在评论中指出documentation on that topic表示不,它不应该是第一行。
答案 6 :(得分:1)
检查select t.*
from table t
order by (case when surname = 'Z' then 1 else 2 end),
id desc
limit 1;
中的活动,如果属实,则删除AndroidManifest.xml
属性。
android:noHistory
答案 7 :(得分:0)
要进行调试,请考虑在此方法中实现onRestoreInstanceState并调用Log.d。然后,在模拟器中,按ctrl-F11或其他任何旋转手机。您应该点击您对Log.d的调用。
答案 8 :(得分:0)
实施onRestoreInstanceState
的方法
并将代码放在下面
Altodo = savedInstanceState.getStringArrayList("todo_arraylist");
答案 9 :(得分:0)
我发现当我覆盖onSaveInstanceState()
并实际在Bundle
中保存一些数据时,将恢复实例状态。否则就不是。
答案 10 :(得分:0)
我已经用同样的方法来处理。我没有在onCreateView方法上处理saveInstanceState Bundle,而是在onCreate方法上对其进行处理,并将传递的值设置为globar变量,然后在onCreateView方法上访问此变量。 希望对您有所帮助。
答案 11 :(得分:0)
从中您可以看到“类似地,如果您导航到当前堆栈上的活动,则该行为由父活动的启动模式确定。”也许您处于“标准”模式。
答案 12 :(得分:0)
我能够通过以下方式解决它:
@Override public boolean onSupportNavigateUp()
{
onBackPressed();
return true;
}
清单中仍然设置了父级。因此,当您按下向上导航按钮时,现在它的作用类似于后退按钮。