Come avviare il servizio all'avvio del dispositivo (app di esecuzione automatica, ecc.)
Per prima cosa: dalla versione Android 3.1+ non ricevi BOOT_COMPLETE se l'utente non ha mai avviato l'app almeno una volta o l'applicazione "forza chiusa" dell'utente. Ciò è stato fatto per impedire al malware di registrare automaticamente il servizio. Questa falla di sicurezza è stata chiusa nelle versioni più recenti di Android.
Soluzione:
Crea un'app con attività. Quando l'utente lo esegue una volta, l'app può ricevere il messaggio di trasmissione BOOT_COMPLETE.
Per il secondo: BOOT_COMPLETE viene inviato prima che venga montata la memoria esterna. Se l'app è installata su un archivio esterno, non riceverà il messaggio di trasmissione BOOT_COMPLETE.
In questo caso esistono due soluzioni:
- Installa la tua app nella memoria interna
- Installa un'altra piccola app nella memoria interna. Questa app riceve BOOT_COMPLETE ed esegue la seconda app su memoria esterna.
Se l'app è già installata nella memoria interna, il codice seguente può aiutarti a capire come avviare il servizio all'avvio del dispositivo.
In Manifest.xml
Autorizzazione:
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Registra il tuo ricevitore BOOT_COMPLETED:
<receiver android:name="org.yourapp.OnBoot">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Registra il tuo servizio:
<service android:name="org.yourapp.YourCoolService" />
Nel ricevitore 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);
}
}
Per HTC potresti dover aggiungere anche Manifest questo codice se il dispositivo non rileva RECEIVE_BOOT_COMPLETED:
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
Il ricevitore ora assomiglia a questo:
<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>
Come testare BOOT_COMPLETED senza riavviare l'emulatore o il dispositivo reale? È facile. Prova questo:
adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED
Come ottenere l'ID dispositivo? Ottieni un elenco di dispositivi collegati con ID:
adb devices
adb in ADT di default puoi trovare in:
adt-installation-dir/sdk/platform-tools
Godere! )