【问题标题】:Fragment's BroadcastReceiver onCreate method does not get called片段的 BroadcastReceiver onCreate 方法没有被调用
【发布时间】:2015-10-01 11:46:36
【问题描述】:

我的 Activity 中有一个简单的 Fragment,我在其中启用和禁用蓝牙适配器,我想通过 Fragment 中的 BroadcastReceiver 监听蓝牙适配器的状态变化。原因是我想在蓝牙状态更改时直接更改 Fragment 的 UI 元素。这是我的代码:

public class FragmentBT extends Fragment
{
    @Override
    public void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        IntentFilter iFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
        LocalBroadcastManager.getInstance(getActivity()).registerReceiver(BtStateChangedReceiver, iFilter);
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        LocalBroadcastManager.getInstance(getActivity()).unregisterReceiver(BtStateChangedReceiver);
    }

    public BroadcastReceiver BtStateChangedReceiver = new BroadcastReceiver()
    {
        @Override
        public void onReceive(Context context, Intent intent)
        {
            ... change UI based on the extra data from intent ...
        }
    }
}

当我使用 Fragment 的 ActionBar 中的操作按钮在我的设备中启用或禁用 BT 时,BT 会打开和关闭,但我的接收器永远不会被调用。我从来没有进入接收者的 onReceive 方法。我意识到这是一个很常见的问题,但我尝试了几种解决方案,但都没有奏效(并且所有这些都已合并到我当前的代码中)。

感谢您的建议!

【问题讨论】:

  • 我希望你已经在你的清单中定义了 权限。
  • Bhavesh:是的,我同时拥有 BLUETOOTH 和 BLUETOOTH_ADMIN 权限。马特乌斯:我不是。我只是在听广播。我假设BT状态改变的广播是系统发送的,否则听它没有多大意义,我错了吗?
  • 正是因为这样的诡计,我才尽可能将接收器放在清单中。
  • e4c5:通常我也这样做,但是这样我可以很容易地访问 Fragment 的 UI。如果我在一个单独的类中声明我的 Receiver 并将其放入清单中,我知道没有简单的方法可以做到这一点。这种方法对我来说似乎非常优雅,我真的很喜欢它的工作:)

标签: android android-fragments bluetooth android-broadcast localbroadcastmanager


【解决方案1】:

试试这个:

getActivity().registerReceiver(BtStateChangedReceiver, iFilter);
getActivity().unregisterReceiver(BtStateChangedReceiver);

docs 说“LocalBroadcastManager”用于“注册 Intent 广播并将其发送到进程中的本地对象”。

【讨论】:

  • 是的,这正是问题所在。我还注意到关于 LocalBroadcastManager。我使用了一种解决方法,使用在清单中注册并在单独的类中声明的 BroadcastReceiver。在那里,我解析 Intent 的数据,然后使用 LocalBroadcastManager 的 sendBroadcast 方法将广播进一步传播到我的应用程序中。我的 BtStateChangedReceiver 最终收到了广播(在我发布的代码中)。无论如何,感谢您提供有用的提示!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多