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.
В этом случае есть два решения:
- Установите приложение во внутреннее хранилище
- Установите еще одно небольшое приложение во внутреннем хранилище. Это приложение получает 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