Android中的sharedUserId属性详解
在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到SharedUserId,也就是让两个apk使用相同的userID,这样它们就可以看到对方的文件。为了节省资源,具有相同ID的apk也可以在相同的linux进程中进行(注意,并不是一定要在一个进程里面运行),共享一个虚拟机。
下面我们看看ShareUserId的作用,数据共享、调用其他程序资源。
1、获取相同ShareUserId程序的Context
//第一个应用程序为的menifest文件代码如下: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mythou.serviceID" android:versionCode="1" android:versionName="1.0" android:sharedUserId="com.mythou.share" > //....... //第二个应用程序的menifest文件代码如下: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.mythou.clientID" android:versionCode="1" android:versionName="1.0" android:sharedUserId="com.mythou.share" >

上面给出了两个程序的menifest定义,两者共用一个ShareUserId,下面我们看看从一个程序里面如何获取另外一个程序的Context。假设我们从package=“com.mythouclientID”的程序获取package="com.mythou.serviceID"的程序的context:
Context ct=this.createPackageContext("com.mythou.serviceID", Context.CONTEXT_IGNORE_SECURITY);
2、利用StartActivity启动其他应用的
当我们在不同的application中,如application A中的Activity去start一个application B中的Activity,也许你什么Exception都不会得到,也可能会直接Force Close掉。因为再Start Activity时,代码是有去检验permission的。 Uid是用户ID,Android中每个程序都有一个Uid,默认情况下,Android会给每个程序分配一个普通级别互不相同的 Uid,如果用互相调用,只能是Uid相同才行,这就使得共享数据具有了一定安全性,每个软件之间是不能随意获得数据的。而同一个application 只有一个Uid,所以application下的Activity之间不存在访问权限的问题。 但是不同的Application下的应用,访问Activity的时候就存在权限问题。如果设置同一个ShareUserId可以避免这种情况。
下面补充一点,如何共享一个程序的数据,如果你需要做一个application,将某些服务service,provider或者activity等的数据,有三个办法可以方便共享数据。
1、完全暴露,这就是android:exported=”true”的作用,而一旦设置了intentFilter之后,exported就默认被设置为true了,除非再强制设为false。当然,对那些没有intentFilter的程序体,它的exported属性默认仍然是false,也就不能共享出去。
2、权限提示暴露,这就是为什么经常要设置usePermission的原因,如果人家设置了 android:permission=”xxx.xxx.xx”那么,你就必须在你的application的Manufest中 usepermission xxx.xxx.xx才能访问人家的东西。
3、私有暴露,假如说一个公司做了两个产品,只想这两个产品之间可互相调用,那么这个时候就必须使用shareUserID将两个软件的Uid强制设置为一样的。这种情况下必须使用具有该公司签名的签名文档才能,如果使用一个系统自带软件的ShareUID,例如Contact,那么无须第三方签名。
3、利用ShareUserID共享数据
两个应用的ShareUserId相同,则共享对方的data目录下的文件,包括SharePreference, file, lib等文件,而不是资源文件。 要共享资源文件(图片,layout, string等),并不需要ShareUserId相同,普通方法就能拿到,但前提是你自己的应用里已经有了名字相同的资源文件,这样R文件才能找到那个id,否则编译器报错。 当然你也可以使用上面的获取context,然后读取资源。下面给出普通情况下读取其他程序资源办法:
try { Context ct=this.createPackageContext ("com.mythou.serviceID", Context.CONTEXT_IGNORE_SECURITY); String str = ct.getString(R.string.appname); Log.d("mythou", str); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
下面我们看看拥有相同的UID的时候,如何访问data下数据
try { Context ct=this.createPackageContext ("com.mythou.serviceID", Context.CONTEXT_IGNORE_SECURITY); SharedPreferences sp = ct.getSharedPreferences("appInfo", MODE_PRIVATE); String str2 = sp.getString("appname", "service"); Log.d("mythou", "share preference-->" + str2); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
两个应用ShareUserId相同,包名相同或不同,打包时签名文件必须相同否则,在如下情况下,第二个安装包在安装时会失败,错误为[INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]:
1.包名相同,签名相同,ShareUserId不同
2.包名相同或不同,ShareUserId相同,签名不同
Android中的sharedUserId属性详解的更多相关文章
- Android中的windowSoftInputMode属性详解
这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下 在前面的一篇文章中 ...
- android中xml tools属性详解
第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...
- android中xmlns:tools属性详解
今天读到一篇总结的非常棒的文章,写的逻辑很清晰也很实用,很少见到如此棒的文章了.就原文转发过来,我把格式给整理了一下,分享给园子里的各位朋友!好久没写博客了,就为2015年的11月留份纪念吧.希望对你 ...
- android中xml tools属性详解(转)
第一部分 安卓开发中,在写布局代码的时候,ide可以看到布局的预览效果. 但是有些效果则必须在运行之后才能看见,比如这种情况:TextView在xml中没有设置任何字符,而是在activity中设置了 ...
- Android中Application类的详解:
Android中Application类的详解: 我们在平时的开发中,有时候可能会须要一些全局数据.来让应用中的全部Activity和View都能訪问到.大家在遇到这样的情况时,可能首先会想到自定义一 ...
- Android中Service的使用详解和注意点(LocalService)
Android中Service的使用详解和注意点(LocalService) 原文地址 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalServ ...
- Android中SurfaceView的使用详解
Android中SurfaceView的使用详解 http://blog.csdn.net/listening_music/article/details/6860786 Android NDK开发 ...
- Android中Canvas绘图基础详解(附源码下载) (转)
Android中Canvas绘图基础详解(附源码下载) 原文链接 http://blog.csdn.net/iispring/article/details/49770651 AndroidCa ...
- Android TextView和EditText属性详解
TextView属性详解: autoLink设置 是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web /email/phone/map/all) ...
随机推荐
- Java SE series:1. environment configure and Hello world! [We use compiler and packager to create an application!]
1. cli (command line interface) and gui (graphic user interface) use javahome path, search classpath ...
- .NET: WPF Data Binding
WPF是分离UI和Logic的最佳工具,不同于Window Form的事件驱动原理,WPF采用的是数据驱动,让UI成为了Logic的附属,达到分离的效果. 本篇主要讲讲wpf的精华:data bind ...
- ActivityGroup中EditText无法删除的问题
坑,以前比较少用ActivityGroup,最近使用才发现ActivityGroup中多个Activity中如果都有Edittext是无法后退删除. 网上说有种方法监听dispatchKeyEvent ...
- paper 33 :[教程] 如何使用libsvm进行分类
文章来源:http://www.matlabsky.com/thread-12379-1-1.html 这篇文章的讲解的真的是言简意赅,很简单的例子就把这个入门的门槛降低了不少,目前的情况是,我都晓得 ...
- android模拟器启动没有拨号功能
网上查询了很多资料, 其中一位网友给出的结论是android 4.3模拟器的bug, 如果在通讯录中添加好友,也是可以进行拨号的. 总结: 自认为是SDK安装程序不完整或设置AVD模拟器的时候设置项出 ...
- 把Nodepad++添加进右键菜单
1.运行注册表编辑器:开始->运行->regedit 2.找到HKEY_CLASSES_ROOT/*/shell 3.右击shell,选择 新建->项 4.项的名字为Edit wit ...
- zw版【转发·台湾nvp系列例程】HALCON MirrorRegion (Delphi)
zw版[转发·台湾nvp系列例程]HALCON MirrorRegion (Delphi) procedure TForm1.Button1Click(Sender: TObject);var img ...
- yii2获取登陆的用户名
yii2获取登陆的用户名: yii::$app->user->identity->username; 判断用户名是否登陆 if(Yii::$app->user->isGu ...
- OpenGL拾取注意事项
GLFrame框架本身不支持拾取,需要自己实现.以下代码是实现拾取功能的注意事项: void Test::doSelection(int xPos, int yPos) { GLfloat aspec ...
- android 项目学习随笔二十(屏幕适配)
1.图片适配 放入相同名称的资源文件,机器根据不同分辨率找相近的资源 240*320 ldpi 320*480 mdpi 480*800 hdpi 720*1280 xhdpi 2.布局适配 在不同的 ...