2010-11-09 27 views

Respuesta

10

La comunicación de BroadcastReceiver a Activity es sensible; ¿y si la actividad ya se ha ido?

Si yo fuera tú me gustaría establecer una nueva BroadcastReceiver dentro de la actividad, que recibiría un mensaje de cierre:

private BroadcastReceiver closeReceiver; 
// ... 
closeReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 

    //EDIT: receiving parameters 
    String value = getIntent().getStringExtra("name"); 
    //... do something with value 

    finish(); 
    } 
}; 
registerReceiver(closeReceiver, new IntentFilter(CLOSE_ACTION)); 

Luego, desde el SMS BroadcastReceiver puede enviar a cabo esta acción:

Intent i = new Intent(CLOSE_ACTION); 
i.putExtra("name", "value"); //EDIT: this passes a parameter to the receiver 
context.sendBroadcast(i); 

Espero que esto ayude?

+0

Mhm ... Estoy registrando el Receptor directamente en el Manifiesto ... y necesito intercambiar datos con el Receptor ... – NonoNever

+0

No hay problema. Los datos se pueden enviar utilizando Extras. i.putExtra ("nombre", "valor"); Sin embargo, solo se pueden pasar tipos primitivos. – Emmanuel

+0

Solución rápida: 'context.sendBroadcast (i);' debe usar el contexto BroadcastReceiver para propagar el intento. – GoRoS

1

El problema con el registro de un segundo receptor dentro de la actividad, sin embargo, es que no será persistente, como registrarse en el manifiesto ... por lo tanto, aunque esta solución funcione, solo funcionará si la actividad se está ejecutando fondo.

+2

Esto parece más apropiado como un comentario en lugar de una respuesta. –

0

es fácil, el uso de la interfaz de esa manera:

1) en su receptor de radiodifusión crear una interfaz.

public interface ChangeListener{ 
    public void functionWhoSendData(String type); 
    public void etc(); 
} 

y crear instancias de esa interfaz en su receptor de radiodifusión, lo utilizan:

public void onReceive(.... 
    String data=functionWhereYouReceiveYouData(); 
    ChangeListener.functionWhoSendData(data); 
} 

Y en su actividad, que implementa la interfaz de

+0

cuando lo hago, recibo ClassCastException. Aparentemente, el contexto en onReceive no se puede convertir a la interfaz. – user1007522

2

que tenía exactamente el mismo problema, he intentado usar intento pero no tuve éxito

La forma más fácil de usarlo sería utilizando métodos estáticos y variables estáticas

MainActivity.java

public static void stopsms() 
{ 

/* 
some code to stop the activity 

*/ 

} 

SMSReceiver.java

en el de colgar esta función

MainActivity.stopsms(); 

Funciona increíble si su código no afecta cuando se utiliza estática métodos y variables. Avíseme si necesita ayuda.

+0

¿hay alguna manera de acceder al contexto de maiactivity desde esa función vacía estática? – Dnaso

+2

¿no es esto peligroso, llamando a un método estático sobre la actividad? ¿Qué pasa si la actividad ya no existe? – user1007522

Cuestiones relacionadas