Как запустить службу при загрузке устройства (приложение автозапуска и т. Д.)
Для начала: начиная с версии 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
Наслаждайтесь! )