5

ブロードキャストを受信するアプリケーションを開発した後、 がActivityを起動します。Activityは、ContentProvider を照会し、DNSから情報をリアルタイムで取得します。Android BroadcastReceiver、ContentProvider、およびActivity間のデータフロー?

私はそのように代わりに行くの本をシャッフルできるようにしたいと思います:

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があります。

これは可能ですか?

答えて

5

あなたが望むのはやや難しく、私にとってはむしろ非効率です。最初の選択肢を使用することを提案しますが、アクティビティでCursorをロードするときに、データがないかどうかを確認して、アクティビティを終了します。

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も信じている)、ユーザーはそれが起こったことを知らない。

+0

ok、良いとは言えますが、context.startActivity()の呼び出しはいつ返されますか? – Alnitak

+0

と、どのようにActivityが何か有用なことをしたかどうかをBroadcastReceiverに知らせますか? AFAIK私は、StartActivityForResult()をBroadcastReceiverで使用することはできません。 – Alnitak

+0

context.startActivityの呼び出しは即座に戻ります。本質的には、メインイベントスレッドが解放されるとすぐに後で開始されるアクティビティのスケジュールです。 – sooniln

0

シリアライズ可能またはパーセル可能なカーソルを見つけたり、作成したりしてから、intent.setExtra()を使用する必要があります。あるいは、パーセルとしてすべてのデータを読み込んでアクティビティに渡すことは可能でしょうか?

+0

それは私の考えのようなものでもあります。おそらくParcelableです。実際にはアクティビティはListActivityなので、ListAdapterを通してデータを渡す必要があります。 – Alnitak

関連する問題