我有一个广播接收器,只要系统中的下载完成就会被触发。我想要做的是将此接收器的结果发送到我的片段,我更新视图。 目前我使用这种方法。
public class DownloadCompleteReceiver extends BroadcastReceiver {
public interface DownloadListener {
public void downloadCompleted(int appId);
}
private static List<DownloadListener> downloadListeners = new LinkedList<>();
public static void registerDownloadListener(DownloadListener downloadListener){
downloadListeners.add(downloadListener);
}
public static void unregisterDownloadListener(DownloadListener downloadListener){
downloadListeners.remove(downloadListener);
}
@Override
public void onReceive(Context context, Intent intent) {
//whatever calculation needed to be done.
for(DownloadListener listener: downloadListeners)
if(listener != null)
listener.downloadCompleted(appId);
}
}
在我的片段onStart方法中,我这样做。
DownloadCompleteReceiver.registerDownloadListener(this);
和onStop方法
DownloadCompleteReceiver.unregisterDownloadListener(this);
然后我实现了界面,我有结果!这是一个简单易用的解决方案。我想知道我的代码有问题吗?我会错过什么吗?!我花了几个小时搜索这个问题,但没有人使用这种方法!有原因吗?
顺便说一下,我需要在单独的类中定义我的接收器,因为即使我的应用程序已关闭,我希望它被触发,所以内部分类我的接收器不是这里的选项。
答案 0 :(得分:1)
我认为这种方法没有任何问题,我对我的项目采用了相同的方法。
如果您在询问是否有其他方法可以执行此操作,可以查看基于事件的库以进行异步通信:
有问题比较基于事件的框架与Android的LocalBroadcast:Otto vs LocalBroadcast:
答案 1 :(得分:0)
这种方法没有错。
首先,您的接收者在onStart中注册,在onStop方法中注册未注册。
因此,如果您的活动正在运行(我的意思是没有停止)并且您删除或替换了您的片段。那么您将永远无法取消注册您的接收器。
因此,如果您只将此侦听器用于此片段,则应在onAttach和onDetach片段中注册和取消注册接收器。
希望它会有所帮助。谢谢。