Android中@id与@+id区别和sharedUserId属性详解
Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值。
id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc、@+id/xyz等。 如果在@后面使用“+”,表示当修改完某个布局文件并保存后,系统会自动在R.Java文件中生成相应的int类型变量。变量名就是“/”后面的值,例如,@+id/xyz会在R.java文件中生成int xyz = value,其中value是一个十六进制的数。如果xyz在R.java中已经存在同名的变量,就不再生成新的变量,而该组件会使用这个已存在的变量的值。 也就是说,如果使用@+id/name形式,当R.java中存在名为name变量时,则该组件会使用该变量的值作为标识。如果不存在该变量,则添加一个新的变量,并为该变量赋相应的值(不会重复)。 既然组件的id属性是一个资源id就可以,那么自然可以设置任何已经存在的资源id值,例如,@drawable/icon、@string/ok、@+string/you等。当然,也可以设置android系统中已存在的资源id,例如,楼主提出的@id/android:list,那么这个android是什么意思呢,实际上,这个android就是系统的R类(在R.java文件中)所在的package。我们可以在Java代码编辑区输入android.R.id.,就会列出相应的资源id,例如,也可以设置id属性值为@id/android:message。
<ListView
android:id="@+id/android:message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
还有另外一种方法查看系统中定义的id,进入
<android sdk安装目录>\platforms\android-1.5\data\res\values目录,找到ids.xml文件,打开后,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<item type="id" name="price_edit">false</item>
<item type="id" name="amount_edit">false</item>
</resources>
参考来源:http://wenku.baidu.com/view/c6cda2ef856a561252d36ff5.html
若在ids.xml中定义了ID,则在layout中可如下定义@id/price_edit,否则@+id/price_edit
简单来讲:
@+id 新增一个资源id
@id和android:id,引用现有的资源id
在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:sharedUserId="com.mythou.share" >
//.......
//第二个应用程序的menifest文件代码如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.mythou.clientID"
.......
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等的数据,有三个办法可以方便共享数据。
a、完全暴露,这就是android:exported=”true”的作用,而一旦设置了intentFilter之后,exported就默认被设置为true了,除非再强制设为false。当然,对那些没有intentFilter的程序体,它的exported属性默认仍然是false,也就不能共享出去。
b、权限提示暴露,这就是为什么经常要设置usePermission的原因,如果人家设置了 android:permission=”xxx.xxx.xx”那么,你就必须在你的application的Manufest中 usepermission xxx.xxx.xx才能访问人家的东西。
c、私有暴露,假如说一个公司做了两个产品,只想这两个产品之间可互相调用,那么这个时候就必须使用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相同,包名相同或不同,打包时签名文件必须相同,否则在如下情况下
1.包名相同,签名相同,ShareUserId不同
2.包名相同或不同,ShareUserId相同,签名不同
第二个安装包在安装时会失败,错误为[INSTALL_FAILED_SHARED_USER_INCOMPATIBLE]
Android中@id与@+id区别和sharedUserId属性详解的更多相关文章
- Android中的sharedUserId属性详解
在Android里面每个app都有一个唯一的linux user ID,则这样权限就被设置成该应用程序的文件只对该用户可见,只对该应用程序自身可见,而我们可以使他们对其他的应用程序可见,这会使我们用到 ...
- Android中Activity运行时屏幕方向与显示方式详解
现在我们的手机一般都内置有方向感应器,手机屏幕会根据所处位置自动进行横竖屏切换(前提是未锁定屏幕方向).但有时我们的应用程序仅限在横屏或者竖屏状态下才可以运行,此时我们需要锁定该程序Activity运 ...
- Android中利用Camera与Matrix实现3D效果详解
本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...
- Android中源码Launcher主屏幕程序排列详解【安卓Launcher进化一】
最近研究Lancher,从短信Mms的框架中过度到Launcher的bug和需求修改中,下面对launcher最简单的主屏幕程序的程序的布局的详 解,给读者一个入门的感觉,android的主屏幕一共分 ...
- Android中的Service与进程间通信(IPC)详解
Service 什么是Service 在后台长期运行的没有界面的组件.其他组件可以启动Service让他在后台运行,或者绑定Service与它进行交互,甚至实现进程间通信(IPC).例如,可以让服务在 ...
- Android中APK签名工具之jarsigner和apksigner详解
一.工具介绍 jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验 ...
- Android中的surfaceHolder.lockCanvas(null)返回为null详解
对于新手学习SurfaceView的时候获取lockCanvas的时候总是返回null的问题很是纠结 canvas = surfaceHolder.lockCanvas(new Rect(0, 0, ...
- Android | 玩转AppBarLayout,设置scrollFlags滑动属性详解
CoordinatorLayout与AppBarLayout的配合使用,在之前的文章中我们也经常使用,主要是专门用来打造各种炫酷的效果. 有童鞋看了之前的文章反馈对AppBarLayout中的scro ...
- Android中的windowSoftInputMode属性详解
这篇文章主要介绍了Android中的windowSoftInputMode属性详解,本文对windowSoftInputMode的9个属性做了详细总结,需要的朋友可以参考下 在前面的一篇文章中 ...
随机推荐
- React前端有钱途吗?《React+Redux前端开发实战》学起来
再不学React就真的跟不上大前端的形式了,目前几乎所有前端的招聘条件都是精通React者优先,看看拉勾网的React薪资,都是15K-20K,这个暑假,必须动起来了. 如果你熟悉JavaScript ...
- Java 从无类型参数Map到有类型参数Map传值的一个问题
import java.util.HashMap; import java.util.Map; public class MapTest { public static void main(Strin ...
- cassandra查询效率探讨
cassandra目前提倡的建表与查询方式为CQL方式,传统的cassandra-cli相关的api由于性能问题将逐步淘汰,而cassandra-cli也将在2.2版本之后被淘汰. 在CQL中,可以利 ...
- vue-cli 4 安装与 新建项目 路由
环境: windows: vue-cli: 编辑器: vsCode npm: #去nodejs网安装https://npm.taobao.org/mirrors/node/v12.12.0/node- ...
- tornada-模板
tornado模板 1.配置模板路径 (project/config.py) # coding=utf-8 import os BASE_DIRS = os.path.dirname(__file__ ...
- 你在和脚本谈恋爱(自动化在IM聊天中的应用)
谢谢打开这篇文章的每个你 测开之分层自动化(Python)招生简章 Python自动化测试报告美化 在python中进行数据驱动测试 太嚣张了!他竟用Python绕过了“验证码” 在网络世界里你不知道 ...
- spark源码本地调试
1.前提条件: 1)安装jdk 版本: 2)安装scala 版本: 3)安装sbt 版本: 4)安装maven 5)安装git 版本: 6)安装idea,并配置好sbt.git.maven 2.从gi ...
- JAVA项目中的常用的异常处理情况总结
可能遇见的异常或错误: 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的.例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略. 运行时异常: ...
- 第二章 Vue快速入门-- 18 v-for中key的使用注意事项
注意:如果属性和方法还没定义直接使用的话,就会报 xxx is not defined 导致界面不能正常显示.我看视频教程里老师的可以直接使用,而且界面正常显示,可能是vue版本不同吗?还不清楚 ...
- poj1952 BUY LOW, BUY LOWER[线性DP(统计不重复LIS方案)]
如题.$N \leqslant 5000$. 感觉自己思路永远都是弯弯绕绕的..即使会做也会被做繁掉..果然还是我太菜了. 递减不爽,先倒序输入算了.第一问做个LIS没什么说的.第二问统计个数,考虑什 ...