【问题标题】:Send data from broadcast receiver to fragment从广播接收器发送数据到片段
【发布时间】:2015-02-28 10:44:38
【问题描述】:

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

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 broadcastreceiver observer-pattern broadcast


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      这种方法没有错。

      首先,您的接收器在 onStart 中注册并在 onStop 方法中取消注册。

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

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

      希望对您有所帮助。谢谢。

      【讨论】:

      • 我假设我的片段何时被另一个片段替换。 onStop()、onDistroyView() 和 onDistroy() 将被调用。因此它将从侦听器列表中删除。不是这样吗?
      • onStop 和 onDestroy 将在您的活动停止并被销毁而不是碎片时被调用,因为它们是活动的生命周期方法而不是碎片。是的 DestroyView 肯定会被调用。
      • 注册和取消注册在片段的 onStart() 和 onStop() 中调用,而不是活动!请注意,这两个方法不是广播接收器方法,这是我在接收器中定义的自定义方法,与广播接收器方法不同,此方法可以在任何 java 对象上调用,包括片段!
      • onStart 和 onStop 是活动生命周期的方法。您只需将它们覆盖到您的片段中。因此,如果您删除片段并且活动仍在运行,那么您的片段的 onStop 将永远不会被调用。阅读此@987654321 @onStop() 片段不再对用户可见,因为它的活动正在停止或片段操作正在活动中修改它。因此,如果仅停止活动,则片段的 onstop 将被调用,否则永远不会。
      • onStop() 将在您替换片段时被调用!然后是 onDistroyview(),然后是 onDistroy()。您可以通过在片段生命周期中放置一条日志消息来测试它!我们没有覆盖片段中的活动生命周期! Fragment 有自己的生命周期,它与活动生命周期一起工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多