Класс широковещательного приемника и метод registerReceiver

Привет, я пытаюсь понять Broadcast Receiver, я прошел через множество примеров кода, но все еще есть некоторые сомнения. Я хотел знать, когда нам нужно расширить класс Broadcast Receiver и когда следует использовать метод registerReceiver() и когда мы должны создать объект для BroadcastReceiver. В некоторых программах я сталкивался с используемыми методами registerReceiver , но без расширения класса Broadcast Receiver. Я также хотел знать, как onReceive метод onReceive .

Какой подход следует использовать, когда?

Вот метод registerReceiver :

 registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch (getResultCode()) { ........ } } }, new IntentFilter(SENT)); 

Объект, создаваемый для BroadcastReceiver :

 private BroadcastReceiver intentReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { ................. } }; 

Android имеет намеренное действие для широковещательного приемника. Приемник BroadCast запускается, когда он прослушивает любое действие, зарегистрированное в нем.

Теперь мы возьмем один пример: нам нужно прослушать действие «всякий раз, когда какое-либо устройство Bluetooth подключается к нашему устройству». Для этого андроида это исправить действие android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED

Таким образом, вы можете получить его через манифест и регистрацию

Регистрация манифеста:

Поместите это в свой манифест

 <receiver android:name="MyBTReceiver"> <intent-filter> <action android:name="android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED" /> </intent-filter> </receiver> 

Создать MyBTReceiver.class

 public class MyBTReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals("android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED")){ Log.d(TAG,"Bluetooth connect"); } } } 

Это был самый простой широковещательный приемник.

Теперь, если вы заинтересованы только в получении трансляции во время работы, лучше использовать registerReceiver (). Вы также можете зарегистрировать его в существующем файле класса. Вам также необходимо onDestroy() регистрацию в onDestroy() . Здесь вам не нужна регистрация трансляции в манифесте, кроме регистрации активности

Например

 public class MainActivity extends Activity { IntentFilter filter1; @Override public void onCreate() { filter1 = new IntentFilter("android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED"); registerReceiver(myReceiver, filter1); } //The BroadcastReceiver that listens for bluetooth broadcasts private final BroadcastReceiver myReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equalsIgnoreCase("android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED")) { Log.d(TAG,"Bluetooth connect"); } } }; @Override public void onDestroy() { unregisterReceiver(myReceiver); } } 

В обоих случаях BroadcastReceiver будет расширен. Во втором примере вы создаете так называемый анонимный класс. Новый класс не имеет определенного имени, поэтому его называют так. В любом случае этот новый класс расширяет BroadcastReceiver и переопределяет onReceive() .

Теперь вернемся к вашему вопросу. Существует два типа приемников – статически и динамически определенные.

Если вы объявите ваш ресивер в файле AndroidManifest, он будет статически определен. В этом случае вам нужно обратиться к классу, использующему BroadcastReceiver по имени. Как вы можете видеть, вы не можете использовать анонимный класс, потому что последнее не имеет имени. Вы должны явно реализовать приемник. Стоит отметить, что в этом случае вы не используете метод registerReceiver() . Android делает это для вас автоматически.

Если вы объявляете получателей динамически (например, в onResume() для активности, то для этого вы можете использовать для этого анонимный класс. Для регистрации приемника вы вызываете метод registerReceiver() . Вы также можете использовать именованный класс. Оба варианта действительны в этом случае.

Надеюсь, это объясняет разницу.

В обоих случаях вы создаете объект. Но в первом случае нет никакой ссылки для объекта-получателя, поэтому он не может быть незарегистрирован позже, а второй, поэтому он может быть незарегистрирован после регистрации объекта, используя следующие методы :

 registerReceiver(intentReceiver ); unregisterReceiver(intentReceiver );