如何利用Fragment里的 onSaveInstanceState保存数据

在说这个问题之前,要先了解下onSaveInstanceState是怎么设计的,又是怎么运行的,如何利用InstanceState保存和恢复数据。

首先介绍Fragment 里的onSaveInstanceState这个方法顺便介绍下onRestoreInstanceState方法,一些朋友可能在Android开发过程中很少使用,但是有时候掌握其用法会帮我们起到非常好的效果,尤其是在应用程序在不知道的情况下退出,如何实现其数据保存的功能。

1.基本作用:
onSaveInstanceState 方法并不是生命周期方法,他们不同于onCreate()、onPause()等生命周期方法,它们并不一定会被触发。当应用遇到意外情况(如:内存不足、用户直接按Home键)这时系统将要销毁这个Activity时,onSaveInstanceState() 此时会被调用。但是当用户主动去销毁一个Activity时,例如在应用中按返回键,onSaveInstanceState()就不会被调用。因为在这种情况下,用户的行为决定了不需要保存Activity的状态。通常onSaveInstanceState()只适合用于保存一些临时性的状态。而onPause()适合用于数据的持久化保存。而当activity被创建时,我们可以通过onCreate(Bundle)或者onRestoreInstanceState(Bundle) 里面的参数 Bunndle来得到之前保存的临时状态和数据以便我们做数据恢复。

  例如,如果activity B启用后位于activity A的前端,在某个时刻activity A因为系统回收资源的问题要被杀掉,A通过onSaveInstanceState将有机会保存其用户界面状态,使得将来用户返回到activity A时能通过onCreate(Bundle)或者onRestoreInstanceState(Bundle)恢复界面的状态。

   关于onSaveInstanceState (),是在函数里面保存一些View有用的数据到一个Parcelable对象并返回。在Activity的onSaveInstanceState(Bundle outState)中调用View的onSaveInstanceState (),返回Parcelable对象,

  接着用Bundle的putParcelable方法保存在Bundle savedInstanceState中。

  当系统调用Activity的的onRestoreInstanceState(Bundle savedInstanceState)时,通过Bundle的getParcelable方法得到Parcelable对象,然后把该Parcelable对象传给View的onRestoreInstanceState (Parcelable state)。在的View的onRestoreInstanceState中从Parcelable读取保存的数据以便View使用。


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 `Activity` 的 `onSaveInstanceState` 方法中保存 `ViewPager2` 的状态,可以重写该方法,并在其中保存 `ViewPager2` 的当前选中项索引。示例代码如下: ```java public class MainActivity extends AppCompatActivity { private ViewPager2 viewPager2; private int currentItem; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager2 = findViewById(R.id.viewPager2); // 设置 ViewPager2 的 Adapter 和数据 // ... if (savedInstanceState != null) { // 从保存的 Bundle 中恢复 ViewPager2 的当前选中项 currentItem = savedInstanceState.getInt("currentItem", 0); viewPager2.setCurrentItem(currentItem, false); } } @Override protected void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); // 保存 ViewPager2 的当前选中项 currentItem = viewPager2.getCurrentItem(); outState.putInt("currentItem", currentItem); } } ``` 在 `Activity` 的 `onCreate` 方法中恢复 `ViewPager2` 中 `Fragment` 的状态,可以在创建 `FragmentStateAdapter` 时传入 `FragmentManager` 和 `Lifecycle` 对象,然后在 `onCreate` 方法中使用该适配器创建 `ViewPager2`,并设置其 Adapter。示例代码如下: ```java public class MainActivity extends AppCompatActivity { private ViewPager2 viewPager2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager2 = findViewById(R.id.viewPager2); // 创建 FragmentStateAdapter FragmentStateAdapter adapter = new MyFragmentStateAdapter(getSupportFragmentManager(), getLifecycle()); // 设置 ViewPager2 的 Adapter viewPager2.setAdapter(adapter); } } ``` 其中 `MyFragmentStateAdapter` 是继承自 `FragmentStateAdapter` 的一个自定义适配器,示例代码如下: ```java public class MyFragmentStateAdapter extends FragmentStateAdapter { private static final int NUM_PAGES = 3; public MyFragmentStateAdapter(@NonNull FragmentManager fragmentManager, @NonNull Lifecycle lifecycle) { super(fragmentManager, lifecycle); } @NonNull @Override public Fragment createFragment(int position) { // 根据 position 创建对应的 Fragment return MyFragment.newInstance(position); } @Override public int getItemCount() { return NUM_PAGES; } } ``` 在 `MyFragment` 中可以保存和恢复 Fragment 的状态,具体的实现方法可以参考前面我的回答。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值