目录(?)[-]

  1. 共享User ID的设置
  2. 共享资源例子

文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处: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):包间数据共享的更多相关文章

  1. 【转】 Pro Android学习笔记(四十):Fragment(5):适应不同屏幕或排版

    目录(?)[-] 设置横排和竖排的不同排版风格 改写代码 对于fragment,经常涉及不同屏幕尺寸和不同的排版风格.我们在基础小例子上做一下改动,在横排的时候,仍是现实左右两个fragment,在竖 ...

  2. 【转】 Pro Android学习笔记(四二):Fragment(7):切换效果

    目录(?)[-] 利用setTransition 利用setCustomAnimations 通过ObjectAnimator自定义动态效果 程序代码的编写 利用fragment transactio ...

  3. 【转】 Pro Android学习笔记(四八):ActionBar(1):Home图标区

    目录(?)[-] Home Icon 源代码 TextView的滚动 返回主activity或指定activity     ActionBar在Android 3.0 SDK中为平板引入,在4.0中也 ...

  4. 【转】 Pro Android学习笔记(四七):Dialog(4):一些补充和思考

    目录(?)[-] 编程思想封装接口 fragment和activity以其他fragment之间的通信 编程思想:封装接口 在小例子中,fragment会调用activity的onDialogDone ...

  5. 【转】 Pro Android学习笔记(四三):Fragment(8):再谈Transaction和管理器

    目录(?)[-] Transaction的一些操作 再谈FragmentManager 调用其他fragment的方法 唤起activity 唤起fragment和相互通信 一些其它 Transact ...

  6. 【转】Pro Android学习笔记(四):了解Android资源(下)

    处理任意的XML文件 自定义的xml文件放置在res/xml/下,可以通过R.xml.file_name来获取一个XMLResourceParser对象.下面是xml文件的例子: <rootna ...

  7. Pro Android学习笔记 ActionBar(1):Home图标区

     Pro Android学习笔记(四八):ActionBar(1):Home图标区 2013年03月10日 ⁄ 综合 ⁄ 共 3256字 ⁄ 字号 小 中 大 ⁄ 评论关闭 ActionBar在A ...

  8. 【转】 Pro Android学习笔记(五六):配置变化

    目录(?)[-] Activity的destorycreate过程 Fragment的destorycreate过程 onSaveInstanceState saveFragmentInstanceS ...

  9. 【转】 Pro Android学习笔记(二九):用户界面和控制(17):include和merge

    目录(?)[-] xml控件代码重用include xml控件代码重用merge 横屏和竖屏landsacpe portrait xml控件代码重用:include 如果我们定义一个控件,需要在不同的 ...

  10. 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程

    文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...

随机推荐

  1. QQ空间如何设置被删除的好友不能访问空间

    原来一直都很在乎.自己看着办. 经过简单的测试这种方法还是可以的啊,有问题到时候在说吧.理论上无论是否删除好友都可以限制对方访问空间. 旁边还有可以设置不能访问的名单(看仔细点-设置限制名单).

  2. 算法总结之 删除链表的中间节点和a/b处的节点(链表中间节点的重要思想)

    给定链表的表头节点head,实现删除链表的中间节点的函数 推展: 给定链表的头节点,整数a 和 整数 b,实现删除a/b处节点的函数 先来分析原问题, 长度1  直接返回 长度2 将头节点删除 长度3 ...

  3. Javascript中的prototype和__proto__的联系区别

    转载至http://www.cnblogs.com/sinstone/p/5136871.html   一.联系 prototype和__proto__都指向原型对象,任意一个函数(包括构造函数)都有 ...

  4. dajngo之中间件总结

    一.中间件:    a.中间件是什么?       - 中间件是一个类    b. 返回值注意       -(1)无返回值:继续执行后续函数中间件和视图函数       -(2)有返回值:执行自己的 ...

  5. 关于接口自动化的那些事 - 基于 Python

    网络请求模拟小技巧 在学习了一段时间的Python语言后,咱也大概对Python的语法和逻辑有了一定的积累,接下来,可以为接口自动化测试开始尝试做一些比较简单的准备工作啦~跟着我一起来来来~ 扩展库r ...

  6. nginx + tomcat多实例

      一.tomcat 配置多实例(修改两个端口:server端口,tomcat端口) 搭建之前,先确保已安装java和tomcat jdk安装:http://note.youdao.com/notes ...

  7. java:jsp: 一个简单的自定义标签 tld

    java:jsp: 一个简单的自定义标签 tld 请注意,uri都是:http://www.tag.com/mytag,保持统一,要不然报错,不能访问 tld文件 <?xml version=& ...

  8. 《Advanced Bash-scripting Guide》学习(十八):[[ ]]与[ ]的一些特殊情况

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 例1: [ -eq ] && [ -n "`echo ...

  9. 删除OSX中第三方的「偏好设置」程序(.prefPane)

    打开Finder,按Command+Shift+G,输入 /Library/PreferencePanes ~/Library/PreferencePanes 前一个是全局的配置项目录,第二个是当前用 ...

  10. Linux-监控与安全运维之Nagios

    1. Nagios 简介是一个开源软件,可以监控网络设备网络流量.Linux/windows主机状态,甚至可以监控打印机它可以运行在Linux上或windows上基于浏览器的web界面方便运维人员查看 ...