Регистр широковещательного приемника в Манифесте против активности


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

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

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.blk_burn.standalonereceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk android:minSdkVersion="10" />
    <uses-permission android:name="android.permission.WAKE_LOCK"/>

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >

        <receiver android:name="TestReceiver">
            <intent-filter>
                <action android:name="android.media.AUDIO_BECOMING_NOISY"/>
            </intent-filter>
        </receiver>

    </application>

</manifest>

однако, если я заменить android.media.AUDIO_BECOMING_NOISY С android.intent.action.HEADSET_PLUG приемник не срабатывает ( Android Документация)

из того, что я нашел на этом сайте, вы должны зарегистрировать этот приемник из действия или службы, которая уже запущена для его работы (Post).

  • может ли кто-нибудь сказать мне, почему это не работает при простой настройке фильтра намерений в манифесте и почему вам нужно иметь службу, работающую в фоновом режиме, которая ссылается/регистрирует приемник?

  • есть работа вокруг, так что я могу просто зарегистрируйте мой приемник в манифесте моего приложения, используя фильтр намерений с android.intent.action.HEADSET_PLUG?

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

2 58

2 ответа:

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

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

AFAIK, нет единого места эта информация суммируется для всех трансляций, но каждое намерение должно иметь комментарий в JavaDoc о том, как зарегистрировать и использовать его, но, по-видимому, его не хватает в местах. Вы должны быть в состоянии составить список, если вы grep источник Android дерево для намерениях.FLAG_RECEIVER_REGISTERED_ONLY.

как обычно широковещательные приемники могут быть настроены в манифесте fileAndroidManifest.XML. BroadcastReceiver, настроенный таким образом, называется статически зарегистрированным.

вы можете зарегистрировать приемник в файле манифеста с помощью элемента:

<receiver
   android:name=".ConnectivityChangeReceiver">
   <intent-filter>
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
   </intent-filter>
</receiver>

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

Dyanmic Broadcast Recievers

в качестве альтернативы вы можете зарегистрировать свой BroadcastReceiver реализация динамически в коде. Вам просто нужно вызвать метод registerReceiver () для вашего объекта контекста.

метод registerReceiver() принимает два параметра:

аргументы метода registerReceiver ()

  • получатель : BroadcastReceiver, который вы хотите зарегистрировать
  • фильтр : объект IntentFilter, указывающий, какое событие должен прослушивать приемник к.

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

Это ваша задача, чтобы правильно обрабатывать жизненного цикла. Таким образом, когда вы добавляете приемник динамически, позаботьтесь о том, чтобы отменить регистрацию того же приемника в методе onPause() вашей деятельности!

Я предлагаю зарегистрировать приемник в onResume() метод вашей деятельности и отменить его в вашем методе onPause ():

@Override
protected void onPause() {
   unregisterReceiver(mReceiver);
   super.onPause();
}

@Override
protected void onResume() {
   this.mReceiver = new ConnectivityChangeReceiver();
   registerReceiver(
         this.mReceiver, 
         new IntentFilter(
               ConnectivityManager.CONNECTIVITY_ACTION));
   super.onResume();
}

когда использовать, какой метод для регистрации

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

  • ваше приложение предлагает какой-то сервис вокруг этих событий
  • ваше приложение хочет реагировать любезно состояние меняется

примеры для первой категории это приложения, которые должны работать, как только устройство загружается или которые должны начать какую-то работу, когда приложение установлено. Battery Widget Pro или App2SD являются хорошими примерами для таких приложений. Для этого типа необходимо зарегистрировать BroadcastReceiver в файле манифеста.

примеры для второй категории являются ли события, которые сигнализируют a изменение обстоятельств, на которые может полагаться ваше приложение. Скажем, ваше приложение зависит от установленного соединения Bluetooth. Вы должны реагировать на изменение состояния, – но только когда приложение активно. В этом случае нет необходимости в статически регистрацию широковещательного приемника. Динамически зарегистрированный был бы более разумным.

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