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名と同様に一つ以上”.”を含む必要があります。
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      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へのアクセス

		// 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をしている情報が取得できている事がわかります。