Android Architecture组件LiveData-如何将广播接收器绑定到生命周期

j2e*_*nue 4 android android-livedata android-architecture-components

采用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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我以为这可能是清理代码而不是继续使用代码的设计模式onDestroy。您对以这种方式使用LiveData有什么想法?有使用它的一个例子在这里

And*_*eky 6

我认为对于接收者,您应该实施LifecycleObserver。根据LiveDataGoogle codelab的文档,

警告:在ViewModel中存储对Context或View的引用可能会导致内存泄漏。避免引用Context或View类实例的字段。onCleared()方法对于取消订阅或清除具有较长生命周期的其他对象的引用很有用,但对于清除对Context或View对象的引用则不起作用。

因此,您不应在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) {

        }
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢。