Android之用sharedUserId來實現不一樣應用(APK)數據共享

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屬性被設置,這個屬性纔有意義。

相關文章
相關標籤/搜索