Android TV壁纸库之SharedPreferences 实现跨进程通信

SharedPreferences跨进程共享数据研究 最近因工作需求,需要Android app中的SharedPreferences的数据共享到其他进程,研究很两天,终于得到了解决方案,感动不已,分享一下。 阅读详情

一、SharedPreferences介绍:

1.这里是官方文档地址。(这里是中文引导文档)

2.它的实现例如官方文档给出如图:


3.它的内容描述如图:


【主要包括初始化、支持的键值对类型、存放和读取的方法】

二、跨进程使用的方式:

1.原理:

SharedPreferences在使用的时候,会在当前应用的apk的路径为:/data/data/包名/shared_prefs/设置的文件名.xml

如图为笔者所做项目用到的位置:


对于我们定义的文件,在另一个进程(如应用)中获取该文件,进行更新数据或者读取数据操作,实现数据的跨进程使用。

2.实现代码:

首先我们在主应用中实现一个工具类,例如我这里实现的:

import android.content.Context;
import android.content.SharedPreferences;

/**
 * Created by fengjw on 2018/3/19.
 */

public class SettingPreference {

    public static final String WALLPAPERSETTING = "wallpaper_setting";
    public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE
            + Context.MODE_MULTI_PROCESS;

    private Context mContext;

    public SettingPreference(Context context){
        mContext = context;
    }

    public String loadSharedPreferences(String key, String value){
        SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
        String tmp = share.getString(key, "default");
        return tmp;
    }

    public int loadSharedPreferences(String key, int value){
        SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
        int tmp = share.getInt(key, -2);
        return tmp;
    }

    public void saveSharedPreferences(String key, int value){
        SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
        SharedPreferences.Editor editor = share.edit();
        editor.clear().putInt(key, value);
        editor.commit();
    }

    public void saveSharedPreferences(String key, String value){
        SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
        SharedPreferences.Editor editor = share.edit();
        editor.putString(key, value);
        editor.commit();
    }

}

我们定义了对两种键值对:string-string、string-int类型的数据的读写操作。

然后我们在另一个进程中使用当前进程的文件,我们再次定义一个工具类:

import android.content.Context;
import android.content.SharedPreferences;

/**
 * Created by fengjw on 2018/3/20.
 */

public class SettingPreference {
    public static final String WALLPAPERSETTING = "wallpaper_setting";
    public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE
            + Context.MODE_MULTI_PROCESS;

    private String PACKAGE_NAME = "包名";//如:com.fengjw.wallpapermarket

    private Context mContext;

    public SettingPreference(Context context){
        try {
            mContext = context.createPackageContext(PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    public int loadSharedPreferences(String key, int value){
        SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
        int tmp = share.getInt(key, -2);
        return tmp;
    }

    public String loadSharedPreferences(String key, String value){
        SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
        String tmp = share.getString(key, "default");
        return tmp;
    }

    public void saveSharedPreferences(String key, int value){
        SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
        SharedPreferences.Editor editor = share.edit();
        editor.clear().putInt(key, value);
        editor.commit();
    }

    public void saveSharedPreferences(String key, String value){
        SharedPreferences share = mContext.getSharedPreferences(WALLPAPERSETTING, MODE);
        SharedPreferences.Editor editor = share.edit();
        editor.putString(key, value);
        editor.commit();
    }
}

这里需要注意对于配置文件的调用操作,我们的Context不能直接获取当前应用的,而要获取之前进程的Context。

另外一个需要注意的地方为AndroidManifest.xml文件,我们要设置统一的sharedUserId,来保持通信的畅通。

笔者开发均为系统预装应用,所以使用的均为系统UID,例如:

android:sharedUserId="android.uid.system"

官方文档中阐述SharedPreferences操作是一个耗时操作,从性能角度考虑不是很建议进程进程间的使用;同时进程间使用存在一定程度的通信障碍,例如内存不足的时候,跨进程通信过于频繁可能导致出现数据读取上的错误。

Android性能优化之SharedPreferences Android 存储优化系列专题 SharedPreferences 系列 《Android 之不要滥用 SharedPreferences》 《Android 之不要滥用 SharedPreferences(2)— 数据丢失》 ContentProvider 系列(待更) 《Android 存储选项之 ContentProvider 启动过程源码分析》 《Android 存储选项之 ContentProvider 深入分析》 对象序列化系列 《Android 对象序列化之你不知道的 Serializab. 阅读详情

相关推荐

SharedPreferences跨应用跨进程获取数据(附件)

NULL 博文链接:https://flycatdeng.iteye.com/blog/2166036

SharedPreferences的跨进程之旅

之前的文章中,对SharedPreferences的基本使用进行了介绍。同时也提到了,SharedPreferences的功能并不是为了解决跨进程通信,且也不支持跨进程。实际上并非如此,谷歌官方只是不推荐也不建议我们在跨进程场景中使用它,但是我们依然有办法在不同的进程中通过SharedPreferences共享数据。主要要利用到Context类的createPackageContext(String packageName, int flags)方法,这个方法,可以在应用中,创建其他包中应用的上下文(也就是

MitSuiTachi的博客 3857

Android进程间通讯——多进程共用SharedPreferences

在使用SharedPreferences进行进程数据共享时,我们发现,有些虽然过时了,但是实际上还是可以用的。 只是Google不建议大家这么干了。所以这篇文章只是一个介绍实现,科普。 http://blog.youkuaiyun.com/yangzhaomuma/article/details/50718081

Android SharedPreferences 源码分析以及跨进程读写问题

概述 Android SharedPreferences 提供了下面的模式来支持跨进程读写数据问题。 @Deprecated public static final int MODE_MULTI_PROCESS = 0x0004; 这种模式已经被官方标记为Deprecated,关于废弃的原因,官方有解释: * @deprecated MODE_MULTI_PROCESS does ...

诺诺诺诺诺诺诺诺的博客 9922

Android-通过注解生成SharedPreferences包装类解决跨进程数据访问不同步的问题

通过注解生成SharedPreferences包装类,解决跨进程数据访问不同步的问题

Android 跨进程SharedPreferences异常详解

Android 跨进程SharedPreferences异常详解 Context c = null; try { c = context.createPackageContext(PREFERENCE_PACKAGE, Context.CONTEXT_IGNORE_SECURITY); } catch (NameNotFoundException e) { e.printStackTrace(); } if (c != null) { SharedPreferences infoSp = c.getSha

Sharedpreference多进程实现

在我们要保存一些数据量小且需要持久化的数据时,我们通常会使用SharedPreference来保存。正常情况下 是没有任何问题的。但我们知道SharedPreference保存实际上是保存一份XML文件。 我们访问SharedPreference资源: 首次访问会读取xml文件,把所有内容读入缓存。之后在该进程中都是从缓存中拿。 写入:Editor & apply 都是先写入...

yangfanxiao的专栏 834

HWDB1.1数据集处理全攻略:从gnt文件到PNG图片的完整转换教程

本文提供了HWDB1.1数据集处理的完整教程,详细解析了gnt二进制文件格式,并给出了从文件解析、标签映射到批量转换为PNG图片的Python脚本。教程涵盖了环境准备、跨平台解压方案,以及为PyTorch等深度学习框架准备数据的最佳实践,是进行手写汉字识别研究不可或缺的实用指南。

2w3e4r5t6y的博客 630

SharePreference原理及跨进程数据共享的问题

SharedPreferences是Android提供的数据持久化的一种手段,适合单进程、小批量的数据存储与访问。为什么这么说呢?因为SharedPreferences的实现是基于单个xml文件实现的,并且,所有持久化数据都是一次性加载到内存,如果数据过大,是不合适采用SharedPreferences存放的。而适用的场景是单进程的原因同样如此,由于Android原生的文件访问并不支持多进程互斥,...

weixin_34414196的博客 621

关于Selenium3在MicrosoftEdge浏览器中出现的问题

前言 最近在做web自动化测试,所用环境是java+selenium3.141.59+MicrosoftEdge(Chromium)浏览器。 在调试的过程中,出现了很多问题。比如selenium3在Edge浏览器中远程调用中,不支持addArguments方法等 问题 1.Edge浏览器弹窗问题 在测试过程中,会出现弹出窗提示 ...

zhucheng1994的博客 2197

CocosCreator | 自定义启动页之H5

01 效果对比 默认启动页: 自定义启动页: 02 启动页存在的意义 我们在 creator 中的开发的游戏都是基于 cocos engine,所以在展示我们的游戏之前,是必须要先加载 cocos engine,然后才是我们自己的业务代码 流程图如下: 而构建完成后未精简的 cocos engine 代码为 1.9M 如果再加上物理相关代码的话,一共是2M 别忘了,我们自己的首场景也要加载过程哦 所以,从游戏启动,到真...

Valiancer 5896

Android开发-在应用之间共享数据

Android开发-在应用之间共享数据

m0_61787196的博客 2649

C#上位机与MES系统数据对接:从协议选型到安全传输的实战解析

本文详细解析了C#上位机与MES系统数据对接的全过程,从协议选型到安全传输的实战技巧。针对工业互联网场景下的数据对接挑战,提供了RESTful API、MQTT和OPC UA等协议的选型建议,并分享了健壮性设计、异常处理和安全传输的实用代码示例,帮助开发者高效实现数据上传与系统集成。

weixin_30566063的博客 105

SharePreferences原理及跨进程读取数据,数据存储与缓存

SharedPreferences,apply跟commit的最大区别: apply的写入文件操作是在单线程的线程池来完成; 而commit是在当前线程阻塞运行的。 -- SharedPreference apply 引起的 ANR 问题: SP 操作仅仅把 commit 替换为 apply 不是万能的,apply 调用次数过多容易引起 ANR。所有此类 ANR 都是经由 QueuedWo...

ShareUs的专栏 3732

利用Openlayers4实现地图遮罩效果(二)

之前实现的遮罩效果,在深色背景的底图上,对要突出的区域采用半透明遮罩,以此来突出该区域。但是有时底图颜色偏白,这时候不再适合对要突出的区域采用遮罩,而是要对突出区域之外进行遮罩处理。两种效果的对比入下图: ...

此爱如少年 6399

星敏感器:卫星姿态测量的“星空导航仪”

在卫星、航天器和深空探测器的姿态控制系统中,星敏感器(Star Tracker) 是最精确的姿态测量设备之一。它通过识别恒星的位置,计算出航天器在惯性空间中的三轴姿态,精度可达 角秒级(arcsecond),是许多高精度任务(如遥感、天文观测、深空探测)的核心传感器。

ScilogyHunter的博客 3698

Android,SharedPreferences的使用

SharedPreferences是一个轻量级存储框架,以“key-value键值对”的形式来保存数据,默认存储在/data/data//shared_prefs目录下。

qq_46269365的博客 1039

杰理蓝牙SPP用户接口详细文档

本文档详细介绍了基于JL701n芯片的蓝牙SPP用户接口实现。主要内容包括:1) 文件结构分析,包含必要的头文件和调试配置;2) 核心数据结构,如全局变量和TWS功能ID定义;3) 五大功能模块实现:数据发送、状态管理、数据接收、TWS支持和初始化清理;4) API接口说明,包括公共接口函数和回调函数;5) 使用教程,涵盖基本流程和高级应用示例。该接口支持虚拟串口连接,实现蓝牙设备间数据传输,特别针对TWS场景进行了优化,提供连接状态管理、数据收发等功能。文档还包含错误处理、重试机制等实用建议,适合蓝牙SP

qq_42014563的博客 1179

跨进程共享数据——ContentProvider

跨进程共享数据——ContentProvider Android数据持久化技术,包括文件存储、SharedPreferences存储以及数据库存储,使用这些持久化技术所保存的数据只能在当前应用程序中访问。虽然文件存储和SharedPreferences存储中提供了MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种操作模式,用于供给其他应用程序访问当前应用的数据,但 这两种模式在Android 4.2版本中都已被废弃了。因为Android官方已经不再推荐使用这种方式来实现跨

xingyu19911016的博客 6203

Android 编译系统(Build System)剖析

make是一种自动化构建工具,通过读取Makefile将源代码自动编译为可执行程序和库文件。

虎哥LoveDroid 2169

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

SharedPreferences 不同进程共享数据,访问数据不及时问题

SharedPreferences 不同进程共享数据,访问数据不及时问题

Android framework 634

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

SharedPreferences多进程解决方案

由于进程间是不能内存共享的,每个进程操作的SharedPreferences都是一个单独的实例,这导致了多进程间通过SharedPreferences来共享数据是不安全的,这个问题只能通过多进程间其它的通信方式或者是在确保不会同时操作SharedPreferences数据的前提下使用SharedPreferences来解决。 SharedPreferences支持多进程吗其实原则上是不支持的,下面这

维斯特洛(Westeros)大陆 1万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Android性能优化之SharedPreferences(1)

说道这想必大家已经明白:我们在Sp储存的数据会在本地生成一个.xml文件外,还会将该文件的数据缓存在一个map对象中。如果是第一次创建显然BufferedInputStream不会读取到任何数据,此时XmlUtils.readMapXml()解析返回自然为null,然后mMap = new HashMap();

2301_81749759的博客 896

Android学习 | 07.SharedPreferences使用场景和用法

Android学习 | 07.SharedPreferences使用场景和用法

M_Nobody的博客 929

Android多进程数据共享:SharedPreferences替代方案详解

避免使用SharedPreferences:在多进程环境中完全避免直接使用SharedPreferences优先选择MMKV:腾讯MMKV是最佳的多进程数据共享解决方案ContentProvider适用场景:需要精细控制数据访问逻辑时使用性能优先原则:减少跨进程通信频率,批量处理数据数据一致性保障:使用同步写入(commit)替代异步写入(apply)安全考虑:对敏感数据使用加密存储在多进程Android应用中,SharedPreferences已不再是数据共享的最佳选择。

时小雨的专栏 1056

【亲测免费】 Android 多进程SharedPreferences解决方案

Android 多进程SharedPreferences解决方案 1. 项目基础介绍及编程语言 本项目是一个开源的Android库,旨在解决Android开发中多进程环境下SharedPreferences的同步问题。它使用Java语言编写,支持在多进程环境中安全、高效地读写SharedPreferences数据。 2. 项目核心功能 多进程支持:通过使用ContentProvider,项目实现...

gitblog_00713的博客 433
上一篇: androidTV实现GridView横向循环
下一篇: Android TV壁纸库之GridView使用及焦点处理
hacker_crazy
博客等级 码龄13年 58粉丝 114原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值