5

ブロードキャストを受信して​​ を起動するアプリケーションを開発しました。 これは、リアルタイムで DNS から情報を取得するクエリActivityを実行します。ActivityContentProvider

これをシャッフルして、次の代わりに実行できるようにしたいと思います。

BroadcastReceiver.onReceive() {
  Intent intent = new Intent(...);
  intent.setData(...); // set a single String data
  context.startActivity(intent);
}

Activity.onCreate() {
  String value = intent.getData();  // get the String data
  Cursor = ContentProvider.query(search);
  ...
  setContentView(...);
}

それは行く:

BroadcastReceiver.onReceive() {
  Cursor = ContentProvider.query(...);
  if (cursor != null) {
     Intent intent = new Intent(...);
     // how do I pass the cursor?
     getContext().startActivity(intent);
  }
}

Activity.onCreate() {
  // how do I retrieve the cursor?
  setContentView(...);
}

つまり、query()がデータを返さない場合は、 の起動を逃して Activity、ブロードキャスト メッセージを通常どおりに通過させます。

query()がデータを返す場合は、それCursorを に提供してActivity、再度データをクエリする必要がないようにします。

にはActivity、ユーザーが応答する必要がある独自の UI があります。

これは可能ですか?

4

2 に答える 2

6

あなたが望むものはやや難しく、私にとってはかなり非効率的です。最初の代替案を使用することをお勧めしますが、アクティビティにカーソルをロードするときに、データがないかどうかを確認してからアクティビティを終了します。

BroadcastReceiver.onReceive() {
  Intent intent = new Intent(...);
  intent.setData(...); // set a single String data
  context.startActivity(intent);
}

Activity.onCreate() {
  String value = intent.getData();  // get the String data
  Cursor = ContentProvider.query(search);

  if(cursor.isEmpty() ...){
    finish();
    return;
  }
  ...
  setContentView(...);
}

これはまったく同じ効果があり、カーソルは一度だけ読み込まれ、カーソルに何かが存在する場合にのみアクティビティが表示されます。唯一の余分なオーバーヘッドは、何があってもインテントが起動されることですが、それは正確に負担になるわけではありません:)

ちらつきも何もないことに注意してください.AndroidはonCreate()でfinishを呼び出すケースを処理します(onStartとonResumeも信じています)ので、ユーザーはそれが起こったことを決して知りません.

于 2009-03-19T18:14:49.167 に答える
0

Serializable または Parcelable の Cursor を検索または作成する必要があります (その後、intent.setExtra() を使用します)。あるいは、代わりにすべてのデータを小包として読み取り、それをアクティビティに渡すことは可能でしょうか?

于 2009-03-19T15:13:29.457 に答える