OnCreate中的savedInstanceState始终为null,即使调用了onSaveInstance。

3

好的,我已经覆盖了OnSaveInstanceState和OnRestoreInstanceState两个方法,但在OnCreate中bundle为空。我已经查看了所有其他相关问题,但它们对我没用。这是我的主要活动。

public class MainActivity extends AppCompatActivity {
RecyclerView recyclerView;
List<Bundle> bundles;
Bundle bundle;
CustomAdapter customAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState==null) {
        Log.i("abc3","savedInstanceState is null, called in OnCreate");
        bundle = new Bundle();
        bundle.putInt("productImage", R.drawable.happy);
        bundle.putString("nameOfProduct", "iPhone0");
        bundle.putString("productAmount", "5000");
        bundle.putString("nameOfDestination", "DGBDGHIDAFGK");
        bundle.putString("addressOfDestination", "Velachery Main Road, Near IIT Madras, Chennai,Tamil Nadu,India 600042");
        bundle.putString("contactno", "0123456789");
        bundle.putBoolean("isSeller", true);
        bundles = new ArrayList<>();
        bundles.add(0, bundle);
    /*Log.i("abc1", bundle.getString("nameOfProduct"));
    bundle.remove("nameOfProduct");
    bundle.putString("nameOfProduct", "iPhone1");*/
        Bundle bundle1 = new Bundle();
        bundle1.putInt("productImage", R.drawable.happy);
        bundle1.putString("nameOfProduct", "iPhone1");
        bundle1.putString("productAmount", "5000");
        bundle1.putString("nameOfDestination", "DGBDGHIDAFGK");
        bundle1.putString("addressOfDestination", "Velachery Main Road, Near IIT Madras, Chennai,Tamil Nadu,India 600042");
        bundle1.putString("contactno", "0123456789");
        bundle1.putBoolean("isSeller", true);
        bundles.add(1, bundle1);
    /*Log.i("abc1", bundle.getString("nameOfProduct"));
    bundle.remove("nameOfProduct");
    bundle.putString("nameOfProduct", "iPhone2");*/
        Bundle bundle2 = new Bundle();
        bundle2.putInt("productImage", R.drawable.happy);
        bundle2.putString("nameOfProduct", "iPhone2");
        bundle2.putString("productAmount", "5000");
        bundle2.putString("nameOfDestination", "DGBDGHIDAFGK");
        bundle2.putString("addressOfDestination", "Velachery Main Road, Near IIT Madras, Chennai,Tamil Nadu,India 600042");
        bundle2.putString("contactno", "0123456789");
        bundle2.putBoolean("isSeller", true);
        bundles.add(2, bundle2);
    }
    else
    {
        Log.i("abc3","savedInstanceState is not null,called in OnCreate");
        for(int i=0;savedInstanceState.containsKey(String.valueOf(i));++i)
            bundles.add(savedInstanceState.getBundle(String.valueOf(i)));

    }

    /*Log.i("abc1", bundle.getString("nameOfProduct"));*/
    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
    customAdapter= new CustomAdapter(this,bundles,recyclerView);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(customAdapter);
}
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

    bundles = customAdapter.getBundleList();
   // Log.i("abc3", String.valueOf(bundles.size()));
    for(int i=0;i<bundles.size();++i)
    {savedInstanceState.putBundle(String.valueOf(i),bundles.get(i));}
    super.onSaveInstanceState(savedInstanceState);
    if(savedInstanceState==null)Log.i("abc3","savedInstanceState is null, called in onSaveInstanceState");
    else Log.i("abc3","savedInstanceState is not null, called in onSaveInstanceState");
}
@Override
public void onRestoreInstanceState(Bundle savedInstanceState)
{
    if(savedInstanceState!=null)
        for(int i=0;savedInstanceState.containsKey(String.valueOf(i));++i)
            bundles.add(savedInstanceState.getBundle(String.valueOf(i)));
    super.onRestoreInstanceState(savedInstanceState);
}
}

我的清单文件
<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:supportsRtl="true"
    android:theme="@style/Theme.AppCompat.Light.DarkActionBar">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

当我启动活动,然后关闭它,再次启动它时,这里是我的日志记录:

  06-05 12:56:46.777 27184-27184/com.example.sharath.delivery_app I/abc3: savedInstanceState is null, called in OnCreate
  06-05 12:56:53.384 27184-27184/com.example.sharath.delivery_app I/abc3: savedInstanceState is not null, called in onSaveInstanceState
  06-05 12:57:00.613 27443-27443/com.example.sharath.delivery_app I/abc3: savedInstanceState is null, called in OnCreate

我尝试过调用

 super.onSaveInstanceState(savedInstanceState); 

在方法的开头而不是结尾处使用,但没有任何变化。

1
在OnCreate中,bundle为空。这是因为它没有从保存的状态中恢复。我尝试过调用,但你不需要自己调用生命周期方法。操作系统会在需要时自动调用它们。 - Sufian
我该如何从保存的状态中恢复呢? - Jacksparrow
1
您可以在这里阅读有关此内容的信息:链接1链接2。为了测试保存和恢复功能,您需要在“开发者选项”中勾选“不保留活动”。现在每当您最小化应用程序时,将调用您的活动的 onSaveInstanceState() 方法。当您返回时,onCreate() 将在 onRestoreInstanceState() 之前被调用。 - Sufian
调用 super.onSaveInstanceState(savedInstanceState) 是完全正确的。@Sufian 可能误读了,并认为您尝试从某个地方直接调用自己的方法。在覆盖时通过调用超类方法是完全正确的,更重要的是这是必要的。 - Marcin Koziński
当然,在重写的onSaveInstanceState()方法中调用super.onSaveInstanceState()是可以的,但是OP正在自己调用onSaveInstanceState()而不是在那个被重写的方法中。 - Sufian
显示剩余2条评论
1个回答

5
这种行为看起来是正确的。你说你做的是:

我启动活动,然后关闭它,再次启动它。

在这种情况下,Android不会恢复您的活动状态。当用户有意关闭活动时,所有状态都将被丢弃,当他们稍后重新启动时,他们会得到一个全新的副本。 只有在活动被系统销毁,但用户不想关闭它并期望活动状态保持不变时,才会恢复状态。其中一种情况是屏幕旋转(或通常任何配置更改)。请注意保留HTML标记。

1
如果用户关闭活动,是否可以获取详细信息?重写onStop或onPause需要使用SQLite DB或共享首选项保存数据,对吗? - Jacksparrow
1
没错。如果您需要持久化存储数据,可以使用SQLite、共享偏好设置或文件(请参见Google的这个培训)。“保存实例状态”仅用于在活动重新创建之间保留短暂视图状态。 - Marcin Koziński

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接