将数据从广播接收器发送到片段

时间:2015-02-28 10:44:38

标签: android broadcastreceiver observer-pattern broadcast

我有一个广播接收器,只要系统中的下载完成就会被触发。我想要做的是将此接收器的结果发送到我的片段,我更新视图。 目前我使用这种方法。

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

然后我实现了界面,我有结果!这是一个简单易用的解决方案。我想知道我的代码有问题吗?我会错过什么吗?!我花了几个小时搜索这个问题,但没有人使用这种方法!有原因吗?

顺便说一下,我需要在单独的类中定义我的接收器,因为即使我的应用程序已关闭,我希望它被触发,所以内部分类我的接收器不是这里的选项。

2 个答案:

答案 0 :(得分:1)

我认为这种方法没有任何问题,我对我的项目采用了相同的方法。

如果您在询问是否有其他方法可以执行此操作,可以查看基于事件的库以进行异步通信:

有问题比较基于事件的框架与Android的LocalBroadcast:Otto vs LocalBroadcast:

答案 1 :(得分:0)

这种方法没有错。

首先,您的接收者在onStart中注册,在onStop方法中注册未注册。

因此,如果您的活动正在运行(我的意思是没有停止)并且您删除或替换了您的片段。那么您将永远无法取消注册您的接收器。

因此,如果您只将此侦听器用于此片段,则应在onAttach和onDetach片段中注册和取消注册接收器。

希望它会有所帮助。谢谢。