Как запустить службу при загрузке устройства (приложение автозапуска и т. Д.)
Для начала: начиная с версии Android 3.1+ вы не получите BOOT_COMPLETE, если пользователь никогда не запускал ваше приложение или пользователь принудительно закрывал приложение.
Это было сделано для предотвращения автоматической регистрации вредоносных программ. Эта дыра в безопасности была закрыта в новых версиях Android.
Решение:
Создание приложения с активностью. Когда пользователь запускает его один раз, приложение может получить широковещательное сообщение BOOT_COMPLETE.
Для второго: BOOT_COMPLETE отправляется до монтирования внешнего хранилища. Если приложение установлено во внешнее хранилище, оно не получит широковещательное сообщение BOOT_COMPLETE.
В этом случае есть два решения:
- Установите приложение во внутреннее хранилище
- Установите другое маленькое приложение во внутреннем хранилище. Это приложение получает 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
Наслаждайтесь! )