5

Ich habe eine Anwendung entwickelt, die eine Broadcast empfängt und dann startet eine Activity, wo Activity Abfragen eine ContentProvider , die Informationen aus dem DNS in Echtzeit extrahiert.Datenfluss zwischen Android BroadcastReceiver, ContentProvider und Aktivität?

Ich möchte in der Lage sein, dies zu mischen, so dass, anstatt zu gehen:

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(...); 
} 

geht es:

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(...); 
} 

dh wenn die query() kehrt keine Daten Ich möchte Abschuss verzichten die Activity, und lassen Sie die Broadcast-Nachricht als normal durchfallen.

Wenn die query() nicht Daten zurück, ich will, dass Cursor die Activity, zu geliefert werden, so dass ich wieder die Daten nicht gehen und Abfrage für.

Der Activity wiederum hat seine eigene Benutzeroberfläche, auf die der Benutzer reagieren muss.

Ist das möglich?

Antwort

5

Was Sie wollen ist etwas schwierig und für mich eher ineffizient. Ich würde vorschlagen, dass Sie die erste Alternative verwenden, aber wenn Sie den Cursor in der Aktivität laden, überprüfen Sie, ob keine Daten vorhanden sind, und beenden Sie dann die Aktivität.

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(...); 
} 

Dies wird genau die gleiche Wirkung hat, wird der Cursor nur einmal geladen werden, und die Aktivität wird nur angezeigt, wenn etwas in den Cursor existiert. Der einzige zusätzliche Overhead ist, dass die Absicht gefeuert wird, egal was, aber das ist nicht gerade anstrengend :)

Beachten Sie, dass es auch kein Flimmern oder irgendetwas geben wird, Android behandelt den Fall des Aufrufs in onCreate() beenden() (Ich glaube auch an Start und onResume), so dass der Benutzer nie weiß, dass es passiert ist.

+0

ok, hört sich gut an - aber - wann kommt der Aufruf von context.startActivity() zurück? – Alnitak

+0

und wie kann ich den BroadcastReceiver wissen, ob die Aktivität etwas nützliches getan hat? AFAIK Ich kann startActivityForResult() in einem BroadcastReceiver nicht verwenden. – Alnitak

+0

Der Aufruf von context.startActivity erfolgt sofort, im Wesentlichen wird lediglich geplant, dass die Aktivität zu einem späteren Zeitpunkt gestartet wird, sobald der Main Event-Thread frei ist. – sooniln

0

Sie müssen einen Cursor finden, der serialisierbar oder parzellierbar ist (und dann intent.setExtra() verwenden). Oder ist es möglich, stattdessen alle Daten als Paket zu lesen und an die Aktivität weiterzuleiten?

+0

das ist auch meine Art zu denken - wahrscheinlich Parcelable, da die Aktivität eigentlich eine ListActivity ist, also muss ich die Daten über einen ListAdapter übergeben. – Alnitak