Регистрация приемника вещания в манифесте против активности

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

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

<?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)

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

Can anyone tell me why this does not work when just adjusting your intent filter in the manifest and why you need to have a service running in the background that references/registers the receiver?

Is there a work around so that I can just register my receiver in my app's manifest using an intent filter with android.intent.action.HEADSET_PLUG?

How can do I identify which Broadcast actions from the android documentation need to have a service or activity register them versus just having the right filter in the manifest?

Ответы на вопрос(2)

Решение Вопроса

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

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

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

 26 окт. 2015 г., 06:11
Для первого абзаца .. снимаю шляпу :)
 08 нояб. 2016 г., 07:48
@BehzadBahmanyar Ниже ссылки самая близкая вещь, которую я мог найти.developer.android.com/reference/android/content/….
 08 нояб. 2016 г., 07:53
@BehzadBahmanyar Также см. Комментарии CommonsWare в этом вопросе:stackoverflow.com/a/3652085/2818583
 Arnab C.04 июн. 2012 г., 05:53
intent.Flag .. и найти его в исходном коде имеет смысл. Спасибо
 29 мар. 2016 г., 16:13
Есть ли у вас официальный документ в поддержку вашего заявления (If you receiver is registered in the manifest and your app is not running, a new process will be created to handle the broadcast.)?

нифеста AndroidManifest.xml. BroadcastReceiver, настроенный таким образом, называется статически зарегистрированным.

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

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

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

Dyanmic Broadcast Recievers

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

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

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

receiver : The BroadcastReceiver you want to register filter : The IntentFilter object that specifies which event your receiver should listen to.

When you register your receiver in this way, it lives for as long as the component livesand Android sends events to this receiver until the creating component itself gets destroyed.

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

Я предлагаю зарегистрировать получатель в методе onResume () вашей Activity и отменить его регистрацию в вашем методе 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, зависит от того, что ваше приложение делает с системным событием. Я думаю, что в основном есть две причины, по которым ваше приложение хочет знать о системных событиях:

Your app offers some kind of service around these events Your app wants to react graciously to state changes

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

Examples for the second category события, которые сигнализируют об изменении обстоятельств, на которые может положиться ваше приложение. Скажем, ваше приложение зависит от установленного соединения Bluetooth. Вы должны реагировать на изменение состояния & # x2013; но только когда ваше приложение активно. В этом случае нет необходимости в статически зарегистрированном приемнике вещания. Динамически зарегистрированный был бы более разумным.

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

 11 сент. 2018 г., 09:31
очень хорошо сказано, брат.

Ваш ответ на вопрос