Android: запустить службу при загрузке? - PullRequest
1 голос
/ 21 мая 2011

Я действительно новичок в 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 ]

4 голосов
/ 24 сентября 2014

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

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

Решение:

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

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

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

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

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


In 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

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

3 голосов
/ 21 мая 2011

Похоже, имя в разделе получателя неверно. Вот как выглядит запись моего приложения в 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

...