android - 广播接收器未注销

标签 android usb broadcastreceiver

我想让用户能够通过单击按钮取消注册/注册广播接收器。

第一次按下按钮时,广播接收器被注册,设备连接时出现提示。

我的问题是当我再次按下按钮时,广播接收器并没有像我指定的那样取消注册。

有人可以检查 mylogic 是否有问题,或者向我解释是否有另一种方法可以检测 usb 何时拔出/插入?

谢谢。

btn.setOnClickListener(new View.OnClickListener() {
            BroadcastReceiver receiver = new BroadcastReceiver() {
                public void onReceive(Context context, Intent intent) {
                    int plugged = intent.getIntExtra(
                            BatteryManager.EXTRA_PLUGGED, -1);
                    if (plugged == BatteryManager.BATTERY_PLUGGED_USB) {
                        Toast.makeText(getApplicationContext(),
                                "Connected to USB", Toast.LENGTH_SHORT).show();

                    }
                    if (plugged != BatteryManager.BATTERY_PLUGGED_USB) {
                        Toast.makeText(getApplicationContext(),
                                "Disconnected from USB", Toast.LENGTH_SHORT)
                                .show();

                    }
                }
            };

            @Override
            public void onClick(View v) {
                int mReceiver = 0;
                mReceiver++;
                if (mReceiver % 2 == 1) {
                    IntentFilter filter = new IntentFilter(
                            Intent.ACTION_BATTERY_CHANGED);
                    registerReceiver(receiver, filter);
                }
                if (mReceiver % 2 == 0) {
                    unregisterReceiver(receiver);
                    Toast.makeText(getApplicationContext(),
                            "Should be unregistered", Toast.LENGTH_LONG).show();
                }

            }
        });

最佳答案

由于这些行,您的 mReceiver 值将始终等于 1:

            int mReceiver = 0;
            mReceiver++;

我假设 mReceiver 是一个实例变量,在这种情况下它应该只是:

            mReceiver++;

更好的是,创建一个名为 isRegistered 的 bool 值。

        @Override
        public void onClick(View v) {

            if (!isRegistered) {
                IntentFilter filter = new IntentFilter(
                        Intent.ACTION_BATTERY_CHANGED);

                registerReceiver(receiver, filter);
                isRegistered = true;
            }
            else {
                unregisterReceiver(receiver);
                isRegistered = false;
            }

        }

关于android - 广播接收器未注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23717933/

相关文章:

android - 提取到自定义小部件时,Flutter Drawer 延迟加载

linux - Linux 的/dev/usb/lp0 的 OSX 版本是什么?

android - BroadcastReceiver 与服务

java - Android BroadcastReceiver 注册时出现空指针异常

android - match_parent 不适用于自定义操作栏

android - 为什么在将数据发布到表单时 HttpClient 不起作用,但 HttpUrlConnenction 起作用

java - 谷歌网站和谷歌API之间的不同答案

java - 当 Keystore 是 USB 加密 token 时如何从 Keystore.load 抑制 PIN 错误对话框

ubuntu - 无法在 Ubuntu 12.04 的 USB 串行端口上设置波特率

android - 服务泄露了最初绑定(bind)在这里的 ServiceConnection