Android之用sharedUserId来实现不同应用(APK)数据共享
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屬性被設置,這個屬性才有意義。
總結
以上是生活随笔為你收集整理的Android之用sharedUserId来实现不同应用(APK)数据共享的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android插件化开发之DexClas
- 下一篇: Android插件化开发之动态加载三个关