Flusso di dati tra Broadcastreceiver Android, ContentProvider e attività?
Domanda
Ho sviluppato un'applicazione che riceve una trasmissione e quindi lancia un Activity
, dove quello Activity
domande a ContentProvider
che estrae le informazioni dal DNS in tempo reale.
Mi piacerebbe poterti mescolare in modo che invece di andare:
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(...);
}
va:
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(...);
}
cioè se il query()
non restituisce dati che voglio perdere il lancio delActivity
, e consentire al messaggio di trasmissione di cadere normalmente.
Se la query()
restituisce dati, lo voglio Cursor
da fornire al Activity
, in modo da non dover andare di nuovo a interrogare per i dati.
A sua volta, il Activity
ha una propria interfaccia utente a cui l'utente deve rispondere.
È possibile?
Soluzione
Quello che vuoi è un po 'difficile e per me, piuttosto inefficiente. Propongo di utilizzare la prima alternativa, ma quando si carica il cursore nell'attività, controlla se non ci sono dati e quindi esci dall'attività.
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(...);
}
Ciò avrà lo stesso identico effetto, il cursore verrà caricato solo una volta e l'attività verrà visualizzata solo se esiste qualcosa nel cursore. L'unico sovraccarico extra è che l'intento viene licenziato, non importa cosa, ma non è esattamente tassa: :)
Nota che neanche non ci sarà alcuna sfarfallio o altro, Android gestisce il caso di chiamare la finitura in suCreate () (credo anche onstart e onResume) in modo che l'utente non sappia mai che è successo.
Altri suggerimenti
Dovrai trovare o creare un cursore serializzabile o parlabile (e quindi utilizzare intent.setextra ()). O forse è possibile invece leggere tutti i dati come pacco e trasmetterli all'attività?