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