Android: запустить сервис при загрузке?

Я новичок в Java, но опытный C#-кодер.

Я создал сервис, который я могу запускать / останавливать от активности. У меня вопрос, как мне "установить" этот сервис, чтобы он запускался при загрузке моего устройства?

Я нашел это:

Попытка запустить сервис при загрузке на Android

Я попытался реализовать это так:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="james.jamesspackage" android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="7" />

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<application android:icon="@drawable/icon" android:label="@string/app_name"
    android:debuggable="true">
    <activity android:name=".jamessActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <service android:enabled="true" android:name=".MyService">
        <intent-filter>
            <action android:name="james.jamesspackage.MyService" />
        </intent-filter>
        </service>
    <receiver android:name="james.jamesspackage.MyBroadcastReceiver">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
            <category android:name="android.intent.category.HOME" />
        </intent-filter>
    </receiver>
</application>
</manifest>

В чем дело? Могу ли я иметь деятельность и службу / получателя в одном манифесте?

Спасибо

Джеймс

2 ответа

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

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

Решение:

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

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

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

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

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


В Manifest.xml

Разрешение:

<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

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

Похоже, имя в разделе получателя неверно. Вот как выглядит запись моего приложения в AndroidManifest.xml:

   <application android:icon="@drawable/icon" android:label="@string/app_name">

    <receiver android:name=".BootListener" 
             android:enabled="true" 
             android:exported="false"
             android:label="BootListener">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
    </receiver>

       <service android:name=".UpdateService">
       </service>

       <activity android:name=".Info"
                 android:label="@string/app_name">
           <intent-filter>
               <action android:name="android.intent.action.MAIN" />
               <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
       </activity>

    <activity android:name=".TravelMapperPreferences"
              android:label="Settings">
    </activity>        

   </application>

Обратите внимание, что имена относятся к пакету в декларации манифеста. Ваше имя получателя должно быть ".MyBroadcastReceiver", так как пакет манифеста содержит james.jamesspackage

Другие вопросы по тегам