Flux de données entre Android BroadcastReceiver, ContentProvider et Activity?
Question
J'ai développé une application qui reçoit une diffusion, puis
lance un Activity
, où ContentProvider
interroge un query()
qui extrait les informations du DNS en temps réel.
Je voudrais pouvoir mélanger cela afin qu'au lieu d'aller:
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(...);
}
ça 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(...);
}
i.e. si le Cursor
ne renvoie aucune donnée, je souhaite rater le lancement du
<=>, et laissez le message Diffuser s'écouler normalement.
Si le <=> renvoie les données, je souhaite que <=> soit fourni à le <=>, de sorte que je n'ai pas à aller chercher à nouveau les données.
À son tour, le <=> possède sa propre interface utilisateur à laquelle l'utilisateur doit répondre.
Est-ce possible?
La solution
Ce que vous voulez est un peu difficile et pour moi plutôt inefficace. Je vous proposerais d'utiliser la première alternative, mais lorsque vous chargez le curseur dans l'activité, vérifiez s'il n'y a pas de données, puis quittez l'activité.
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(...);
}
Cela aura exactement le même effet, le curseur ne sera chargé qu'une seule fois et l'activité ne sera affichée que s'il y a quelque chose dans le curseur. La seule surcharge supplémentaire est que l'intention est déclenchée quoi qu'il arrive, mais ce n'est pas vraiment taxant :)
Notez qu’il n’y aura pas de scintillement ni quoi que ce soit, Android gère le cas de la fin de l’appel dans onCreate () (je crois que onStart et onResume également) afin que l’utilisateur ne sache jamais que cela s’est passé.
Autres conseils
Vous devez rechercher ou créer un curseur qui est Serializable ou Parcelable (puis utiliser intent.setExtra ()). Ou peut-être est-il possible de lire toutes les données dans un colis et de les transmettre à l'activité?