3

registerReceiverなどのBluetoothDeviceイベントを実行しようとしています。ACTION_ACL_CONNECTEDACTION_ACL_DISCONNECTED

しかし、私が使用しているクラスはクラスもクラスもregisterReceiver拡張していません-そのため、私はそのクラスに渡して、次のようにレシーバーを登録していますActivityServiceContext

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電話をかけることができません。

4

3 に答える 3

7

を使って解決しようとしましたが、これがどれほど安全かはよくわかりません。この場合は良い習慣かどうかはわかりません。

誰かがより良い答えを持っているなら、気軽に投稿してください

context.getApplicationContext().registerReceiver(ActionFoundReceiver, 
                  new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED));
于 2012-11-07T17:32:05.060 に答える
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();
    }
}

これは、サービス内またはサービス内でもかまいませonCreateonDestroy

于 2012-11-07T19:21:02.240 に答える
1

私はいくつかの同様の問題を抱えています、私は送信されたSMSの受信機を持っています、私はそれを登録しますが、決して呼び出されません。私はそうしようとしました、そして決して呼ばれませんでした

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
     }
   }
}

新しいインスタンスを取得したとき、それは機能します。

お役に立てれば。

于 2013-06-18T16:15:15.240 に答える