Android Architecture 组件 LiveData - 如何将 broadcastReceivers 绑定(bind)到生命周期

标签 android android-architecture-components android-livedata

使用安卓 LiveData我希望能够在 onInactive()onActive() 回调中注销和注册许多 BroadcastReceiver。所以我想做这样的事情:

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 有何看法?有一个使用它的例子here

最佳答案

我认为对于接收者,你应该实现LifecycleObserver。 根据 Google LiveData 文档 codelab ,

Caution: Storing a reference to a Context or View in a ViewModel can result in memory leaks. Avoid fields that reference instances of the Context or View classes. The onCleared() method is useful to unsubscribe or clear references to other objects with a longer lifecycle, but not for clearing references to Context or View objects.

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

        }
    }
}

谢谢。

关于Android Architecture 组件 LiveData - 如何将 broadcastReceivers 绑定(bind)到生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44270971/

相关文章:

android - 具有多个参数的 MediatorLiveData 或 switchMap 转换

android - 如何在 android 中使用 Room Persistence Library 查询嵌套的嵌入式对象?

android - 没有这样的方法错误: No interface method getOrDefault(Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; in class Ljava/util/Map;

android - http获取传参

android - 如何在 Room 中处理嵌套关系

android - 将 iOS 框架 (Swift/Objective-C) 导入到 Android 应用程序项目中?

android - 更改 LiveData 以更新 RecyclerView。正确的方法?

android - 从 ViewModel 获取数据时如何显示 ProgressDialog

安卓 Activity 周期?当 Activity 像 Whatsapp 一样被销毁时,文本仍然存在?

Android - 声明应用程序仅适用于手机