Android不同应用之间数据的共享有许多方式,但是我觉得还是使用sharedPreference比较简单和轻量级。如果程序B想要访问程序A的sharedPreference可以通过下面的语句来实现
当然在A程序里创建SharedPreference的时候也需要使用Context.MODE_WORLD_READABLE属性。另外 SharedPreference还有Context.MODE_WORLD_WRITEABLE属性。根据SDK的解释,就是允许别的应用程序来对 SharedPreference进行写操作。但是在实际程序实验中发现即使加上了这个属性,写操作也是无法成功的,会提示一个错误:Couldn’t rename file /data/data/…PREFERENCES_NAME.XML to /data/data/…PREFERENCES_NAME.XML.bak。这个错误的原因应该是很明确了,程序B在程序A的目录里面没有创建 和重命名文件的权限。
终极解决方案
那么到底要怎么样才能让程序B在程序A的SharedPreferences里面写东西呢,其实很简单,在manifest.xml里面将两个应用程序 的android:sharedUserId属性设为相同的就可以了。而且SharedPreference的属性也不需要 Context.MODE_WORLD_WRITEABLE了,只需要Context.MODE_PRIVATE也可以完成读写操作。
通过Shared User id,拥有同一个User id的多个APK可以配置成运行在同一个进程中,可以互相访问任意数据。也可以配置成运行成不同的进程, 同时可以访问其他APK的数据目录下的数据库和文件,就像访问本程序的数据一样。
总结:
如果想要不同的APK之间共享数据需要满足以下条件:
1.APK的签名必须相同
2.android:shareUserId的值必须相同
3.如果想要运行在同一个进行当中,必须设置android:process的值相同。
application设置应用程序的全部组件都运行在某个线程中
数据就和访问本地的一样的
例如
1:所有的apk都要设置这个共享属性
android:sharedUserId=“com.cmy”
2:获取朋友上下文对象
Context friendContext = createPackageContext(“com.kd.cmy”, Context.CONTEXT_IGNORE_SECURITY);
3:可以访问对应的sharedPreference,数据库,字符串,图片,相关的资源
访问sharedPreference
SharedPreferences s=FriendCache.getContext().getSharedPreferences(“yd3a”, Context.MODE_PRIVATE);
访问数据库方法类似
String file = context.getDatabasePath(“weather.db”).getAbsolutePath();
Log.e(TAG, "database path : " + file);//从这句打印就可以看出他访问的是被共享程序的数据库文件。
SQLiteDatabase db = SQLiteDatabase.openDatabase(file, null, SQLiteDatabase.OPEN_READWRITE, new );
访问资源
context.getResources()