【问题标题】:Dynamic Broadcast Receiver in Fragment片段中的动态广播接收器
【发布时间】:2012-01-05 03:56:20
【问题描述】:

是否可以在片段中动态注册广播接收器以监听连接状态变化?如果有怎么办?如果没有,片段的一些解决方法是什么?

编辑:要注册广播接收器,您需要一个上下文。由于片段存在于活动中,因此获取 Context 的最佳方法可能就是使用 getActivity()。然而,正如 gnorsilva 在下面解释的那样,有一些特殊情况需要注意。

【问题讨论】:

  • 您可以让主机活动处理广播并与片段通信
  • 这不是将活动和片段结合起来吗?片段的优点之一是您可以在其他活动中重用它们。这会降低你这样做的能力。我在我的一个应用程序中遇到了同样的问题,并且所有需要上下文的东西都是一样的。我最终使用了一个封装了片段所需功能的活动基类。不会将它们完全解耦,但会使维护更容易。

标签: android broadcastreceiver android-fragments


【解决方案1】:

user853583 建议不错,但如果您需要访问片段内的上下文,您应该使用getActivity().getApplicationContext()

您应该尽可能避免将活动作为上下文传递,因为这可能会导致内存泄漏 - 某些对象在调用其 onDestroy() 后会保留该活动,并且不会被垃圾回收。

话虽如此,在某些情况下您确实需要将活动作为上下文传递 - 例如:对于列表适配器

还有两件事:

  • 因为一个片段是从一个活动中附加和分离的,有时getActivity()会返回空值——你可以在你知道活动还活着的某些生命周期方法中安全地调用它,例如:onResume()

  • 如果您的片段未保留其实例,即在方向更改时被销毁,请务必在片段中取消注册您的接收器,例如在onPause()onDestroy()

【讨论】:

  • 请注意,如果您将 setDebugUnregister(true) 用于广播接收器,那么对您的片段的引用将在应用程序的整个生命周期中保持不变。这可能会导致明显的内存泄漏,尤其是在大量使用期间:)
【解决方案2】:

据我所知,没有办法在片段中注册广播接收器。你需要那个广播接收器做什么?一个不错的解决方案是提到的here

【讨论】:

  • 根据原始问题,需要收听系统发送的广播——在这种情况下是wifi连接时发送的连接广播。
【解决方案3】:

您可以像这样注册广播接收器: getActivity().registerReceiver(...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    相关资源
    最近更新 更多