Android不同APP之间共享数据的方式

今天给大家介绍三种不同APP之间共享数据的方式
第一种:使用SharePreference
使用SharePreference共享数据

第二种:使用ContentProvider,
这个就不仔细讲了,大家看看其他文章吧

第三种:sharedUserId

通过SharedUser id,拥有同一个User id的多个APK可以配置成运行在同一个进程中.所以默认就是可以互相访问任意数据.也可以配置成运行成不同的进程,同时可以访问其他APK的数据目录下的数据库和文件.就像访问本程序的数据一样.

通过createPackageContext调用另外一个应用的方法,在应用A中写一个Util类(包名为com.example.signatureapp)

public class Util {
    public static void printStr(String str){
        System.out.println("========str: "+str);
    }
}

在另一个应用中调用这个方法

Context packageContext = createPackageContext("com.example.signatureapp", Context.CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);
            Class clazz = packageContext.getClassLoader().loadClass("com.example.signatureapp.Util");
            Method method = clazz.getDeclaredMethod("printStr",String.class);
            method.invoke(null,"===========静态方法");

先解释一下上面的两个标记:

Context.CONTEXT_INCLUDE_CODE:
把参数包名对应的应用中的代码包含到Context中,这样当前应用才能访问context应用中的类,如果context对应的应用不能安全的加载到当前应用中
,会报出SecurityException,如果想要加载另一个应用,访问它的数据,则这个标记必须设置


CONTEXT_IGNORE_SECURITY:忽略加载context对应的应用这个过程中的
安全限制,总是允许加载,和CONTEXT_INCLUDE_CODE配合使用,代表不管是否安全,都要加载,一般使用要小心。

访问其他应用中的SP中的数据

保存数据的应用:

 SharedPreferences signature = getSharedPreferences("signature", MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
        signature.edit().putInt("age",12).apply();

注意:这里的模式要设置为

MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE

读取数据的应用:

//根据包名获取另一个应用的Context对象
Context packageContext = createPackageContext("com.example.signatureapp",CONTEXT_INCLUDE_CODE|Context.CONTEXT_IGNORE_SECURITY);

SharedPreferences signature = packageContext.getSharedPreferences("signature", MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE);
            int age = signature.getInt("age", 0);

注意:上面的方式只能实现读取SP中的数据,而不能修改SP中的数据
但是官方是不推荐这种MODE_WORLD_READABLE|MODE_WORLD_WRITEABLE方式的,因为不安全,推荐使用ContentProvider,BroadCast和Service来通信。

SharedPreferences 不支持两个进程去执行写操作,因为可能造成数据丢失

Android为不同应用分配了独立的虚拟机,也可以说是为每个进程分配了不同的虚拟机,不同的虚拟机在内存分配上有不同的地址空间。

多进程会造成下面的问题:
1.静态成员和单例失效
2.线程同步机制失效
3.SP可靠性下降
4.Application会多次创建

  • 6
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值