这是我的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);
}
Run Code Online (Sandbox Code Playgroud)
日志始终显示"捆绑保存"标记.
但在onCreate
方法中,SavedInstanceState
始终为null.
我试图在我的活动中保存数据而不是恢复它.我保存数据onSaveInstanceState()
然后我尝试恢复数据onRestoreInstanceState()
.
我设置断点,方法onSaveInstanceState()
被调用.但是,onRestoreInstanceState()
或onCreate()
从来没有.
这是我的步骤:
Activity
.onSaveInstanceState()
被叫.Activity
再次启动我.这时,只能onRestart()
打电话.但不是onRestoreInstanceState()
或onCreate()
.
有谁知道为什么?
Android医生说:
"当系统而不是用户关闭活动以节省内存时......"
但是如何模拟这种情况?我想调试onRestoreInstanceState(Bundle)
方法,但不知道如何.
保存包(活动A):
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putString("test", "value");
super.onSaveInstanceState(outState);
}
Run Code Online (Sandbox Code Playgroud)
导航到活动B;
startActivity(new Intent(getBaseContext(), B.class));
Run Code Online (Sandbox Code Playgroud)
回到活动A:
startActivity(new Intent(getBaseContext(), A.class));
Run Code Online (Sandbox Code Playgroud)
试图在活动A中加载我写入bundle的值:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d("MY", "saved instance is null"+ Boolean.toString(savedInstanceState == null));
}
Run Code Online (Sandbox Code Playgroud)
返回总是savedInstanceState = null.我在这里缺少什么?
当我返回主活动时,永远不会触发onRestoreInstanceState
正如我刚才所了解的那样,Android保留随时终止后台应用程序进程的权利,以便回收RAM.该应用程序仍在运行,并仍然可以恢复,但我所有的静态变量都不见了(见本文章).
我想在这种情况下模拟我的应用程序的行为.最简单的方法是什么?当然,必须有一种更简单,更可预测的方式,而不是编写一些分配大量内存的应用程序.
尽管我努力防止碎片被多次添加,但我还是继续遇到java.lang.IllegalStateException: Fragment already added: VideoFragment
.
我有一个活动,其中仅在onCreate中实例化VideoFragment.在我尝试显示VideoFragment的唯一地方,我首先检查是否已添加此片段.
private VideoFragment videoFragment;
public void onCreate(Bundle savedInstanceState) {
...
videoFragment = new VideoFragment();
...
}
private void showVideoFragment() {
if (!videoFragment.isAdded()) {
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, videoFragment, "video").commit();
}
}
Run Code Online (Sandbox Code Playgroud)
我无法在调试器中一致地重现此问题,但我的运行时错误报告继续报告java.lang.IllegalStateException: Fragment already added: VideoFragment
用户的异常,堆栈跟踪由Android类组成.
/FragmentManager.java:1133? android.app.FragmentManagerImpl.addFragment
/BackStackRecord.java:648? android.app.BackStackRecord.run
/FragmentManager.java:1453? android.app.FragmentManagerImpl.execPendingActions
/FragmentManager.java:443? android.app.FragmentManagerImpl$1.run
/Handler.java:733? android.os.Handler.handleCallback
/Handler.java:95? android.os.Handler.dispatchMessage
/Looper.java:146? android.os.Looper.loop
/ActivityThread.java:5487? android.app.ActivityThread.main
/Method.java:-2? java.lang.reflect.Method.invokeNative
/Method.java:515? java.lang.reflect.Method.invoke
/ZygoteInit.java:1283? com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run
/ZygoteInit.java:1099? com.android.internal.os.ZygoteInit.main
/NativeStart.java:-2? dalvik.system.NativeStart.main
Run Code Online (Sandbox Code Playgroud)
添加的定义是否与isAdded()
用于检查片段事务的定义不匹配?
或者在某种程度上,活动中的videoFragment引用是不一样的?保存状态http://developer.android.com/guide/components/activities.html#SavingActivityState时,我需要明确处理这个问题吗?
或者是否有可靠的替代方法来检查片段是否已被添加?
UPDATE …