繁体   English   中英

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

[英]Send data from broadcast receiver to fragment

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

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

然后我实现了接口,我得到了结果! 这是一个简单的解决方案,效果很好。 我想知道我的代码有问题吗? 我想念什么吗? 我花了数小时搜寻此事,但没有人使用这种方法! 有什么原因吗?

顺便说一句,我需要在单独的类中定义我的接收器,因为即使我的应用程序关闭了,我也希望将其解雇,所以在这里无法对接收器进行内部分类。

我没有发现这种方法有什么问题,我在项目中使用了相同的方法。

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

还存在将基于事件的框架与Android的LocalBroadcast进行比较的问题: Otto与LocalBroadcast:

这种方法没有错。

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

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

因此,如果仅将此侦听器用于此片段,则应在片段的onAttach和onDetach中注册和注销接收者。

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM