¿Flujo de datos entre Android BroadcastReceiver, ContentProvider y Activity?
Pregunta
He desarrollado una aplicación que recibe una transmisión y luego lanza un Activity
, donde es Activity
consultas un ContentProvider
que extrae información del DNS en tiempo real.
Me gustaría poder mezclar esto para que en lugar de ir:
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(...);
}
es decir.Si el query()
no devuelve datos que quiero perder al iniciar elActivity
, y permita que el mensaje de transmisión se transmita normalmente.
Si el query()
devuelve datos, quiero eso Cursor
que se suministrarán a
el Activity
, para no tener que volver a consultar los datos.
A su vez, el Activity
tiene su propia interfaz de usuario a la que el usuario debe responder.
es posible?
Solución
Lo que quieres es algo difícil y, para mí, bastante ineficiente. Le propondría que use la primera alternativa, pero cuando cargue el cursor en la actividad, verifique si no hay datos y luego salga de la actividad.
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(...);
}
Esto tendrá exactamente el mismo efecto, el cursor solo se cargará una vez y la actividad solo se mostrará si algo existe en el cursor. La única sobrecarga adicional es que la intención se dispara sin importar qué, pero eso no es exactamente un impuesto :)
Tenga en cuenta que tampoco habrá ningún parpadeo ni nada, Android maneja el caso de finalizar la llamada en onCreate () (creo que también en onStart y onResume) para que el usuario nunca sepa que sucedió.
Otros consejos
Tendrá que buscar o hacer un cursor que sea serializable o parcelable (y luego usar intent.setExtra ()). ¿O tal vez es posible leer todos los datos como un paquete y pasarlos a la Actividad?