Компонент архитектуры Android LiveData - как привязать broadcastReceivers к жизненному циклу
Используя Android LiveData я хотел бы иметь возможность отменить регистрацию и зарегистрировать много BroadcastReceiver
s в onInactive()
и onActive()
обратных вызовах. Поэтому я хочу сделать что-то вроде этого:
public class BroadcastRecieverLiveData extends LiveData<BroadCastReciever> {
private BroadcastReciever reciever;
private Context context;
public BroadcastRecieverLiveData(Context context) {
this.context = context;
}
@Override
protected void onActive() {
IntentFilter filter = new IntentFilter();
filter.addAction("SOME_ACTION");
filter.addAction("SOME_OTHER_ACTION");
reciever = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//do something based on the intent's action
}
};
registerReceiver(reciever, filter);
}
@Override
protected void onInactive() {
if (reciever != null) {
context.unregisterReceiver(reciever);
}
}
}
Я думал, что это может быть шаблон дизайна, который будет очищен от кода вместо ретрансляции на onDestroy
. Что вы думаете об использовании LiveData таким образом? Вот пример его использования здесь
1 ответ:
Я думаю, что для приемников вы должны реализовать
LifecycleObserver
. Согласно документацииLiveData
от Google codelab,Внимание: сохранение ссылки на контекст или представление в ViewModel может это приводит к утечкам памяти. Избегайте полей, ссылающихся на экземпляры Классы контекста или представления. Метод onCleared() полезен для отписаться или очистить ссылки на другие объекты с более длинным жизненный цикл, но не для очистки ссылок на контекст или представление объекты.
Таким образом, вы не должны делать контекстно-интенсивную операцию в LiveData.
Вместо этого возьмем пример реализации ниже,
import android.arch.lifecycle.Lifecycle; import android.arch.lifecycle.LifecycleObserver; import android.arch.lifecycle.LifecycleOwner; import android.arch.lifecycle.OnLifecycleEvent; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; public class ReceiverManager implements LifecycleObserver { private final Context mContext; private final MyBrodacastReceiver myBrodacastReceiver; public ReceiverManager(LifecycleOwner lifecycleOwner, Context context) { mContext = context; myBrodacastReceiver = new MyBrodacastReceiver(); lifecycleOwner.getLifecycle().addObserver(this); } @OnLifecycleEvent(Lifecycle.Event.ON_START) void registerYourReceiver() { mContext.registerReceiver(myBrodacastReceiver, new IntentFilter()); } @OnLifecycleEvent(Lifecycle.Event.ON_STOP) void unRegisterYourReceiver() { mContext.unregisterReceiver(myBrodacastReceiver); } private static class MyBrodacastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } } }
Спасибо.