`

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

阅读更多

在做一个应用的时候,该应用本来是和桌面放在一起的,后来不得不分开,但是桌面部分需要获取该应用的数据,就是该应用切换数据,然后发送广播给桌面程序,桌面程序获取该应用的数据!

需要的数据不多,所以之前该应用融合在桌面的时候就是使用的SharePreferences保存,但是现在分开了,就要跨进程了,要么就用ContentProvider结合SQLite将数据暴漏给桌面程序(但是需要的数据很简单,所以觉得用这种方式太麻烦了),要么操作相同的一个文档(可能被其他程序更改,不安全),要么继续使用SharePreferences。

但是之前使用的SharePreferences都是使用模式Context.MODE_PRIVATE,这样就不能被其他程序访问到,开始一直以为这样的文档只能被本应用使用,后来查了很多资料发现使用不同的模式可以实现跨进程,跨应用获取该文件内容(写了个demo来测试一下,见附件):

 

程序ShareDataB相当于一个主程序,只用来获取客户端程序ShareDataA中SharePreferences的数据。

程序a点击按钮来切换数据:

SharedPreferences share = getSharedPreferences(SHARED_FILE_NAME, Context.MODE_WORLD_READABLE);
                boolean preBooleanValue = share.getBoolean(SHARED_FILE_BOOLEAN_VALUE, false);// 得到之前的值
                // 更改share里的值
                share.edit().putBoolean(SHARED_FILE_BOOLEAN_VALUE, !preBooleanValue).commit();// 改变值
                boolean afterBooleanValue = share.getBoolean(SHARED_FILE_BOOLEAN_VALUE, false);// 得到之前的值
                mValueText.setText(afterBooleanValue + "");

 而程序b则在onresume的时候获取程序a中数据:

private static final String TARGET_PACKAGE_NAME = "com.example.sharedataa";// 目标数据程序的包名,
/**
     * 根据目标程序的包名来获取其程序的上下文
     * @return
     * @throws NameNotFoundException
     */
    private Context getTargetContext() throws NameNotFoundException {
        return createPackageContext(TARGET_PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY);
    }

 

/**
     * Context.MODE_MULTI_PROCESS一定要添加,按理说只要Context.MODE_WORLD_READABLE 即可
     * <p>
     * 但是,如果只有Context.MODE_WORLD_READABLE 的话,即使另一个程序改变了值,这个程序得到的值永远都是第一次获取的值
     * <p>
     * 不会随着其他程序改变而改变
     */
    @Override
    protected void onResume() {
        super.onResume();
        try {
            SharedPreferences share = getTargetContext().getSharedPreferences(SHARED_FILE_NAME,
                    Context.MODE_WORLD_READABLE | Context.MODE_MULTI_PROCESS);
            boolean afterBooleanValue = share.getBoolean(SHARED_FILE_BOOLEAN_VALUE, false);// 得到之前的值
            mBooleanValueText.setText(afterBooleanValue + "");
        } catch (NameNotFoundException e) {
            e.printStackTrace();
            mBooleanValueText.setText("木有找到该包名");
        }
    }

 


 
 

  • 大小: 38.7 KB
  • 大小: 40.2 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics