Jak uruchomić usługę po uruchomieniu urządzenia (aplikacja autorun itp.)
Po pierwsze: od wersji Androida 3.1+ nie otrzymasz BOOT_COMPLETE, jeśli użytkownik nigdy nie uruchomił Twojej aplikacji przynajmniej raz lub użytkownik „wymusi zamknięcie” aplikacji. Zrobiono to, aby zapobiec automatycznemu rejestrowaniu usługi przez złośliwe oprogramowanie. Luka w zabezpieczeniach została zamknięta w nowszych wersjach Androida.
Rozwiązanie:
Utwórz aplikację z aktywnością. Gdy użytkownik uruchomi go raz, aplikacja może odebrać komunikat emisji BOOT_COMPLETE.
Po drugie: BOOT_COMPLETE jest wysyłane przed podłączeniem pamięci zewnętrznej. Jeśli aplikacja jest zainstalowana w pamięci zewnętrznej, nie otrzyma komunikatu emisji BOOT_COMPLETE.
W tym przypadku istnieją dwa rozwiązania:
- Zainstaluj aplikację w pamięci wewnętrznej
- Zainstaluj kolejną małą aplikację w pamięci wewnętrznej. Ta aplikacja otrzymuje BOOT_COMPLETE i uruchamia drugą aplikację na pamięci zewnętrznej.
Jeśli Twoja aplikacja jest już zainstalowana w pamięci wewnętrznej, poniższy kod może pomóc zrozumieć, jak uruchomić usługę po uruchomieniu urządzenia.
W pliku Manifest.xml
Pozwolenie:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Zarejestruj swój odbiornik BOOT_COMPLETED:
<receiver android:name="org.yourapp.OnBoot">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Zarejestruj swoją usługę:
<service android:name="org.yourapp.YourCoolService" />
W odbiorniku 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);
}
}
W przypadku HTC może być konieczne dodanie Manifestuj ten kod, jeśli urządzenie nie wyłapuje RECEIVE_BOOT_COMPLETED:
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
Odbiornik wygląda teraz tak:
<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>
Jak przetestować BOOT_COMPLETED bez restartu emulatora lub rzeczywistego urządzenia? To jest łatwe. Spróbuj tego:
adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED
Jak uzyskać identyfikator urządzenia? Uzyskaj listę podłączonych urządzeń o identyfikatorach:
adb devices
adb w ADT domyślnie można znaleźć w:
adt-installation-dir/sdk/platform-tools
Cieszyć się! )