Попытка запустить сервис при загрузке на Android - PullRequest
325 голосов
/ 07 мая 2010

Я пытался запустить службу, когда устройство загружается на 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");
    }
}

Ответы [ 16 ]

599 голосов
/ 26 марта 2011

Остальные ответы выглядят хорошо, но я подумал, что я бы все обернул в один полный ответ.

Вам необходимо следующее в вашем файле AndroidManifest.xml:

  1. В вашем <manifest> элементе:

    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    
  2. В вашем элементе <application> (обязательно используйте полное имя [или относительное] имя класса для BroadcastReceiver):

    <receiver android:name="com.example.MyBroadcastReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
        </intent-filter>  
    </receiver>
    

    (вам не нужны атрибуты android:enabled, exported и т. Д., Настройки Android по умолчанию верны)

    В MyBroadcastReceiver.java:

    package com.example;
    
    public class MyBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            Intent startServiceIntent = new Intent(context, MyService.class);
            context.startService(startServiceIntent);
        }
    }
    

Из оригинального вопроса:

  • неясно, был ли элемент <receiver> в элементе <application>
  • неясно, было ли указано правильное полное (или относительное) имя класса для BroadcastReceiver
  • была опечатка в <intent-filter>
83 голосов
/ 22 ноября 2010

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

Подробнее здесь в разделе Вещательные приемники, прослушивающие "загрузка завершена"

66 голосов
/ 25 сентября 2014

Как запустить службу при загрузке устройства (приложение автозапуска и т. Д.)

Для начала: начиная с версии Android 3.1+ вы не получите BOOT_COMPLETE, если пользователь никогда не запускал ваше приложение или пользователь принудительно закрывал приложение. Это было сделано для предотвращения автоматической регистрации вредоносных программ. Эта дыра в безопасности была закрыта в новых версиях Android.

Решение:

Создание приложения с активностью. Когда пользователь запускает его один раз, приложение может получить широковещательное сообщение BOOT_COMPLETE.

Для второго: BOOT_COMPLETE отправляется до монтирования внешнего хранилища. Если приложение установлено во внешнее хранилище, оно не получит широковещательное сообщение BOOT_COMPLETE.

В этом случае есть два решения:

  1. Установите приложение во внутреннее хранилище
  2. Установите другое маленькое приложение во внутреннем хранилище. Это приложение получает BOOT_COMPLETE и запускает второе приложение на внешнем хранилище.

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


In Manifest.xml

Разрешение: 1024 * *

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

Зарегистрируйте свой BOOT_COMPLETED получатель:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
    </intent-filter>
</receiver>

Зарегистрируйте свой сервис:

<service android:name="org.yourapp.YourCoolService" />

В приемнике OnBoot.java:

public class OnBoot extends BroadcastReceiver
{

    @Override
    public void onReceive(Context context, Intent intent) 
    {
        // Create Intent
        Intent serviceIntent = new Intent(context, YourCoolService.class);
        // Start service
        context.startService(serviceIntent);

    }

 }

Для HTC вам, возможно, также понадобится добавить этот код в манифест, если устройство не перехватывает RECEIVE_BOOT_COMPLETED:

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

Приемник теперь выглядит так:

<receiver android:name="org.yourapp.OnBoot">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.QUICKBOOT_POWERON" />
    </intent-filter>
</receiver>

Как проверить BOOT_COMPLETED без перезапуска эмулятора или реального устройства? Это просто. Попробуйте это:

adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED

Как получить идентификатор устройства? Получить список подключенных устройств с идентификаторами:

adb devices

adb в ADT по умолчанию вы можете найти в:

adt-installation-dir/sdk/platform-tools

Наслаждайтесь! )

34 голосов
/ 14 мая 2013

Наряду с

<action android:name="android.intent.action.BOOT_COMPLETED" />  

также используйте,

<action android:name="android.intent.action.QUICKBOOT_POWERON" />

Устройства HTC, похоже, не ловят BOOT_COMPLETED

20 голосов
/ 05 февраля 2011

обратите внимание, что в начале вопроса есть опечатка:

<action android:name="android.intent.action._BOOT_COMPLETED"/>

вместо:

<action android:name="android.intent.action.BOOT_COMPLETED"/>

одна маленькая "_" и вся эта беда:)

13 голосов
/ 12 января 2012

Я только что узнал, что это может быть из-за опции Fast Boot в Settings> Power

Когда у меня отключена эта опция, мое приложение получает эту трансляцию, но не иначе.

Кстати, у меня Android 2.3.3 на HTC Incredible S.

Надеюсь, это поможет.

12 голосов
/ 07 мая 2010

Я думаю, что ваш манифест должен добавить:

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
6 голосов
/ 06 сентября 2015

Попробовав все упомянутые ответы и хитрости, я наконец-то выяснил, почему код не работает в моем телефоне. Некоторые телефоны Android, такие как «Huawei Honor 3C Android 4.2.2 », имеют в своих настройках меню Statup Manager , и ваше приложение необходимо проверить в списке. :)

5 голосов
/ 07 мая 2010

У меня есть дополнительный тег <category>, не знаю, имеет ли это какое-то значение.

<receiver android:name="BootIntentReceiver">  
        <intent-filter>  
            <action android:name="android.intent.action.BOOT_COMPLETED" />  
            <category android:name="android.intent.category.HOME" />  
        </intent-filter>  
</receiver>

Вы пытались опустить условие if "android.intent.action.BOOT_COMPLETED".equals(intent.getAction(), так как получатель, вероятно, только получает это намерение?

4 голосов
/ 17 февраля 2014

См. Эту ссылку http://khurramitdeveloper.blogspot.in/2013/06/start-activity-or-service-on-boot.html Пошаговая процедура для использования загрузки в службе

...