Datenfluss zwischen Android -Sender, ContentProvider und Aktivität?
Frage
Ich habe eine Anwendung entwickelt, die eine Sendung erhält und dann eine auf den Markt bringt Activity
, wo das Activity
Abfragen a ContentProvider
Das zieht Informationen in Echtzeit aus dem DNS.
Ich möchte das mischen können, damit 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(...);
}
es geht:
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()
Gibt keine Daten zurück, die ich verpassen möchte, um das zu startenActivity
, und lassen Sie die Sendungsnachricht wie gewohnt durchfallen.
Wenn die query()
Gibt Daten zurück, ich möchte das Cursor
an die geliefert werden Activity
, damit ich nicht wieder nach den Daten abfragen muss.
Wiederum die Activity
hat eine eigene Benutzeroberfläche, auf die der Benutzer reagieren muss.
Ist das möglich?
Lösung
Was Sie wollen, ist für mich etwas schwierig und ziemlich 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 hat genau den gleichen Effekt, der Cursor wird nur einmal geladen und die Aktivität wird nur angezeigt, wenn im Cursor etwas vorhanden ist. Der einzige zusätzliche Overhead ist, dass die Absicht entlassen wird, egal was passiert, aber das ist nicht genau anstrengend :)
Beachten Sie, dass es auch kein Flacker oder irgendetwas gibt. Android behandelt den Fall eines Anrufs in OnCreate () (ich glaube auch OnStart und Onresume), damit der Benutzer nie weiß, dass dies passiert ist.
Andere Tipps
Sie müssen einen Cursor finden oder erstellen, der serialisierbar oder parzelbar ist (und dann intent.setExtra ()). Oder ist es möglich, stattdessen alle Daten als Paket zu lesen und an die Aktivität weiterzugeben?