天天看點

Android 多個APK共享資料(Shared User ID)

Android給每個APK程序配置設定一個單獨的使用者空間,其manifest中的userid就是對應一個Linux 使用者

(Android 系統是基于Linux)的.

是以不同APK(使用者)間互相通路資料預設是禁止的.

但是它也提供了2種APK間共享資料的形式:

1. Share Preference. / Content Provider

APK可以指定接口和資料給任何其他APK讀取. 需要自己實作接口和Share的資料.

本文對于這個不做詳細解釋

2. Shared User id

通過Shared User id,擁有同一個User id的多個APK可以配置成運作在同一個程序中.是以預設就是

可以互相通路任意資料. 也可以配置成運作成不同的程序, 同時可以通路其他APK的資料目錄下的

資料庫和檔案.就像通路本程式的資料一樣.

比如某個公司開發了多個Android 程式, 那麼可以把資料,圖檔等資源集中放到APK  A中去. 然後

這個公司的所有APK都使用同一個User ID, 那麼所有的資源都可以從APK A中讀取.

舉個例子:

APK A 和APK B 都是C公司的産品,那麼如果使用者從APK A中登陸成功.那麼打開APK B的時候就不用

再次登陸. 具體實作就是 A和B設定成同一個User ID:

    * 在2個APK的AndroidManifest.xml 配置User ID:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"

    package="com.android.demo.a1"

    android:sharedUserId="com.c">

   這個"com.c" 就是user id, 然後packagename APK A就是上面的内容,  APK B可能

   是"com.android.demo.b1" 這個沒有限制

這個設定好之後, APK B就可以像打開本地資料庫那樣 打開APK A中的資料庫了.

APK A把登陸資訊存放在A的資料目錄下面. APK B每次啟動的時候讀取APK A下面的資料庫

判斷是否已經登陸:

APK B中的代碼:

            friendContext = this.createPackageContext(

                    "com.android.demo.a1",

                    Context.CONTEXT_IGNORE_SECURITY);

通過A的package name 就可以得到A的 packagecontext

通過這個context就可以直接打開資料庫.