#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. Изменение этого вместе с экспортом работает как шарм. Большое вам спасибо!!