Использовать registerReceiver для неактивного и не обслуживающего класса - программирование

Использовать registerReceiver для неактивного и не обслуживающего класса

Я пытаюсь registerReceiver для событий BluetoothDevice, таких как ACTION_ACL_CONNECTED, ACTION_ACL_DISCONNECTED.

Но класс, в котором я использую 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 не может получить вызов

4b9b3361

Ответ 1

Я попытался решить эту проблему, но я действительно не знаю, насколько это безопасно, и это хорошая практика в этом случае или нет.

если у кого-то есть лучшее и не стесняйтесь публиковать сообщения

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

Ответ 2

Вот эскиз 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(this);
    }
}

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 или внутри службы.

Ответ 3

У меня есть аналогичная проблема, у меня есть приемник для отправки 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
     }
   }
}

Просто, когда я получаю новый новый экземпляр, он работает.

Надеюсь, что это поможет.