Comment lancer un service au démarrage du périphérique (application autorun, etc.) ?
Tout d'abord, depuis la version Android 3.1+, vous ne recevez pas BOOT_COMPLETE si l'utilisateur n'a jamais démarré votre application au moins une fois ou si l'utilisateur a "forcé la fermeture" de l'application. Cela a été fait pour empêcher les logiciels malveillants d'enregistrer automatiquement un service. Cette faille de sécurité a été comblée dans les versions plus récentes d'Android.
Solution :
Créez une application avec une activité. Lorsque l'utilisateur l'exécute une fois, l'application peut recevoir le message de diffusion BOOT_COMPLETE.
Pour la seconde : BOOT_COMPLETE est envoyé avant que le stockage externe soit monté. Si l'application est installée sur le stockage externe, elle ne recevra pas le message de diffusion BOOT_COMPLETE.
Dans ce cas, il y a deux solutions :
- Installez votre application sur le stockage interne
- Installez une autre petite application dans le stockage interne. Cette application reçoit BOOT_COMPLETE et lance la deuxième application sur le stockage externe.
Si votre application est déjà installée dans le stockage interne, le code ci-dessous peut vous aider à comprendre comment démarrer le service au démarrage de l'appareil.
Dans Manifest.xml
Permission :
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Enregistrez votre récepteur BOOT_COMPLETED :
<receiver android:name="org.yourapp.OnBoot">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Enregistrez votre service :
<service android:name="org.yourapp.YourCoolService" />
Dans le récepteur 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);
}
}
Pour HTC, vous devez peut-être aussi ajouter dans le manifeste ce code si le dispositif n'attrape pas RECEIVE_BOOT_COMPLETED :
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
Les récepteurs ressemblent maintenant à ceci :
<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>
Comment tester BOOT_COMPLETED sans redémarrer l'émulateur ou le dispositif réel ? C'est facile. Essayez ceci :
adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED
Comment obtenir l'identifiant de l'appareil ? Obtenir la liste des appareils connectés avec leurs identifiants :
adb devices
adb dans ADT par défaut que vous pouvez trouver dans :
adt-installation-dir/sdk/platform-tools
Profitez-en ! )