在非活动和非服务类中使用registerReceiver

3

我正试图为BluetoothDevice事件(如ACTION_ACL_CONNECTED,ACTION_ACL_DISCONNECTED)注册接收器registerReceiver

但由于我使用registerReceiver的类既不是Activity类也不是Service类,因此我将Context传递给该类,并按照以下方式注册接收器:

context.registerReceiver(ActionFoundReceiver, 
          new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));

context.registerReceiver(ActionFoundReceiver, 
              new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECTED));

context.registerReceiver(ActionFoundReceiver, 
          new IntentFilter(BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED));

并按照以下方式处理事件
private final BroadcastReceiver ActionFoundReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            // do some stuff
        }
    }
};

但是当设备连接或断开时,我无法跟踪它,我的意思是 ActionFoundReceiver 无法被调用。

3个回答

7

我尝试使用xxx方法来解决问题,但我真的不知道这个方法是否安全,在这种情况下是否是好习惯。

如果有更好的解决方案,请随意发表。

context.getApplicationContext().registerReceiver(ActionFoundReceiver, 
                  new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));

7
这是一个我使用过的 BroadcastReceiver 的草图。
你需要一些类 MyBroadcastReceiver 来完成所有工作。
public class MyBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
            // do some stuff
        }
    }
}

MyBroadcastReceiver 是托管在你的 MyClass 中的(该类不是一个活动或服务)。

public class MyClass {

    private BroadcastReceiver myReceiver = null;

    public MyClass(Context context) {
        myReceiver = new MyBroadcastReceiver();
        context.registerReceiver(myReceiver, new IntentFilter(
                BluetoothDevice.ACTION_ACL_CONNECTED));
        context.registerReceiver(myReceiver, new IntentFilter(
                BluetoothDevice.ACTION_ACL_DISCONNECTED));
        context.registerReceiver(myReceiver, new IntentFilter(
                BluetoothDevice.ACTION_ACL_DISCONNECT_REQUESTED));
    }

    public void unregisterReceiver(Context context) {
        context.unregisterReceiver(myReceiver);
    }
}

MyClass 的生命周期由 MyActivity(或 MyService)控制。

public class MyActivity extends Activity {

    private MyClass myClass = null;

    @Override
    public void onResume(Bundle savedInstanceState) {
        super.onResume(savedInstanceState);
        // ...
        myClass = new MyClass(this);
    }

    @Override
    public void onPause() {
        if (myClass != null) {
            myClass.unregisterReceiver(this);
            myClass = null;
        }
        super.onPause();
    }
}

这也可以是在onCreate/onDestroy中或者在服务中。


应该是context.unregisterReceiver(myReceiver);吧? - Flot2011
@Flot2011 你是对的。我在我的回答中修复了它。 - k3b

1

我有类似的问题,我有一个用于接收发送的短信的接收器,我注册了它,但从未调用过。 我尝试了这样做,但从未被调用。

actionfounder= new ActionFounderReceiver();
    context.registerReceiver(actionfounder , new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));

好的,当我以这种方式注册时,我的惊讶是什么呢:

context.registerReceiver(new ActionFoundReceiver() , new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));

还有内部类:

class ActionFoundReceiver extends BroadcastReceiver() {

   @Override
   public void onReceive(Context context, Intent intent) {
     String action = intent.getAction();
     if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(action)) {
        // do some stuff
     }
   }
}

当我获得一个新的实例时,它可以正常工作。

希望这有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接