Насколько надежны вещательные приемники на телефонах разных марок? - PullRequest
0 голосов
/ 25 мая 2018

У меня есть декларированные объявленные трансляции для android.intent.action.PHONE_STATE и android.intent.action.NEW_OUTGOING_CALL.Я протестировал свое приложение после того, как удалил его с экрана недавних приложений.Я тестировал его на двух телефонах:

  1. MOTO G4 Play (Nougat) - после того, как я удалил свое приложение с экрана недавних приложений на этом телефоне, я получал трансляции.
  2. ASUS (Lollipop)- После того, как я удалил свое приложение с экрана Недавние приложения на этом телефоне, я не получал трансляции.

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

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

Edit-1: Я регистрирую свои трансляции следующим образом в Манифесте

 `
        <receiver android:name=".PhonecallReceiver">
            <intent-filter>
                <action android:name="android.intent.action.PHONE_STATE"
                    android:enabled="true"/>
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"
                    android:enabled="true"/>
            </intent-filter>
        </receiver>
    `

     @Override
    public void onReceive(Context context, Intent intent) {
            Log.e("onReceive ","Called"); //This is how I check whether broadcast was called or not
            //... other code
    }

1 Ответ

0 голосов
/ 25 мая 2018

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

Вы используете декларированную рассылку декларации, поэтому теоретически вы сможете получать трансляции независимо от того,находится ли ваше приложение на переднем или заднем плане (подобное поведение ожидалось во всех телефонах, поскольку ваше приложение предназначено для одного и того же API).Но были случаи, когда мобильные устройства игнорировали / исправляли некоторые из контрактов в результате некоторых ожидаемых нарушений поведения.Вполне вероятно, что подобное произошло в вашем тесте на основе ASUS.Из документации менеджера трансляции:

Если вы объявите широковещательный приемник в своем манифесте, система запустит ваше приложение (если оно еще не запущено) при отправке трансляции.

Однако есть исключение. Android недавно обновил это поведение, чтобы ограничить некоторые из этих функций.

Примечание. Если ваше приложение предназначено для уровня API 26 или выше, вы не можете использовать манифест для объявления получателя для неявных широковещательных рассылок (широковещательных рассылок, которые не ориентированы конкретно на ваше приложение), за исключением нескольких неявных широковещательных рассылок.которые освобождены от этого ограничения.В большинстве случаев вместо этого вы можете использовать запланированные задания.

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

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

Вы можете прочитать this для получения дополнительной информации.

ps попробуйте не использовать ведение журнала ошибок для информации / отладки, например Log.e("onReceive ","Called");

...