¿Qué ocurre cuando la actividad se bloquea?

Tengo un servicio creado así:

<service android:name="com.myFirebaseMessagingService"> <intent-filter> <action android:name="com.google.firebase.MESSAGING_EVENT"/> </intent-filter> </service> 

Entonces implemento el onBind como esto:

  private final IBinder mBinder = new LocalBinder(); private myListener mListener; public class LocalBinder extends Binder { LocalService getService() { return LocalService.this; } } public void setListener(myListener listener) { mListener = listener; } @Override public IBinder onBind(Intent intent) { return mBinder; } @Override public void onMessageReceived(RemoteMessage remoteMessage) { if (mListener != null) mListener.onMessageReceived(remoteMessage); } 

Es muy simple: la Actividad se enlaza al Servicio y establece un listener. Cuando el Servicio recibe un mensaje simplemente dispara al oyente

Ahora la gran pregunta: ¿qué sucede si la actividad de repente? En ese caso mListener apuntará a algo inexistente, ¿no?

¿Cómo, antes de llamar a mListener.onMessageReceived(remoteMessage) , puedo comprobar si la actividad enlazada todavía está viva?

Puede utilizar una WeakReference y DeadObjectException ya que su Activity parece estar en otra aplicación. Esto le permitirá saber si la Activity fue recolectada de basura porque su referencia se convertirá en null y no se perderá.

 private WeakReference<MyListener> mListener; 

Así es como almacena la WeakReference .

 public void setListener(MyListener listener) { mListener = new WeakReference<MyListener>(listener); } 

Así es como lo usas.

 @Override public void onMessageReceived(RemoteMessage remoteMessage) { MyListener listener = mListener.get(); if(listener != null) { try { listener.onMessageReceived(remoteMessage); } catch(DeadObjectException exception) { } } else { // Activity was destroyed. } } 
  • BindService () devuelve false pero unbindService () necesita ser llamado?
  • GREF que aumenta / que disminuye en servicio multi-hilo (aidl) - qué significa?
  • ¿Cuáles son los mecanismos de IPC disponibles en el sistema operativo Android?
  • ¿Por qué AIDL / Messenger está enlazado a un Servicio?
  • Java.io.IOException: write failed: EPIPE (Broken pipe)
  • Cada actividad en Android es un proceso o una aplicación es un proceso
  • Android ResultReceiver a través de paquetes
  • Handler en Android
  • Cómo realizar la comprobación nula IPC manual
  • Rendimiento de Android ContentProvider
  • Cómo pasar un socket Bluetooth a otra actividad mediante la interfaz de la aplicación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.