Поиск…


Вступление

BroadcastReceiver (приемник) - это компонент Android, который позволяет вам регистрироваться для системных или прикладных событий. Все зарегистрированные ресиверы для события сообщаются в среду выполнения Android после этого события.

например, широковещательная передача, объявляющая, что экран выключен, батарея разряжена или снимок сделан.

Приложения также могут инициировать трансляции, например, чтобы другие приложения знали, что некоторые данные были загружены на устройство и доступны для них.

Введение в широковещательный приемник

Приемник Broadcast - это компонент Android, который позволяет вам регистрироваться для событий системы или приложений.

Приемник может быть зарегистрирован через файл AndroidManifest.xml или динамически с помощью Context.registerReceiver() .

public class MyReceiver extends BroadcastReceiver {
   @Override
   public void onReceive(Context context, Intent intent) {
      //Your implementation goes here.
   }
}

Здесь я ACTION_BOOT_COMPLETED пример ACTION_BOOT_COMPLETED который запускается системой после завершения процесса загрузки Android.

Вы можете зарегистрировать получателя в файле манифеста следующим образом:

<application
   android:icon="@drawable/ic_launcher"
   android:label="@string/app_name"
   android:theme="@style/AppTheme" >
   <receiver android:name="MyReceiver">
      <intent-filter>
         <action android:name="android.intent.action.BOOT_COMPLETED">
         </action>
      </intent-filter>
   </receiver>
</application>

Теперь устройство будет загружено, будет onReceive() метод onReceive() , после чего вы сможете выполнить свою работу (например, запустить службу, запустить будильник).

Основы BroadcastReceiver

BroadcastReceivers используются для получения трансляционных намерений , которые отправляются ОС Android, другими приложениями или в одном приложении.

Каждый Intent создается с помощью Intent Filter , для которого требуется действие String. В Настройке можно настроить дополнительную информацию.

Аналогично, BroadcastReceivers регистрируются для получения намерений с определенным фильтром намерений. Они могут быть зарегистрированы программно:

mContext.registerReceiver(new BroadcastReceiver() {
    @Override
   public void onReceive(Context context, Intent intent) {
      //Your implementation goes here.
   }
}, new IntentFilter("Some Action"));

или в файле AndroidManifest.xml :

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="Some Action"/>
    </intent-filter>
</receiver>

Чтобы получить Intent, установите действие на что-то, задокументированное операционной системой Android, другим приложением или API или в вашем собственном приложении, используя sendBroadcast :

mContext.sendBroadcast(new Intent("Some Action"));

Кроме того, Intent может содержать информацию, такую ​​как строки, примитивы и Parcelables , которые можно просмотреть в onReceive .

Использование LocalBroadcastManager

LocalBroadcastManager используется для отправки широковещательных Intents в приложении, не подвергая их нежелательные слушатель.

Использование LocalBroadcastManager более эффективно и безопаснее, чем использование context.sendBroadcast() напрямую, потому что вам не нужно беспокоиться о каких-либо трансляциях, подделанных другими приложениями, которые могут представлять угрозу безопасности.

Вот простой пример отправки и получения местных трансляций:

BroadcastReceiver receiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals("Some Action")) {
            //Do something
        }
    }
});

LocalBroadcastManager manager = LocalBroadcastManager.getInstance(mContext);
manager.registerReceiver(receiver, new IntentFilter("Some Action"));

// onReceive() will be called as a result of this call:
manager.sendBroadcast(new Intent("Some Action"));//See also sendBroadcastSync

//Remember to unregister the receiver when you are done with it:
manager.unregisterReceiver(receiver);

Приемник Bluetooth Broadcast

добавить разрешение в файл манифеста

<uses-permission android:name="android.permission.BLUETOOTH" />

В вашем фрагменте (или активности)

  • Добавить метод приемника
private BroadcastReceiver mBluetoothStatusChangedReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        final Bundle extras = intent.getExtras();
        final int bluetoothState = extras.getInt(Constants.BUNDLE_BLUETOOTH_STATE);
        switch(bluetoothState) {
            case BluetoothAdapter.STATE_OFF:
                // Bluetooth OFF
                break;
            case BluetoothAdapter.STATE_TURNING_OFF:
                // Turning OFF
                break;
            case BluetoothAdapter.STATE_ON:
                // Bluetooth ON
                break;
            case BluetoothAdapter.STATE_TURNING_ON:
                // Turning ON
                break;
    }
};

Регистрация трансляции

  • Вызовите этот метод onResume ()
private void registerBroadcastManager(){
    final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    manager.registerReceiver(mBluetoothStatusChangedReceiver, new IntentFilter(Constants.BROADCAST_BLUETOOTH_STATE));
}

Отменить регистрацию трансляции

  • Вызовите этот метод onPause ()
private void unregisterBroadcastManager(){
    final LocalBroadcastManager manager = LocalBroadcastManager.getInstance(getActivity());
    // Beacon機能用
    manager.unregisterReceiver(mBluetoothStatusChangedReceiver);
}

Включение и отключение широковещательного приемника программно

Чтобы включить или отключить BroadcastReceiver , нам нужно получить ссылку на PackageManager и нам нужен объект ComponentName содержащий класс получателя, который мы хотим включить / отключить:

ComponentName componentName = new ComponentName(context, MyBroadcastReceiver.class);
PackageManager packageManager = context.getPackageManager();

Теперь мы можем вызвать следующий метод для включения BroadcastReceiver :

packageManager.setComponentEnabledSetting(
    componentName,
    PackageManager.COMPONENT_ENABLED_STATE_ENABLED,
    PackageManager.DONT_KILL_APP);

Или мы можем вместо этого использовать COMPONENT_ENABLED_STATE_DISABLED чтобы отключить приемник:

packageManager.setComponentEnabledSetting(
    componentName,
    PackageManager.COMPONENT_ENABLED_STATE_DISABLED,
    PackageManager.DONT_KILL_APP);

BroadcastReceiver для обработки событий BOOT_COMPLETED

Пример ниже показывает, как создать BroadcastReceiver который может принимать события BOOT_COMPLETED . Таким образом, вы можете запустить Service или запустить Activity как только устройство будет включено.

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

ПРИМЕЧАНИЕ . Пользователь должен запустить приложение хотя бы один раз, прежде чем вы сможете принять действие BOOT_COMPLETED .

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.test.example" >
    ...
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    ...

    <application>
        ...

        <receiver android:name="com.test.example.MyCustomBroadcastReceiver">
        <intent-filter>
                <!-- REGISTER TO RECEIVE BOOT_COMPLETED EVENTS -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
            </intent-filter>
        </receiver>
    </application>
</manifest>

MyCustomBroadcastReceiver.java

public class MyCustomBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if(action != null) {
            if (action.equals(Intent.ACTION_BOOT_COMPLETED) ) {
                // TO-DO: Code to handle BOOT COMPLETED EVENT
                // TO-DO: I can start an service.. display a notification... start an activity
            } 
        }
    }
}

Пример LocalBroadcastManager

BroadcastReceiver - это в основном механизм для передачи Intents через ОС для выполнения определенных действий. Классическое определение

«Приемник Broadcast - это компонент Android, который позволяет вам регистрироваться для событий системы или приложений».

LocalBroadcastManager - это способ отправки или получения широковещательных сообщений в процессе подачи заявки. Этот механизм имеет много преимуществ

  1. поскольку данные остаются внутри прикладного процесса, данные не могут быть пропущены.
  2. LocalBroadcasts разрешаются быстрее, поскольку разрешение обычной широковещательной рассылки происходит во время работы по всей ОС.

Простой пример LocalBroastManager:

SenderActivity

  Intent intent = new Intent("anEvent");
  intent.putExtra("key", "This is an event");
  LocalBroadcastManager.getInstance(this).sendBroadcast(intent);

ReceiverActivity

  1. Зарегистрировать приемник
LocalBroadcastManager.getInstance(this).registerReceiver(aLBReceiver,
              new IntentFilter("anEvent"));
  1. Конкретный объект для выполнения действий при вызове получателя
private BroadcastReceiver aLBReceiver = new BroadcastReceiver() {
    @Override 
    public void onReceive(Context context, Intent intent) {
        // perform action here.
    } 
};
  1. отмените регистрацию, когда представление больше не видно.
@Override 
protected void onPause() { 
    // Unregister since the activity is about to be closed. 
    LocalBroadcastManager.getInstance(this).unregisterReceiver(aLBReceiver);
    super.onDestroy(); 
}

Сообщать о двух действиях через пользовательский широковещательный приемник

Вы можете сообщить два действия, чтобы Activity A мог быть уведомлен о событии, происходящем в Activity B.

Активность А

final String eventName = "your.package.goes.here.EVENT";

@Override
protected void onCreate(Bundle savedInstanceState) {
    registerEventReceiver();
    super.onCreate(savedInstanceState);
}

@Override
protected void onDestroy() {
    unregisterEventReceiver(eventReceiver);
    super.onDestroy();
}

private void registerEventReceiver() {
    IntentFilter eventFilter = new IntentFilter();
    eventFilter.addAction(eventName);
    registerReceiver(eventReceiver, eventFilter);
}

private BroadcastReceiver eventReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
         //This code will be executed when the broadcast in activity B is launched
    }
};

Активность B

final String eventName = "your.package.goes.here.EVENT";

private void launchEvent() {
    Intent eventIntent = new Intent(eventName);
    this.sendBroadcast(eventIntent);
}

Конечно, вы можете добавить дополнительную информацию в эфир, добавляя дополнительные функции к намерению, которое передается между действиями. Не добавляется, чтобы привести пример как можно более простым.

Важная трансляция

Если мы используем метод sendStickyBroadcast (намерение), соответствующее намерение является липким, то есть намерение, которое вы отправляете, остается после завершения трансляции. StickyBroadcast, как следует из названия, является механизмом для чтения данных из трансляции после завершения трансляции. Это можно использовать в сценарии, в котором вы можете проверить Activity's onCreate() значение ключа в намерении до того, как эта активность была запущена.

Intent intent = new Intent("com.org.action");
intent.putExtra("anIntegerKey", 0);
sendStickyBroadcast(intent);

Использование упорядоченных трансляций

Заказываемые трансляции используются, когда вам нужно указать приоритет для широковещательных слушателей.

В этом примере firstReceiver будет получать широковещательную передачу всегда до secondReceiver :

final int highPriority = 2;
final int lowPriority = 1;
final String action = "action";

// intent filter for first receiver with high priority
final IntentFilter firstFilter = new IntentFilter(action);
first Filter.setPriority(highPriority);
final BroadcastReceiver firstReceiver = new MyReceiver();

// intent filter for second receiver with low priority
final IntentFilter secondFilter = new IntentFilter(action);
secondFilter.setPriority(lowPriority);
final BroadcastReceiver secondReceiver = new MyReceiver();

// register our receivers
context.registerReceiver(firstReceiver, firstFilter);
context.registerReceiver(secondReceiver, secondFilter);

// send ordered broadcast
context.sendOrderedBroadcast(new Intent(action), null);

Кроме того, широковещательный приемник может прервать упорядоченную передачу:

@Override
public void onReceive(final Context context, final Intent intent) {
    abortBroadcast();
}

в этом случае все приемники с более низким приоритетом не получат широковещательное сообщение.

Android остановил состояние

Начиная с Android 3.1, все приложения после установки находятся в остановленном состоянии. При остановленном состоянии приложение не будет запускаться по какой-либо причине, кроме как при ручном запуске какого-либо действия, или в явном намерении, которое адресовано активности, службе или широковещательной передаче.

При написании системного приложения, которое напрямую устанавливает APK, учтите, что недавно установленный APP не получит никаких трансляций, пока не перейдет в состояние без остановок.

Легкий способ активации приложения - отправить явное сообщение в это приложение. поскольку большинство приложений реализуют INSTALL_REFERRER , мы можем использовать его как точку подключения

Сканируйте манифест установленного приложения и отправьте явное вещание каждому получателю:

Intent intent = new Intent();
intent.addFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES);
intent.setComponent(new ComponentName(packageName, fullClassName));
sendBroadcast(intent);


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow