前言

前几篇文章主要讲了安卓四大组件之Activity。最近在coding的时候又遇到一个问题:自己项目中有两个Activity分别命名为Activity1和Activity2,而Activity1属于process1,Activity2属于process2,从Activity1跳转到Activity2,然后在Activity2中通过使用SharedPreferences进行保存简单的数据,结果不论怎么操作所取的值都是不正确的,why??? 读完本篇你将有所了解!
备注:本文主要从源码角度进行分析。

简介

SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置,它提供了string,set,int,long,float,boolean六种数据类型。最终数据是以xml形式进行存储。在应用中通常做一些简单数据的持久化缓存。

流程图

Android数据持久化(一) SharedPreferences

相关类简介

1.PreferenceManager

Used to help create {@link Preference} hierarchies from activities or XML.

2.ContextImpl

Common implementation of Context API, which provides the base context object for Activity and other application components.

3.SharedPreferencesImpl

Implement SharedPreferences.

4.QueuedWork

he queued asynchronous work is performed on a separate, dedicated thread.

源码分析

  1. 一般获取SharedPreferences对象为PreferenceManager getDefaultSharedPreferences() 或者ContextImpl getSharedPreferences(),不论是哪种最终都将进入ContextImpl getSharedPreferences()方法。
    Android数据持久化(一) SharedPreferences
    Android数据持久化(一) SharedPreferences
    Android数据持久化(一) SharedPreferences
    在这里会先去获取已经缓存到实例,如果为空才会去创建。
    Android数据持久化(一) SharedPreferences
    2.获取到SharedPreferences对象后,调用get方法查询数据。
    Android数据持久化(一) SharedPreferences
    这里主要讲一下awaitLoadedLocked(),等待sp创建完成以及load本地文件。
    Android数据持久化(一) SharedPreferences
    3.上面两步将read过程梳理清楚,下面就write过程分析下。同样还是先获取SharedPreferences对象,然后调用put方法修改数据,提交数据分为commit 和 apply方法。
    commit():同步回写内存,然后等待异步磁盘任务结束后返回
    apply(): 同步回写内存,然后通过Handler 异步回写磁盘,QueuedWork中进行统一调度任务
    Android数据持久化(一) SharedPreferences
    Android数据持久化(一) SharedPreferences
    Android数据持久化(一) SharedPreferences
    Android数据持久化(一) SharedPreferences
    Android数据持久化(一) SharedPreferences
    Android数据持久化(一) SharedPreferences

总结

通过以上源码分析,大体可以总结为以下几点:
1.SharedPreferences 线程安全,由Synchronized进行保证
2.SharedPreferences 进程不安全,Google也不推荐使用SharedPreferences进程间数据共享
3.SharedPreferences 数据是以键值对形式保存数据,适合简单的不频繁修改的数据,且数据不宜过大
4.SharedPreferences 不宜滥用,每个文件不宜过大,频繁改动的和不经常变化的分成不同的文件进行保存

相关文章:

  • 2022-12-23
  • 2021-09-22
  • 2021-07-05
  • 2021-11-13
  • 2022-12-23
  • 2021-05-20
  • 2021-04-05
猜你喜欢
  • 2021-05-10
  • 2021-08-01
  • 2022-12-23
  • 2022-12-23
  • 2021-05-23
  • 2021-07-31
相关资源
相似解决方案