2011年9月6日火曜日

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

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

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


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

【作成するサンプル】SampleA
データを簡単に保存する方法(SQLite編)
◆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をしている情報が取得できている事がわかります。

0 件のコメント:

コメントを投稿