fragment中怎么读取SharedPreferences数据

fragment中怎么读取SharedPreferences数据,第1张

fragment中怎么读取sharedpreferences数据

获取SharedPreferences的两种方式:

1 调用Context对象的getSharedPreferences()方法

2 调用Activity对象的getPreferences()方法

两种方式的区别:

调用Context对象的getSharedPreferences()方法获得的SharedPreferences对象可以被同一应用程序下的其他组件共享

调用Activity对象的getPreferences()方法获得的SharedPreferences对象只能在该Activity中使用

我们经常在网上看到说, onSaveInstanceState 在 Activity 退回到后台,且未来可能被系统杀死时,我们可以在 onSaveInstanceState 中保存一些临时数据,以便在系统真的杀死了进程,并回收了 Activity 后,用户回到 Activity 时,开发者能够在重建的 Activity 的 onCreate 或 onRestoreInstanceState 方法中,能够从 Bundle 中恢复数据。

这两个回调的时机不一样。

我们知道在屏幕旋转时 Activity 和 Fragment 会重建,其实还有一种情况会重建,就是我们时常看到博客里说的,当应用在后台时,进程被系统回收,用户再次回到应用时,应用会被重建。

那么应用什么时候会被系统回收呢?我们需要清楚一点,就是系统不会单独地回收 Activity 或者 Fragment ,而是会在系统资源不足时,根据应用所在的进程的状态来杀死进程,以回收资源。这里涉及到了一些进程状态的概念:前台进程、可见进程、服务进程 和 缓存进程( process lifecycle )。一般缓存进程会最先被系统回收。

现在的手机 RAM 都非常大,我们怎么模拟这个系统回收进程的过程呢?可以到 开发者选项 -> 应用 -> 后台进程限制 ,将其从默认的 标准限制 改为 不得超过 1 个进程 。这样我们就能够观察到 Activity 或 Fragment 重建时, Bundle 中带有之前调用 onSaveInstanceState 时保存的值了。

Fragement 的数据恢复提供了另外两个回调, onCreate 和 onCreateView ,方便开发者在不同的时机恢复数据。

Fragment 的 retainInstance 属性默认为 false ,当其设置为 true 时,表示 Fragment 实例会在 Activity 因配置变化而重建时, Fragment 自身实例会被保持,不会创建新的实例。它的原理是,调用该方法时,最终调用到了 FragmentManageraddRetainedFragment -> FragmentManagerViewModeladdRetainedFragment , Fragment 实例保存到了 FragmentManagerViewModelmRetainedFragments 中。 mRetainedFragment 是一个以 Fragment 的 uuid( Fragment 自己生成) 为 key ,以 Fragment 自身实例为 value 的 HashMap 。因此本质上是因为 FragmentManagerViewModel 是一个 ViewModel ,它可以在重建周期内保持实例。

正确的使用姿势应该是, onSaveInstanceState 和 ViewModel 结合使用。

我们知道 onSaveInstanceState 中保存的是能够被序列化的数据, Android 系统同样为我们提供了在配置改变时保存没有必要序列化的数据的方法: onRetainCustomNonConfigurationInstance 和 onRetainNonConfigurationInstance ,这两个回调方法都返回一个 Object ,区别在于, onRetainCustomNonConfigurationInstance 是开放给开发者来保存数据的时机的回调, onRetainNonConfigurationInstance 是 final 方法,用于系统自己保存一些系统资源时使用。

对于 onRetainCustomNonConfigurationInstance 保存的数据,之后我们在重建的 Activity 的 onCreate 方法中,可以通过 getLastCustomNonConfigurationInstance 来直接获得之前保存的数据。这个回调在 Androidx 中已经被标记为 Deprecated ,这是因为该机制的职责已经由 ViewModel 代替了。

对于 onRetainNonConfigurationInstance 保存的数据,其实通过阅读源码我们是可以发现,目前的实现就是用来保存了 ViewModel 。而 ViewModel 之所以能够在系统配置改变后重建,正是使用了 onRetainNonConfigurationInstance 的恢复机制。

ViewModel 的重建恢复原理

fragment是在activity中实例化,activity可以获取activity中的类及变量,对于你说的 数值变化需要通过handler发送message到activity来进行同步数据

为了管理Activity中的fragments,需要使用FragmentManager

为了得到它,需要调用Activity中的getFragmentManager()方法。

因为FragmentManager的API是在 Android 30,也即API level 11开始引入的,所以对于之前的版本,需要使用support library中的FragmentActivity,并且使用getSupportFragmentManager()方法。

用FragmentManager可以做的工作有:

得到Activity中存在的fragment:

使用findFragmentById()或findFragmentByTag()方法。

将fragmentd出back stack:

popBackStack():将back stack中最后一次的fragment转换d出。如果没有可以出栈的东西,返回false。

这个函数是异步的:它将d出栈的请求加入队列,但是这个动作直到应用回到事件循环才会执行。

为back stack加上监听器:

addOnBackStackChangedListener()

Performing Fragment Transactions

使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。

所有这些改变构成一个集合,这个集合被叫做一个transaction。

可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退 *** 作。

可以这样得到FragmentTransaction类的实例: 

FragmentManager fragmentManager =getFragmentManager();

FragmentTransaction fragmentTransaction =fragmentManagerbeginTransaction();

 每个transaction是一组同时执行的变化的集合。

用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。

在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。

比如下面的代码就是用一个新的fragment取代之前的fragment,并且将前次的状态存储在back stack中。

// Create new fragment and transaction

Fragment newFragment = newExampleFragment();

FragmentTransaction transaction =getFragmentManager()beginTransaction();

// Replace whatever is in thefragment_container view with this fragment,

// and add the transaction to the backstack

transactionreplace(Ridfragment_container,newFragment);

transactionaddToBackStack(null);

// Commit the transaction

transactioncommit();

在这个例子中,newFragment将取代在Ridfragment_container容器中的fragment,如果没有,将直接添加新的fragment。

通过调用addToBackStack(),commit()的一系列转换作为一个transaction被存储在back stack中,用户按Back键可以返回上一个转换前的状态。

当你移除一个fragment的时候,如果commit()之前没有调用 addToBackStack(),那个fragment将会是destroyed;如果调用了addToBackStack(),这个fragment 会是stopped,可以通过返回键来恢复。

关于commit()方法

调用commit()方法并不能立即执行transaction中包含的改变动作,commit()方法把transaction加入activity的UI线程队列中。

但是,如果觉得有必要的话,可以调用executePendingTransactions()方法来立即执行commit()提供的transaction。

这样做通常是没有必要的,除非这个transaction被其他线程依赖。

注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。

这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。

以上就是关于fragment中怎么读取SharedPreferences数据全部的内容,包括:fragment中怎么读取SharedPreferences数据、Activity & Fragment 的重建、数据恢复相关问题解惑、fragment之间切换的数据共享问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9741935.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存