Android TV壁纸库之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操作是一个耗时操作,从性能角度考虑不是很建议进程进程间的使用;同时进程间使用存在一定程度的通信障碍,例如内存不足的时候,跨进程通信过于频繁可能导致出现数据读取上的错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值