Вопрос:

Что происходит, когда происходит сбой активности?

android android-service ipc android-service-binding bindservice

186 просмотра

1 ответ

0 Репутация автора

У меня есть сервис, созданный так:

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

Затем я реализую onBindтак:

  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);  
  }

Это довольно просто: Activity привязывается к Сервису и настраивает слушателя. Когда служба получает сообщение, она просто запускает слушателя

Теперь большой вопрос: что произойдет, если активность внезапно рухнет? В таком случае mListenerукажет на что-то несуществующее, нет?

Как, прежде чем позвонить mListener.onMessageReceived(remoteMessage), я могу проверить, жива ли связанная Деятельность?

Автор: user7898586 Источник Размещён: 21.04.2017 11:36

Ответы (1)


2 плюса

761 Репутация автора

Решение

Вы можете использовать WeakReference и DeadObjectException, поскольку вы, Activityкажется, находитесь в другом приложении. Это позволит вам узнать, Activityбыл ли мусор собран, потому что ваша ссылка станет, nullи вы не будете течь.

private WeakReference<MyListener> mListener;

Вот как вы храните WeakReference.

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

Вот как вы это используете.

@Override
public void onMessageReceived(RemoteMessage remoteMessage) 
{
    MyListener listener = mListener.get();

    if(listener != null)
    {
        try
        {
            listener.onMessageReceived(remoteMessage);  
        }
        catch(DeadObjectException exception)
        {

        }
    }
    else
    {
        // Activity was destroyed.
    }
}
Автор: Newtron Labs Размещён: 21.04.2017 11:59
Вопросы из категории :
32x32