您的位置:首页 > 移动开发 > Android开发

Android之用sharedUserId来实现不同应用(APK)数据共享

2016-11-22 14:10 525 查看


android:sharedUserId

当APK安装的时候,userid这个标志就会产生。APK在设备上的整个生命周期中,这个ID不再改变。不同设备上同一个应用包可能有不同的userid,重要的是在给定的设备上,每个应用包有自己独立的userid。

userid的特点:

1. 作为APK身份的标识 2. userid对应一个Linux用户,所以不同APK(用户)间互相访问数据默认是禁止的.

 

那么不同APK之间想要互相访问数据应该怎么办呢?

Android为我们提供了两种数据互访的方法:

一是使用Share Preference. / Content Provider

APK通过指定接口和数据供其它APK读取,开发者需要实现接口和指定share的数据。【此方法后面再详细讲解】

二是在配置文件manifest中配置相同的UserId

通过共享userid,拥有相同userid的用户可以配置成运行在同一进程当中,因此默认就是可以互相访问任意数据的

也可以配置为不同进程当中,彼此之间就像访问自己的数据一样访问彼此的数据库和文件。


例子:

应用程序1:com.wirelessqa.sqlite

01
<
manifestxmlns:android
=
"http://schemas.android.com/apk/res/android"
02
    
package
=
"com.wirelessqa.sqlite"
03
 
04
    
android:versionCode
=
"1"
05
 
06
    
android:versionName
=
"1.0"
07
 
08
    
android:sharedUserId
=
"wirelessqa.com"
09
 
10
    
>
 

应用程序2:com.wirelessqa.activity

1
<
manifestxmlns:android
=
"http://schemas.android.com/apk/res/android"
2
    
package
=
"com.wirelessqa.activity"
3
    
android:versionCode
=
"1"
4
    
android:versionName
=
"1.0"
5
    
android:sharedUserId
=
"wirelessqa.com"
6
    
>
 

这两个应用程序的userid相同,都为wirelessqa.com,因此两个应用程序共享userid,如果1想访问2的数据怎么办呢?

Content content = this.createPackageContent(“com.wirelessqa.activity”,Content.CONTENT_IGNORE_SECURITY);

这样通过content可以获取到应用2中的资源,包括:数据库,preference,资源文件等等

 

注意:

基于安全考虑,两个package需要有相同的签名,否则没有验证,应用程序一旦设置了shareuserid,当程序被破解,其它应用也可以访问我们的数据,数据不安全设置共享也就没有多大意义了。

 

总结:

如果想要不同的APK之间共享数据需要满足以下条件:

1.APK的签名必须相同

2.android:shareUserId的值必须相同

3.如果想要运行在同一个进行当中,必须设置android:process的值相同。

application设置应用程序的全部组件都运行在某个线程中

view
source

1
<
application
 
android:allowBackup
=
"true"
 
android:icon
=
"@drawable/ic_launcher"
 
android:label
=
"@string/app_name"
2
 
3
        
android:theme
=
"@style/AppTheme"
 
android:process
=
"wqa.com"
>
 


android:sharedUserLabel

这个属性给共享的userid定义了一个用户可读的标签。这个标签必须字符串资源来设置,不能使原生的字符串。

这个属性在API Level 3中被引入,只有在sharedUserId属性被设置,这个属性才有意义。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: