【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.csdn.net/flowingflying/
包在设备上安装时,系统会为其分配一个User ID。如果我们有几个应用,这几个应用之间需要深度的数据共享,在同一证书签发的情况下,可以让这几个应用使用同一UserID,达到数据共享。
共享User ID的设置
我们在Eclipse中创新两个应用:TestShareUserIdA和TestShareUserIdB。在TestShareUserIdA的AndroidManifest.xml中进行如下设置:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="cn.flowingflying.androidtest.testshareuserida"
android:sharedUserId="cn.flowingflying.andriodtest.testshareuserid" ...... >
… …
</manifest>
同样的,我们在TestShareUserIdB中加入相同的android:sharedUserId。这两个包在设备上分别安装,系统分配同一User ID。

多个应用要共享同一UserID,前提是这些应用必须由同一证书签发。在实验中,由于Eclipse对所有应用采用相同debug证书,自然满足这个前提。要避免sharedUserId出现重复,应使用包名的命名方式。Android系统也有一些共享用户ID的应用,如android.uid.system,android.uid.phone。此外,要特别注意,定义sharedUserId要使用raw string,也就是不能采用引用的方式,如@string/xxx。
要注意多个应用打算共享同一User ID,就应该当在一开始就规划好。如果最初没有要求采用sharedUserId,系统为应用分配一个UserID,后来在应用重装才发现要使用其他UserID,很可能引发资源的userID混淆,造成读写权限的问题,这是因为系统不会对旧资源通过chown进行用户ID的变更。
共享资源例子
我们将在TestShareUserIdB中访问TestShareUserIdA的资源。在中在res/values/string.xml中定义了<string name="info">这是来自TestShareUserIdA的信息</string>,我们将在B中读出。此外,我们在下中还放置了一个shareInfo.txt的文本文件,也将在B中读出。下面是B的相关代码:
private final String targetPackageName = "cn.flowingflying.androidtest.testshareuserida";
private void getShareInfo(){
try{
/* 获取其他应用的context,并通过这个context来访问该应用的资源。 createPackageContext()并不限于共享UserID的情况,如果没有共享UserID,需要声明资源可以被外部用户访问。
createPackageContext()的第二个参数tag有三个选择:
1. CONTEXT_INCLUDE_CODE:可以load目标应用的代码到当前进程执行,这要求必须是同一证书签发并具有同一UserID
2. CONTEXT_RESTRICTED:可以访问资源路径,但不能似上面那样请求代码下载
3. CONTEXT_IGNORE_SECURITY:不考虑证书(当然也不需要同一UserID),代码会被下载,并在你的UserID下运行。文档给出特别警告:Use with extreme care!
*/
Context targetContext = this.createPackageContext(targetPackageName, CONTEXT_RESTRICTED);
Log.v("TestB", targetContext.toString());
// 这里是resource资源的读取,由于在B应用中,不能调用A的R.id.info,在R.java文件中查到绝对数字。在实际编程中,这风格当然不好,仅作测试用,B也可以访问A里面的raw、asset资源。
Resources targetRes = targetContext.getResources();
Log.v("TestB",targetRes.getString(0x7f050003));
// 我们已在A中写入shareInfo.txt,并保持在A应用的默认路径下。如果B和A的User ID不同,B则没有权限进行读写,而现在,由于A和B的UserID相关,B拥有A同等的用户权限。
File path = targetContext.getFilesDir();
File f = new File(targetContext.getFilesDir(),"shareInfo.txt");
if(f.exists()){
Log.v("TestB",f.getAbsolutePath() + " already existed. Try to read:");
BufferedReader reader = new BufferedReader(new FileReader(f));
String line = null;
while((line = reader.readLine()) != null){
Log.v("TestB",line);
}
reader.close();
}
}catch(PackageManager.NameNotFoundException e){
Log.e("TestB",e.toString());
}catch(Exception e){
Log.e("TestB",e.toString());
}
}
上面代码的运行结果如下:

相关小例子源代码可在Pro Android学习:了解package的小例子中下载。
相关链接: 我的Android开发相关文章
【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享的更多相关文章
- 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版
目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...
- 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果
目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...
- 【转】 Pro Android学习笔记(四八):ActionBar(1):Home图标区
目录(?)[-] Home Icon 源代码 TextView的滚动 返回主activity或指定activity ActionBar在Android 3.0 SDK中为平板引入,在4.0中也 ...
- 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考
目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...
- 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器
目录(?)[-] Transaction的一些操作 再谈FragmentManager 调用其他fragment的方法 唤起activity 唤起fragment和相互通信 一些其它 Transact ...
- 【转】Pro Android学习笔记(四):了解Android资源(下)
处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...
- Pro Android学习笔记 ActionBar(1):Home图标区
Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...
- 【转】 Pro Android学习笔记(五六):配置变化
目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...
- 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge
目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
随机推荐
- INSPIRED启示录 读书笔记 - 前言
好的产品具备三个基本条件 价值.可用性.可行性,三者缺一不可 产品经理日常工作 1.人员是指负责定义和开发产品的团队成员的角色和职责 2.流程是指探索.开发富有创意的产品时,反复应用的和成功的实践经验 ...
- Java Hibernate 5.3.x
SchemeExport Hibernate根据实体类和实体类映射文件自动生成表结构. 示例代码: <?xml version='1.0' encoding='utf-8'?> <! ...
- windows10 搜索桌面搜索功能失效的解决
windows桌面的搜索框用起来很方便,很多时候直接把不常用的程序的快捷方式删掉,直接从搜索框搜索就可以,但是这两天突然不能用了,今天晚上找了一下原因,终于弄好了. 参考知乎上面的陈滔滔的方法: ht ...
- streambase一些疑难杂症
1.webserverReqest控件接收不到换行符\r\n 方案一:这个在streambase7.6.7没有办法处理,只有在streambase7.7.4中才有办法处理,在这个版本中出现了Reque ...
- java深入探究12-框架之Hibernate
1.引入SSH框架 Struts框架,基于MVC 模式的应用层框架技术 Hibernate,基于持久层框架(数据访问层使用) Dao代码编写的几种方式: 1.原始jdbc操作,Connection/S ...
- php二维数组自定义排序
$arr = array( '0' => array('id' =>1,'price'=>200), '1' => array('id' =>2,'price'=> ...
- mysqldump 用法汇总
mysql mysqldump 只导出表结构 不导出数据 复制代码代码如下: mysqldump --opt -d 数据库名 -u root -p > xxx.sql 备份数据库 复制代码代 ...
- Navicat 导入Excel与增加主键
1.当你需要导入某Excel文件时,你必须把这个lxsl文件用Excel先打开(与其他软件的导入有点不太,其他会报错已占用之类的) 2.设置主键 当你打开你导入的Excel文件时,会显示无主键,需要你 ...
- 搜索8--noi1817:城堡问题
搜索8--noi1817:城堡问题 一.心得 1.这题只是在普通的迷宫的基础上面加上了墙的概念,所以基本的思路和代码就和普通的迷宫是一样的,只不过需要多加上一层墙的判断 2.这里墙的判断是用的二进制加 ...
- 微信支付:微信支付遇到的坑:jssdk,phpdemo,微信支付提示{"errMsg":"chooseWXPay:fail"}
微信支付:微信支付遇到的坑:jssdk,phpdemo 使用微信支付,真是变态,如果不是微信用户多,我才不适配微信支付,我就在想:为什么没人用我支付宝的[点点虫]呢.一个小小的“/”的误差,都调不起微 ...