Я пытался запустить службу, когда устройство загружается на Android, но я не могу заставить его работать. Я посмотрел несколько ссылок в Интернете, но ни один код не работает. Я что-то забыл?
AndroidManifest.xml
<receiver
android:name=".StartServiceAtBootReceiver"
android:enabled="true"
android:exported="false"
android:label="StartServiceAtBootReceiver" >
<intent-filter>
<action android:name="android.intent.action._BOOT_COMPLETED" />
</intent-filter>
</receiver>
<service
android:name="com.test.RunService"
android:enabled="true" />
BroadcastReceiver
public void onReceive(Context context, Intent intent) {
if ("android.intent.action.BOOT_COMPLETED".equals(intent.getAction())) {
Intent serviceLauncher = new Intent(context, RunService.class);
context.startService(serviceLauncher);
Log.v("TEST", "Service loaded at start");
}
}
Ответы:
Остальные ответы выглядят неплохо, но я подумал, что все это оберну в один полный ответ.
Вам нужно следующее в вашем
AndroidManifest.xml
файле:В вашей
<manifest>
стихии:В вашем
<application>
элементе (обязательно используйте полное имя [или относительного] класса для вашегоBroadcastReceiver
):(вам не нужно
android:enabled
,exported
и т.д., атрибуты: андроид по умолчанию является правильным)В
MyBroadcastReceiver.java
:Из оригинального вопроса:
<receiver>
элемент в<application>
элементеBroadcastReceiver
было указано<intent-filter>
источник
В качестве дополнительной информации: BOOT_COMPLETE отправляется в приложения до подключением внешнего хранилища. Таким образом, если приложение установлено во внешнее хранилище, оно не получит широковещательное сообщение BOOT_COMPLETE.
Подробнее здесь, в разделе Приемники вещания, прослушивающие "загрузка завершена"
источник
Как запустить службу при загрузке устройства (приложение автозапуска и т. Д.)
Для начала: начиная с версии Android 3.1+ вы не получите BOOT_COMPLETE, если пользователь никогда не запускал ваше приложение или пользователь «принудительно закрывал» приложение. Это было сделано для того, чтобы вредоносная программа автоматически не регистрировала сервис. Эта дыра в безопасности была закрыта в новых версиях Android.
Решение:
Создать приложение с активностью. Когда пользователь запускает его один раз, приложение может получить широковещательное сообщение BOOT_COMPLETE.
Для второго: BOOT_COMPLETE отправляется до монтирования внешнего хранилища. Если приложение установлено во внешнее хранилище, оно не получит широковещательное сообщение BOOT_COMPLETE.
В этом случае есть два решения:
Если ваше приложение уже установлено во внутреннем хранилище, приведенный ниже код поможет вам понять, как запустить службу при загрузке устройства.
В Manifest.xml
Разрешение:
Зарегистрируйте своего получателя BOOT_COMPLETED:
Зарегистрируйте свой сервис:
В получателе OnBoot.java:
Для HTC вам может понадобиться добавить этот код в манифест, если устройство не перехватывает RECEIVE_BOOT_COMPLETED:
Приемник теперь выглядит так:
Как проверить BOOT_COMPLETED без перезагрузки эмулятора или реального устройства? Это просто. Попробуй это:
Как получить идентификатор устройства? Получить список подключенных устройств с идентификаторами:
ADB в ADT по умолчанию вы можете найти в:
Наслаждайтесь! )
источник
Вместе с
также использовать,
Устройства HTC, кажется, не ловят BOOT_COMPLETED
источник
android.intent.action.QUICKBOOT_POWERON
отправляется только при восстановлении из быстрой загрузки. Это означает, что нет необходимости выполнять такие действия, как сброс аварийных сигналов при восстановлении из быстрой загрузки, поскольку они сохраняются. Поэтому использовать его нужно только в том<action android:name="android.intent.action.QUICKBOOT_POWERON" />
случае, если вы хотите что-то сделать, когда пользователь считает, что устройство загружено.обратите внимание, что в начале вопроса есть ошибка опечатки:
<action android:name="android.intent.action._BOOT_COMPLETED"/>
вместо того :
<action android:name="android.intent.action.BOOT_COMPLETED"/>
одна маленькая "_" и все это беда :)
источник
Я только сейчас узнал, что это может быть из-за
Fast Boot
варианта вSettings
>Power
Когда эта опция отключена, мое приложение получает эту трансляцию, но не иначе.
Кстати, у меня есть
Android 2.3.3
наHTC Incredible S
.Надеюсь, поможет.
источник
Я думаю, что ваш манифест должен добавить:
источник
Перепробовав все упомянутые ответы и хитрости, я, наконец, выяснил, почему код не работает в моем телефоне. Некоторые телефоны Android, такие как «Huawei Honor 3C Android 4.2.2 », имеют в своем меню меню Statup Manager, и ваше приложение должно быть проверено в списке. :)
источник
У меня есть дополнительный
<category>
-tag, не знаю, имеет ли это какое-то значение.Вы пытались опустить предложение if
"android.intent.action.BOOT_COMPLETED".equals(intent.getAction()
, так как получатель, вероятно, в любом случае получает только это намерение?источник
Ссылка по этой ссылке http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Пошаговая процедура использования загрузки на Сервисе
источник
Перед монтированием внешнего хранилища отправляется BOOT_COMPLETE execute.Если ваше приложение установлено во внешнее хранилище, оно не получит широковещательное сообщение BOOT_COMPLETE. Чтобы предотвратить это, вы можете установить приложение во внутреннем хранилище. Вы можете сделать это, просто добавив эту строку в menifest.xml
Некоторые устройства HTC могут включать функцию «быстрой загрузки», которая больше похожа на глубокую спячку, а не на реальную перезагрузку и поэтому не должна давать намерение BOOT_COMPLETE. Чтобы восстановить это, вы можете добавить этот фильтр намерений внутри вашего приемника:
источник
Это то что я сделал
1. Я сделал класс приемника
2. в манифесте
3.И после ВСЕГО, ЧТО ВАМ НУЖНО «установить» приемник в MainActivity, он может находиться внутри onCreate.
последний шаг, который я узнал от ApiDemos
источник
Если вы используете Android Studio и очень любите автозаполнение, я должен сообщить вам, что я использую Android Studio v 1.1.0 и использовал автозаполнение для получения следующего разрешения.
И Android Studio автоматически заполнял
RECEIVE_BOOT_COMPLETED
все в нижнем регистре, какreceive_boot_completed
и я продолжал вырывать волосы, потому что я уже отмечал свой контрольный список для вещей, чтобы сделать, чтобы начать обслуживание при загрузке Я только что подтвердил еще разисточник
Как прокомментировал @Damian, все ответы в этой теме делают неправильно. Выполнение этого вручную таким образом может привести к остановке службы в середине после перехода устройства в спящий режим. Вы должны сначала получить замок от пробуждения. К счастью, библиотека поддержки предоставляет нам класс для этого:
затем, в вашем Сервисе, обязательно снимите блокировку пробуждения:
Не забудьте добавить разрешение WAKE_LOCK на свой основной фестиваль:
источник
onNewIntent()
? Или вы можете посмотреть на источник IntentService и посмотреть, что вам нужно сделать, чтобы ваш Сервис соответствовал ...На самом деле, я попал в эту проблему не так давно, и это действительно очень легко исправить, вы на самом деле ничего не делаете неправильно, если вы настраиваете
"android.intent.action.BOOT_COMPLETED"
разрешение и намеренный фильтр.Обратите внимание, что если вы работаете на Android 4.X, вам нужно запустить широковещательный приемник, прежде чем запускать службу при загрузке, это означает, что вы должны сначала добавить действие, как только ваш широковещательный приемник запустится, ваше приложение должно функционировать так, как вы ожидали, однако в Android 4.X я не нашел способа запустить службу при загрузке без какой-либо активности, я думаю, что Google сделал это по соображениям безопасности.
источник
Я столкнулся с этой проблемой, если я оставлю пустой конструктор в классе получателя. После удаления пустого contsructor onRreceive методы начали работать нормально.
источник