sharedUserIdを使って他のアプリケーションデータにアクセスする


Androidのアプリケーションは、基本的に1アプリケーション1プロセス(1UserId)で実行されます。
本エントリで紹介するAndroidManifestに指定するsharedUserId要素を使用することで、
複数のアプリケーションを同一プロセス(同一UserId)で起動することができ、
相互にアプリケーションデータにアクセスすることが可能となります。

サンプル実行時psコマンドの実行結果
org.techbooster.sampleA     → 本エントリで作成する「SampleA」プロジェクト
org.techbooster.SQLiteSample → 以前紹介した「SQLiteSample」プロジェクト

本エントリでは、sharedUserIdを以下サンプルを用いて解説していきます。

【作成するサンプル】SampleA
TechBoosterで以前にご紹介したSQLiteのサンプル(以下記事リンク)にアクセスし、最後に追加されたテーブルにアクセスするサンプル

以前に紹介した、SQLiteSampleは以下リンクを参照ください。

それでは、続きをどうぞ

◆sharedUserIdを使用する

sharedUserId要素の使用方法は非常に簡単です。
同一UserIdとする、「SQLiteSample」「SampleA」プロジェクトのAndroidManifest.xmlのmanifestタグに
android:sharedUserId要素を追加します。

また、追加する際には以下に気をつけましょう。

  • 双方のプロジェクトに同要素を追加します。
  • “app.techbooster”には、package名と同様に一つ以上”.”を含む必要があります。
1
2
3
4
5
      package="org.jpn.techbooster.sampleA"
      android:versionCode="1"
      android:versionName="1.0"
      android:sharedUserId="app.techbooster">

以上で、「SQLiteSample」「SampleA」プロジェクトは同一UserIdで実行される事になります。

「SampleA」プロジェクトから「SQLiteSample」プロジェクトのDatabaseへのアクセスは、
以下手順で実施します。

1.アクセスしたいアプリケーションのパッケージ名を使用しActivity#createPackageContextでContextを作成する。
2.作成したContextを使いSQLiteOpenHelperを継承したクラスを作成
3.DBへのアクセス

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Contextの取得
try {
    mContext = this.createPackageContext(
            "org.jpn.techbooster.SQLiteSample",
            Context.CONTEXT_RESTRICTED);
 
    MySQLiteOpenHelper hlpr = new MySQLiteOpenHelper(mContext);
    mydb = hlpr.getWritableDatabase();
 
} catch (NameNotFoundException e) {
    e.printStackTrace();
}
 
// 全データを検索
Cursor cursor = mydb.query("mytable", new String[] { "_id", "data" },
        null, null, null, null, "_id DESC");
startManagingCursor(cursor);
 
// cursorを先頭へ移動し、情報を取得
cursor.moveToFirst();
String newId = cursor.getString(0);
String newData = cursor.getString(1);
 
// TextViewへの出力
TextView mTextView = (TextView) findViewById(R.id.textview1);
mTextView.setText("get from" + mContext.getPackageName() + "\n"
        + " DB data -> [" + newId + "] [" + newData + "]");

実行結果のスクリーンショットは以下のようになります。
SQLiteSampleにおいて、5回ADDをしている情報が取得できている事がわかります。