Як запустити службу при завантаженні пристрою (програма автозапуску тощо)
Для початку: починаючи з версії 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 вам може знадобитися також додати в Manifest цей код, якщо пристрій не застане 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
Насолоджуйтесь! )