Comment démarrer le service au démarrage de l'appareil (application d'exécution automatique, etc.)
Pour commencer: 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 le service. Ce trou de sécurité a été fermé dans les nouvelles versions d'Android.
Solution:
Créez une application avec une activité. Lorsque l'utilisateur l'exécute une fois que l'application peut recevoir un message de diffusion BOOT_COMPLETE.
Pour le second: BOOT_COMPLETE est envoyé avant le montage du stockage externe. Si l'application est installée sur un stockage externe, elle ne recevra pas de message de diffusion BOOT_COMPLETE.
Dans ce cas, il existe 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 exécute la deuxième application sur un 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
Autorisation:
<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 devrez peut-être également ajouter dans Manifest ce code si l'appareil n'attrape pas RECEIVE_BOOT_COMPLETED:
<action android:name="android.intent.action.QUICKBOOT_POWERON" />
Le récepteur ressemble 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 ni l'appareil réel? C'est facile. Essaye ça:
adb -s device-or-emulator-id shell am broadcast -a android.intent.action.BOOT_COMPLETED
Comment obtenir l'identifiant de l'appareil? Obtenez la liste des appareils connectés avec des identifiants:
adb devices
adb dans ADT par défaut, vous pouvez trouver dans:
adt-installation-dir/sdk/platform-tools
Prendre plaisir! )