Как объявить явный приемник на Android 9

#android #android-9.0-pie

#Android #android-9.0-pie

Вопрос:

У меня возникли небольшие проблемы с объявлением получателя в манифесте и заставить его работать.

Я знаю, что с Android 8.0 не может быть никаких неявных широковещательных приемников, объявленных в манифесте, но это могут быть объявленные явные приемники.

Итак, я объявил свой так в манифесте:

 <receiver android:name=".util.AppReceiver" android:enabled="true" android:exported="false">
    <intent-filter>
        <action android:name="com.ibermatica.mime.starttracking" />
    </intent-filter>
</receiver>
  

После этого я устанавливаю приложение в телефоне в режиме отладки и устанавливаю точку останова в методе onReceive, который содержит этот код:

 if(intent.getAction() != null){
    switch (intent.getAction()){
        case Util.START_TRACKING:
            Intent i;
            i = new Intent(context, LocationUpdatesService.class);
            context.startService(i);
            break;
        default:
    }
}
  

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

adb shell am broadcast -a com.ibermatica.mime.starttracking

Но ничего не происходит, и приемник не вызывается. Что не так или что я должен сделать, чтобы исправить это?

Заранее благодарю вас!

Комментарии:

1. Невозможно объявить явный приемник только для моего приложения? Создание службы переднего плана только для прослушивания широковещательных сообщений с уведомлением было бы действительно раздражающим…

Ответ №1:

Я знаю, что с Android 8.0 не может быть никаких неявных широковещательных приемников, объявленных в манифесте, но это могут быть объявленные явные приемники.

«Явный» и «неявный» — это термины, используемые для обозначения типов Intent объектов, а не записей манифеста.

Но ничего не происходит, и приемник не вызывается.

Правильно. Вы создаете неявный Intent в командной строке, а неявные Intent трансляции обычно не работают на Android 8.0 .

Попробуйте:

 adb shell am broadcast -n com.whatever/.util.AppReceiver -a com.ibermatica.mime.starttracking
  

где вы com.whatever заменяете свой идентификатор приложения.

Комментарии:

1. Хорошо, понял часть явных и неявных терминов, спасибо! Но я, должно быть, делаю что-то не так, потому что команда не работает, я набираю: adb shell am broadcast -n com.ibermatica.mime/.util. Получателем является com.ibermatica.mime мой идентификатор приложения, но ничего не происходит. Я также пробовал: adb shell am broadcast -n com.ibermatica.mime.starttracking/.util. AppReceiver является .starttracking в intent-фильтре, но он тоже не работает… Любая подсказка о том, что может происходить? Большое вам спасибо, ваша помощь действительно ценится!

2. @misterpresid: ваш код зависит от строки действия ( switch (intent.getAction()) ), и я не знаю, как ваш реальный код отправляет эту трансляцию. Я обновил свой ответ, чтобы добавить обратно в -a com.ibermatica.mime.starttracking , чтобы добавить строку действия в командную строку.

3. Да, я тоже пробовал это, но это тоже не работает. У меня есть точка останова метода в onReceive (…) и она не достигает ее. Мне не нужно ничего делать, кроме как объявить его в манифесте и иметь код в onReceive, верно? Еще раз, большое вам спасибо за помощь!

4. @misterpresid: Еще одна проблема android:exported="false" . Это блокирует вашу возможность отправлять трансляции на этот приемник извне приложения, которое включает adb shell am broadcast в себя. Либо временно экспортируйте этот приемник, либо переключитесь на тестирование в самом проекте (например, тесты инструментария).

5. Хорошо, я только что попробовал это, и я действительно тупой. Я скопировал ваш код и вставил его, не меняя com.whatever. Изменение этого вместе с экспортом работает как шарм. Большое вам спасибо!!