2

アプリケーション ("Bar") から情報を取得するには、サード パーティのアプリケーション ("Foo") が必要ですが、これまでのところ私のソリューションは面倒です。

  • アプリケーション Foo は Bar からの情報を必要とし、ブロードキャスト ("bar.POLL") を送信します。
  • Application Bar はこのブロードキャストをリッスンし、別のブロードキャスト ("bar.PUSH") で応答します。
  • Foo は bar.PUSH をリッスンし、含まれている Bundle の内容を読み取ります。

これを行うより直接的な方法はありますか?

編集: Guidoが提案したように、非常に単純な ContentProvider で解決しました:

public class MyProvider extends ContentProvider {
  private String state = "";

  @Override
  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    MatrixCursor cursor = new MatrixCursor(new String[]{"state"});
    cursor.addRow(new Object[]{state});
    return cursor;
  }

  @Override
  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    state = (String) values.get("state");
    return 1;
  }

  @Override
  public boolean onCreate() {
    return true;
  }

  @Override
  public String getType(Uri uri) {
    return null;
  }

  @Override
  public Uri insert(Uri uri, ContentValues values) {
    return null;
  }

  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
    return 0;
  }    
}

プロバイダーをマニフェストに追加することを忘れないでください。

<provider android:name=".MyProvider" android:authorities="com.example.hello" />

次のようにアクティビティから状態を更新します。

ContentValues cv = new ContentValues();
cv.put("state", "myNewState");
getContext().getContentResolver().update(Uri.parse("content://com.example.hello"), cv, null, null);

外部アプリでプロバイダーからコンテンツを取得します。

Cursor cur = managedQuery(Uri.parse("content://com.example.hello"), null, null, null, null);
if (cur.moveToFirst()) {
  String myContent = cur.getString(0);
}
4

1 に答える 1

5

ContentProviderを公開する必要があります。

"コンテンツ プロバイダは、データを保存および取得し、すべてのアプリケーションからアクセスできるようにします。コンテンツ プロバイダは、アプリケーション間でデータを共有する唯一の方法です。すべての Android パッケージがアクセスできる共通のストレージ領域はありません。 "

コンテンツ プロバイダーは、プロバイダーにクエリを実行して結果を返すための共通インターフェイスを実装します。実装するのは難しくありませんが、公式ドキュメントはそれを始めるのに最適ではないかもしれません. 他の例は次の場所にあります。

于 2010-09-06T08:37:59.883 に答える