android:sharedUserIdandroid
当APK安装的时候,userid这个标志就会产生。APK在设备上的整个生命周期中,这个ID再也不改变。不一样设备上同一个应用包可能有不一样的userid,重要的是在给定的设备上,每一个应用包有本身独立的userid。
userid的特色:
1. 做为APK身份的标识 2. userid对应一个Linux用户,因此不一样APK(用户)间互相访问数据默认是禁止的.
那么不一样APK之间想要互相访问数据应该怎么办呢?sql
Android为咱们提供了两种数据互访的方法:
一是使用Share Preference. / Content Provider
APK经过指定接口和数据供其它APK读取,开发者须要实现接口和指定share的数据。【此方法后面再详细讲解】
二是在配置文件manifest中配置相同的UserId
经过共享userid,拥有相同userid的用户能够配置成运行在同一进程当中,所以默认就是能够互相访问任意数据的
也能够配置为不一样进程当中,彼此之间就像访问本身的数据同样访问彼此的数据库和文件。
例子:
应用程序1:com.wirelessqa.sqlite
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.wirelessqa.sqlite"数据库
android:versionCode="1"安全
android:versionName="1.0"app
android:sharedUserId="wirelessqa.com">less
应用程序2:com.wirelessqa.activityide
<manifestxmlns:android="http://schemas.android.com/apk/res/android"
package="com.wirelessqa.activity"
android:versionCode="1"
android:versionName="1.0"
android:sharedUserId="wirelessqa.com">this
这两个应用程序的userid相同,都为wirelessqa.com,所以两个应用程序共享userid,若是1想访问2的数据怎么办呢?线程
Content content = this.createPackageContent(“com.wirelessqa.activity”,Content.CONTENT_IGNORE_SECURITY);sqlite
这样经过content能够获取到应用2中的资源,包括:数据库,preference,资源文件等等
注意:
基于安全考虑,两个package须要有相同的签名,不然没有验证,应用程序一旦设置了shareuserid,当程序被破解,其它应用也能够访问咱们的数据,数据不安全设置共享也就没有多大意义了。
总结:
若是想要不一样的APK之间共享数据须要知足如下条件:
1.APK的签名必须相同
2.android:shareUserId的值必须相同
3.若是想要运行在同一个进行当中,必须设置android:process的值相同。
application设置应用程序的所有组件都运行在某个线程中
view source
<application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name"
android:theme="@style/AppTheme" android:process="wqa.com">
android:sharedUserLabel
这个属性给共享的userid定义了一个用户可读的标签。这个标签必须用字符串资源来设置,不能使用原生的字符串。
这个属性在API Level 3中被引入,只有在sharedUserId属性被设置,这个属性才有意义。