5

Ho sviluppato un'applicazione che riceve una trasmissione e quindi avvia uno Activity, dove tale Activity interroga uno ContentProvider che estrae informazioni dal DNS in tempo reale.Flusso di dati tra Android BroadcastReceiver, ContentProvider e Activity?

mi piacerebbe essere in grado di mescolare questo 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(...); 
} 

vale a dire se i query() restituisce alcun dato voglio perdere varo Activity e consentire al messaggio Broadcast di passare normalmente.

Se il query() fa restituire i dati, voglio che Cursor da fornire al il Activity, in modo che non devo andare a query per i dati di nuovo.

A sua volta, lo Activity dispone di un'interfaccia utente a cui l'utente deve rispondere.

È possibile?

risposta

5

Quello che vuoi è un po 'difficile e per me, piuttosto inefficiente. Proporrei di utilizzare la prima alternativa, ma quando carichi 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(...); 
} 

Questo avrà lo stesso effetto esattamente, il cursore viene caricato solo una volta, e l'attività viene visualizzata solo se esiste qualcosa nel cursore. L'unico overhead in più è che l'intento viene licenziato indipendentemente da cosa, ma non è esattamente tassativo :)

Nota che non ci sarà nemmeno uno sfarfallio o nulla, Android gestisce il caso della chiamata finale su onCreate() (Credo onStart e onResume pure) in modo che l'utente non sappia mai che è successo.

+0

ok, suona bene - ma - quando viene restituita la chiamata a context.startActivity()? – Alnitak

+0

e come faccio a sapere al BroadcastReceiver se l'attività ha fatto qualcosa di utile? AFAIK Non posso usare startActivityForResult() in un BroadcastReceiver. – Alnitak

+0

La chiamata a context.startActivity restituisce immediatamente, in sostanza, tutto ciò che fa è pianificare l'attività da avviare in un secondo momento, non appena il thread dell'evento principale è libero. – sooniln

0

È necessario trovare o creare un Cursore serializzabile o Parcelable (quindi utilizzare intent.setExtra()). O forse è possibile invece leggere tutti i dati in un pacco e passarlo all'attività?

+0

è una specie di mio pensiero anche - probabilmente Parcelable, in quanto l'Activity è in realtà un ListActivity quindi ho bisogno di passare i dati attraverso un ListAdapter. – Alnitak