Компонент архитектуры 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 2

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) {

        }
    }
}

Спасибо.