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