gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:34:30 25 4
gpt4 key购买 nike

使用安卓 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com