5

He desarrollado una aplicación que recibe una difusión y luego lanza un Activity, donde Activity consulta un ContentProvider que extrae información del DNS en tiempo real.Flujo de datos entre Android BroadcastReceiver, ContentProvider y Activity?

Me gustaría ser capaz de mezclar esto para que en vez 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 los query() no devuelve datos quiero perder la oportunidad de lanzamiento Activity, y permite que el mensaje de difusión se caiga de forma normal.

Si el query() qué retorno de datos, quiero que Cursor a suministrar a la Activity, de modo que no tengo que ir a la consulta de los datos de nuevo.

A su vez, el Activity tiene su propia interfaz de usuario a la que el usuario debe responder.

¿Esto es posible?

Respuesta

5

Lo que quiere es algo difícil y para mí, bastante ineficiente. Yo 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 sólo se carga una vez, y sólo se mostrará la actividad si existe algo en el cursor. La única sobrecarga adicional es que la intención es disparar sin importar qué, pero eso no es exactamente agotador :)

Tenga en cuenta que tampoco habrá ningún parpadeo ni nada, Android maneja el caso de finalizar la llamada en onCreate() (Creo en Start y OnResume también) para que el usuario nunca sepa que sucedió.

+0

bien, suena bien, pero, ¿cuándo regresa la llamada a context.startActivity()? – Alnitak

+0

y ¿cómo informo al BroadcastReceiver si la actividad hizo algo útil? AFAIK No puedo usar startActivityForResult() en un BroadcastReceiver. – Alnitak

+0

La llamada a context.startActivity devuelve inmediatamente, esencialmente, todo lo que hace es programar la actividad que se iniciará en un momento posterior tan pronto como el hilo del evento principal esté libre. – sooniln

0

Tendrá que encontrar o hacer un Cursor que sea Serializable o Parcelable (y luego use intent.setExtra()). ¿O tal vez es posible leer todos los datos como un paquete y pasar eso a la Actividad?

+0

eso también es mi forma de pensar - probablemente Parcelable, ya que la Actividad es en realidad una Actividad de Lista, así que necesito pasar los datos a través de un ListAdapter. – Alnitak

Cuestiones relacionadas