2010-02-17 12 views
23

Quizás es fácil, pero realmente no podía resolver esto hasta ahora ... Recibí un BroadcastReceiver esperando a ser activado por el AlarmMangager - esto funciona bien.Informar Actividad desde un BroadcastReceiver SOLAMENTE si está en primer plano

Ahora: porque el evento, si se produce, tiene que actualizar algunos elementos en la pantalla de la actividad principal, me gustaría enviar un Intento de ese fondo BroadcastReceiver a mi Actividad - pero sólo si está actualmente en el primer plano, también conocido como activo.

Si no se está ejecutando o no está visible, no me importa, ¡y lo último que quiero hacer es comenzar la Actividad por mi intención! Manejo el repintado de las vistas en mi método onResume(), así que no me importa en absoluto.

¿Alguna pista sobre cómo hacerlo? Gracias!

EDIT: mi BroadcastReceiver está esperando alarmas que deben notificarse al usuario. Por lo tanto, debe estar allí y declararse en el manifiesto. El problema es: tendrá que decidir si la Actividad mencionada está actualmente al frente o no.

Respuesta

37

Así que esto es casi la respuesta de Bino, pero: en vez de mo Si el receptor entra en la actividad, use dos receptores con diferentes Intents. El primero es su intención de alarma original, con un receptor registrado en el manifiesto como ya lo tiene, y luego ese receptor envía un segundo intento de transmisión, que es manejado por un receptor registrado por la actividad como dice Bino.

He hecho esto en mi propio proyecto de temporizador, en github. Aquí están el alarm receiver y el requery receiver. Espero que ayude.

+0

Gracias por una solución fácil que no pensé aún :) –

+0

Perfecto - ¡justo lo que estaba buscando! +1 a ti. – barry

+0

Exactamente lo que estaba buscando. – wendelbsilva

42

Creo que ya estás familiarizado con AlarmManager (creando una nueva alarma, registrando un receptor ...) así que no voy a hablar de eso. Solo dale una solución para tu pregunta.

En lugar de registrar un BroadcastReceiver en un archivo de clase y en manifiesto, solo crea un nuevo BroadcastReceiver en su actividad y luego lo registra en el método onResume y lo anula en método onPause, así en su actividad:

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     //do something  
    } 
}; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    mIntentFilter = new IntentFilter(); 
    mIntentFilter.addAction("your alarm action"); 
    ... 
} 

@Override 
protected void onResume() { 
registerReceiver(mIntentReceiver, mIntentFilter); 
    ... 
super.onResume(); 
} 

@Override 
protected void onPause() { 
unregisterReceiver(mIntentReceiver); 
    ... 
super.onPause(); 
} 

el receptor sólo recibirá la intención de alarma cuando su actividad es en primer plano :)

(lo siento si mi Inglés no está claro)

+2

¡Hola Bino! Gracias por su respuesta. Ya veo, tengo que actualizar mi pregunta ya que su respuesta podría imponer un nuevo problema ... Necesito que el BroadcastReceiver ** siempre ** esté allí, no SOLO si la actividad se está ejecutando y en primer plano. Es una alarma, precisamente, informará al usuario sobre un autobús que quiere atrapar. Ahora: las alarmas deben ser notificadas independientemente de lo que esté haciendo la actividad. PERO: si, y solo si está activo y en primer plano, necesito actualizar una casilla que indica que esta alarma específica ya no está configurada. :-( – Zordid

Cuestiones relacionadas