Что происходит, когда происходит сбой активности?
У меня есть сервис, созданный так:
<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)
Могу ли я проверить, жива ли связанная Деятельность?
1 ответ
Решение
Вы можете использовать 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.
}
}