今天给大家介绍三种不同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会多次创建