Класс Broadcast Receiver и метод registerReceiver

Привет, я пытаюсь понять Broadcast Receiver, я просмотрел множество примеров кода, но все еще имею некоторые сомнения. Я хотел знать, когда нам нужно расширить класс Broadcast Receiver и когда мы должны использовать метод registerReceiver() и когда мы должны создать объект для BroadcastReceiver. В некоторых программах я сталкивался с использованием registerReceiver методов, но без расширения класса Broadcast Receiver. Я также хотел знать, как вызывается метод 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) {
        .................
    }

};

person user2717079    schedule 17.09.2013    source источник


Ответы (3)


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(). здесь вам не нужна никакая широковещательная регистрация в манифесте, кроме регистрации активности

Например

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);
    }
}
person Bhoomika Brahmbhatt    schedule 17.09.2013
comment
Нужно ли регистрировать приемник - person user2717079; 17.09.2013
comment
да. в первом виде трансляции вы должны зарегистрировать его в манифесте, а во втором вы должны зарегистрировать его в своем классе. - person Bhoomika Brahmbhatt; 17.09.2013
comment
это странно. но во втором не забудьте отменить его регистрацию. - person Bhoomika Brahmbhatt; 17.09.2013
comment
Во втором типе вещания (в котором я не расширяю приемник вещания) могу ли я также зарегистрировать два разных приемника в одном классе? - person Pervy Sage; 03.08.2014
comment
Да, но вы можете добавить более одного действия в фильтр намерений с одним приемником, поэтому вам не нужно создавать более одного приемника в одном классе. Просто добавьте эти действия в один приемник. - person Bhoomika Brahmbhatt; 04.08.2014
comment
Квалификатор для получения ответа; вам не нужно регистрировать получателя, если вы поместите намерение в свой манифест и класс получателя расширяет BroadcastReceiver. Если ваш принимающий класс не расширяет BroadcastReceiver, например, в службе, вам все равно необходимо зарегистрировать получателя в службе или принимающем классе. - person VikingGlen; 18.01.2016
comment
Спасибо за ваш код. Но лучше зарегистрировать приемник внутри onResume() и отменить регистрацию внутри onPause(). - person Danilo Raspa; 21.09.2016

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

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

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

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

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

person sergej shafarenka    schedule 17.09.2013

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

registerReceiver(intentReceiver );
unregisterReceiver(intentReceiver );
person nilamber    schedule 17.09.2013