Android service start on boot

Android. Автозапуск приложения при загрузке: теория и практика

1. Теория

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

    В манифесте в элементе «manifest» указать разрешение:

В манифесте в элементе «application» зарегистрировать ваш ресивер на прием сообщения ACTION_BOOT_COMPLETED:

Используйте правильное полное или относительное имя класса вашего broadcast-ресивера. В описании ресивера без необходимости не указывайте атрибуты «enabled», «exported» и т.д. Вполне достаточно настроек и атрибутов по умолчанию.

Код вашего broadcast-ресивера:

Если ваш ресивер используется только для сообщения ACTION_BOOT_COMPLETED, то проверка «if» не обязательна. Однако иногда разработчики используют один и тот же ресивер для разных сообщений. В этом случае фильтруйте сообщения, проверяя их внутри метода onReceive.

Приложение должно быть установлено на внутреннюю память. ОС Android устроена таким образом, что сообщение ACTION_BOOT_COMPLETED отправляется приложениям перед монтированием внешний памяти. Поэтому приложения, установленные на внешней памяти, никогда не получат это сообщение. Чтобы указать системе не устанавливать приложение на внешнюю память, в манифесте НЕ нужно прописывать для атрибута «@android:installLocation» значения «auto» или «preferExternal». По умолчанию, т.е. если этот атрибут не указан, ОС установит ваше приложение только на внутреннюю память. Однако согласно официальной документации лучше явно указать значение «internalOnly», чтобы у вас и других разработчиков не возникло искушение в будущем указать иное значение.

После установки или принудительной остановки (force stop) приложение должно быть запущено хотя бы один раз, чтобы система «запомнила» это приложение для отправки ему сообщения ACTION_BOOT_COMPLETED. Такое поведение было реализовано в версии Android 3.1 в целях безопасности. В чем суть? Все только что установленные приложения находятся в состоянии «stopped» (не путать с активити, т.к. ОС управляет этим состоянием у приложений и активити по-разному). В это же состояние приложение «уходит», когда пользователь в настройках телефона принудительно его останавливает. Пока приложение находится в таком состоянии, оно не будет запущено системой ни по какой причине (например, через ACTION_BOOT_COMPLETED), исключая, конечно же, запуск самим пользователем. Благодаря такому нововведению немалая часть«вирусни и троянцев» перестала работать, т.к. уже нет возможности запуститься автоматом после установки.

Исключение составляют системные приложения: см. замечание пользователя kolipass.

Особенности режима Fast boot в HTC-устройствах. Известно, что HTC-устройства не перезагружаются в классическом смысле, а используют так наз. режим Fast boot (это одна из форм гибернации), сохраняя состояние ОС на диск. Поэтому сообщение ACTION_BOOT_COMPLETED не отправляется системой, т.к. в действительности перезагрузка не происходит (см. здесь). Вместо ACTION_BOOT_COMPLETED система может отправить следующие сообщения:

В вашем приложении укажите в теге «receiver» кроме ACTION_BOOT_COMPLETED также вышеуказанные сообщения. Кроме этого необходимо прописать разрешение в дополнение к п.1:

2. Практика: ошибки и особенности эксплуатации

Разберем ошибки, которые совершают новички при настройке приложения и в коде.

    После установки или force stop приложение ни разу не запускалось (см. п.1.5).

Приложение установлено не на внутренней памяти, или пользователь вручную перенес его на внешнюю память (см. п. 1.4).

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

Также некоторые разработчики, отлаживая приложение, в logcat не видели своих сообщений из ресивера. Используйте Toast для отладки:

Опечатки или несуществующие сообщения внутри тега ресивера:

Неправильное положение элементов в манифесте приложения:

  • «uses-permission» должен быть указан только как прямой потомок элемента «manifest», не нужно его указывать/дублировать в теге «receiver»;
  • тег «receiver» должен быть указан только как прямой потомок элемента «application».
Читайте также:  Vplay apk для android tv

  • Различные диспетчеры задач, оптимизаторы, приложения безопасности, Startup-менеджеры и т.п. могут отслеживать регистрацию приложения для приема ACTION_BOOT_COMPLETED и запрещать/разрешать его получение при загрузке. Удалите эти приложения или добавьте в исключение вашу программу в их настройках.

    Как было указано выше, некоторые устройства используют режим Fast boot. Можно попробовать в настройках телефона отключить этот режим или учесть п. 1.6.

    В приложении нет ни одной активити, поэтому после установки у пользователя нет возможности хотя бы 1 раз запустить ваше приложение. Из-за этого сообщение ACTION_BOOT_COMPLETED не будет отправлено в ваше приложение.

    Не ошибки, но все же: указаны лишние, не обязательные атрибуты в теге «receiver», например («uses-permission», «enabled», «exported»):

    3. Отладка ресивера в эмуляторе и на реальных устройствах.

      В терминале выполните:

    Далее, чтобы отправить ACTION_BOOT_COMPLETED всем приложениям, наберите в терминале:

    Или для отправки ACTION_BOOT_COMPLETED конкретному приложению наберите в терминале:

    В эмуляторе: установите ваше ПО, запустив его из студии. При этом студия соберет ваш проект, установит приложение и запустит его. После этого закройте эмулятор (это аналогично выключению на реальном устройстве). Чтобы получить сообщение ACTION_BOOT_COMPLETED, запустите эмулятор из AVD-менеджера, а не с помощью кнопки «Run app» в тулбаре студии.

    После запуска эмулятора во вкладке Android Monitor укажите запущенный эмулятор и ваше приложение, чтобы просмотреть логи logcat.

    Итоги

    Чтобы ваше приложение запускалось при загрузке на всех устройствах, манифест как минимум должен выглядеть так:

    Код ресивера, как правило, будет таким:

    Надеюсь, эта статья поможет новичкам побороть «коварного врага» под названием «ACTION_BOOT_COMPLETED».

    Источник

    Android Start Service on Boot Example

    Posted by: Chryssa Aliferi in activity February 8th, 2016 1 Comment Views

    In the mobile device world, many times, we may need to make an application that has to do some tasks in the background, without the users to have to open their application. Some easy examples are the background Location tracking, or an alarm application, or the applications that want to receive push events from a server.

    This can be done with the use of a service that will run in the background and will start on device boot, or on application update in a device. In order to achieve this, we are going to register a BroadcastReceiver to listen to RECEIVE_BOOT_COMPLETED events and then start a service to do whatever we may want our service to do.

    So, in this example, we are going to show how to make an application that has an Android service that starts service at device boot.

    For our example will use the following tools in a Windows 64-bit or an OS X platform:

    • JDK 1.7
    • Android Studio 1.3.2
    • Android SDK 5.0

    Let’s take a closer look:

    1. Create a New Android Studio Project

    Open Android Studio and choose “Start a new Android Studio Project” in the welcome screen.

    “Welcome to Android Studio” screen. Choose “Start a new Android Studio Project”.

    Specify the name of the application, the project and the package.

    “Configure your new project” screen. Add your application name and the projects package name.

    In the next window, select the form factors your app will run on.

    “Target Android Devices” screen.

    In the next window you should choose “Add no activity”. In this example, we are going to create our Activity.

    “Add an activity to Mobile”. Choose: “Add no activity”.

    Now, our project has just been created!

    2. Create the layout and the source code of a simple AndroidStartServiceOnBoot Activity

    Add a new Java class Activity inside src/com.javacodegeeks.androidserviceonbootexample/ so that we are going to have the src/com.javacodegeeks.androidserviceonbootexample/AndroidCustomFontExample.java file and paste the code below.

    Actually, this activity will not do anything concerning the service that starts on boot. All the logic regarding the service is explained in the next lines.

    3. Creating the source code of the BroadcastReceiverOnBootComplete Service

    Add a new Java class inside src/com.javacodegeeks.androidserviceonbootexample/ so that we are going to have the src/com.javacodegeeks.androidserviceonbootexample/BroadcastReceiverOnBootComplete.java file and paste the code below.

    Читайте также:  Repair system android 4pda

    We have just created a BroadcastReceiver that will receive the ACTION_BOOT_COMPLETED intent. This means that when we boot up our device this class will “catch” the event and start the AndroidServiceStartOnBoot service.

    4. Creating the source code of the AndroidServiceStartOnBoot Service

    Add a new Java class inside src/com.javacodegeeks.androidserviceonbootexample/ so that we are going to have the src/com.javacodegeeks.androidserviceonbootexample/AndroidServiceStartOnBoot.java file and paste the code below.

    5. Editing the Android Manifest xml

    The AndroidManifest.xml of our project is :

    In this AndroidManifest.xml we register the application to listen to android.intent.action.BOOT_COMPLETED . Additionally, we register the android.intent.action.PACKAGE_REPLACED and the android.intent.action.PACKAGE_ADDED events. These events can catch the installation and update of our application, so that our service will start not only on device boot, but on application update.

    We also have to register our service in the AndroidManifest.xml . This happens at line 24.

    6. Build, compile and run

    When we build, compile and run our project, the main Android ServiceStart OnBoot application should look like this:

    This is this how our application should look like.

    This application does not do anythining in its activity. All the work is done in the service that starts to run on the boot of our device, or on update of our application.

    This is the service that runs in our device.

    This is the service that runs in our device.

    7. Download the Android Studio Project

    This was an example of Android AndroidServiceStartOnBoot.

    Источник

    Android-запуск службы при загрузке

    из всего, что я видел на Stack Exchange и в других местах, у меня все настроено правильно, чтобы запустить IntentService при загрузке ОС Android. К сожалению не запускается при загрузке, и я не получаю никаких ошибок. Может, эксперты помогут.

    BroadcastReceiver для запуска:

    обновление: Я пробовал почти все предложения ниже, и я добавил ведение журнала, такие как Log.v(«BatteryLogger», «Got to onReceive, about to start service»); к onReceive обработчик StartupIntentReceiver, и ничего никогда не регистрируется. Таким образом, он даже не попадает в BroadcastReceiver.

    Я думаю, что я развертываю APK и тестирую правильно, просто запускаю отладку в Eclipse, и консоль говорит, что она успешно устанавливает ее на мой планшет Xoom в BatteryLoggerbinBatteryLogger.АПК. Затем, чтобы проверить, я перезагружаю планшет, а затем смотрю журналы в DDMS и проверяю запущенные службы в настройках ОС. Все это звучит правильно, или я чего-то не хватает? Опять же, любая помощь очень ценится.

    6 ответов

    Ну вот полный пример приложения автозапуска

    файл AndroidManifest

    автозапуск.java

    сервис.java

    Здравствуйте.java — это всплывающее окно каждый раз при запуске устройства после выполнения приложения один раз.

    должно работать следующее. Я проверил. Может быть ваша проблема где-то еще.

    ваш сервис может быть закрыт до его завершения из-за того, что устройство будет спать после загрузки. Сначала вам нужно получить wake lock. К счастью,библиотека поддержки дает нам класс для этого:

    затем, на вашем сервисе, убедитесь, что отпустите блокировку пробуждения:

    не забудьте добавить разрешение wake_lock:

    очень похоже шахты но я использую полное имя пакета для приемника:

    Источник

    Полный список

    — изучаем IntentService
    — включаем режим Foreground для сервиса
    — помещаем сервис в автозагрузку

    Строили мы, строили, и, наконец, построили. Урок номер 100, с чем всех нас и поздравляю )

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

    IntentService

    Это подкласс обычного Service. Он используется, если вам в сервисе надо выполнять какие-то тяжелые задачи, и вы не хотите сами возиться с асинхронностью. Принцип работы этого вида сервиса прост. Он создает новый поток для своей работы. Затем берет все Intent пришедшие ему в onStartCommand и отправляет их на обработку в этот поток. Как именно обрабатываются Intent – зависит от нас, т.к. мы сами кодим это в методе onHandleIntent.

    Читайте также:  Adb форматирование sd карты для андроид как внутренней памяти

    Т.е. приложение сыпет в сервис вызовами startService, в которых передает Intent-ы. IntentService принимает эти вызовы в onStartCommand, берет Intent-ы и отправляет их в очередь на обработку. И далее они поочередно обрабатываются в отдельном потоке методом onHandleIntent. Когда последний Intent из очереди обработан, сервис сам завершает свою работу.

    В приложении делаем три вызова:

    Где time – это время паузы, которую будем делать в сервисе, а label – просто метка, чтобы отличать вызовы.

    Здесь необходим конструктор, в котором вызываем конструктор супер-класса и указываем какое-нить имя. Оно будет использовано для наименования потока.

    В методе onHandleIntent кодим обработку Intent-ов. Достаем из них time и label, запускаем паузу на time секунд и выводим в лог label в начале и в конце.

    В итоге, при запуске в логах видим:

    11:07:37.880: D/myLogs(4137): onCreate
    11:07:37.880: D/myLogs(4137): onHandleIntent start Call 1
    11:07:40.880: D/myLogs(4137): onHandleIntent end Call 1
    11:07:40.880: D/myLogs(4137): onHandleIntent start Call 2
    11:07:41.880: D/myLogs(4137): onHandleIntent end Call 2
    11:07:41.880: D/myLogs(4137): onHandleIntent start Call 3
    11:07:45.890: D/myLogs(4137): onHandleIntent end Call 3
    11:07:45.890: D/myLogs(4137): onDestroy

    Сервис создался, вызовы выполнились по очереди и сервис завершил работу. От нас понадобилось только накодить обработку.

    Foreground

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

    На вход он принимает те же параметры, что и NotificationManager.notify – ID и Notification.

    Т.е. вы создаете уведомление, назначаете ему ID и передаете это в startForeground. Сервис переходит в режим IDDQD :), а в статус-баре появилось уведомление.

    Оно появилось в разделе для постоянных уведомлений (Ongoing).

    Метод stopForeground (boolean removeNotification) — возвращает сервису способность быть убитым системой в случае острой нехватки памяти. А на вход он принимает boolean-значение – удалять уведомление из статус-бара или нет.

    Уведомление также пропадет, когда сервис будет остановлен.

    Эти методы работают, начиная с Android 2.0. Пример реализации для более ранних версий есть в хелпе.

    Напомню, что уведомления мы научились создавать на прошлом уроке.

    Автозагрузка

    Сервисы для получения погоды или почты имеет смысл помещать в автозагрузку. Для этого нам надо создать BroadcastReceiver, настроить его IntentFilter на Action = android.intent.action.BOOT_COMPLETED, и добавить права android.permission.RECEIVE_BOOT_COMPLETED. Этот BroadcastReceiver будет вызван системой при старте системы и в нем мы кодим запуск сервиса.

    Допустим, есть проект с сервисом MyService.

    Создаем в проекте класс MyBroadReceiv

    В манифесте добавляем его как Receiver и настраиваем фильтр

    Добавляем права на получение сообщения о загрузке

    Инсталлим проект на AVD. Закрываем AVD. Запускаем через меню в Eclipse: Window > AVD Manager. Находим там наш эмулятор и запускаем вручную.

    Когда он запустился, смотрим логи

    onReceive android.intent.action.BOOT_COMPLETED
    MyService onCreate
    MyService onStartCommand

    Сработал BroadcastReceiver и запустил сервис.

    Если после запуска AVD логи не отображаются, то откройте DDMS и во вкладке Devices явно выберите ваш AVD.

    P.S. Я уже писал об этом, но напишу еще раз. Последующие уроки будут выходить по более свободному графику. Следите за обновлениями.

    На следующем уроке:

    — создаем свой ContentProvider

    Присоединяйтесь к нам в Telegram:

    — в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

    — в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

    — ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

    — новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

    Источник

  • Оцените статью