zoukankan      html  css  js  c++  java
  • 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享

    目录(?)[-]

    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开发相关文章

  • 相关阅读:
    wing ide 注释
    dn.net/blueheart20/article/details/22080489
    ubuntu安装R时候增加软件源到sources.list,sudo apt-get update不能更新
    ubuntu install oracle jdk
    Rhadoop安装
    有向图tarjan算法求连通分量的粗浅讲解、证明, // hdu1269
    POJ 3080 多个串最长公共子序列
    POJ 3461 kmp 应用
    POJ2752 NEXT[J]特性应用利用。
    HDU 1358字符串循环节问题 ,next数组
  • 原文地址:https://www.cnblogs.com/blongfree/p/5048079.html
Copyright © 2011-2022 走看看