76 votes

Comment toujours exécuter un service en arrière-plan

Je suis dans le processus de création d'une application qui est similaire à la mise en application SMS.

Ce dont j'ai besoin:
- un service qui est toujours en cours d'exécution en arrière-plan
- toutes les 5 min. le service vérifie l'emplacement actuel de l'appareil et appelle un service web
- si certaines conditions sont remplies, le service doit générer une notification (tout comme l'application SMS)
- lorsque la notification est cliqué, l'utilisateur est redirigé vers l'application (tout comme l'application SMS)
- lorsque l'application est installé le service doit être démarré
- lorsque l'appareil est redémarré, le service doit être démarré

Ce que j'ai essayé:
- l'exécution d'un service régulier qui a très bien fonctionné jusqu'à ce que android tue le service
- à l'aide de la AlarmManager le faire les 5 min. intervalle appel à un service. Mais je n'étais pas capable de faire ce travail.

Toute aide serait grandement apprécié...

-Thomas

35voto

CommonsWare Points 402670

un service qui est toujours en cours d'exécution dans l'arrière-plan

Ce n'est pas possible dans le vrais sens du terme, comme vous l'avez découvert. C'est aussi une mauvaise conception.

toutes les 5 min. le service vérifie l' emplacement actuel de l'appareil et appelle un service web

Utiliser AlarmManager.

à l'aide de la AlarmManager le faire le 5 min. intervalle appel à un service. Mais Je n'a pas été en mesure de faire ce travail.

Voici un exemple de projet en expliquant comment les utiliser, ainsi que l'utilisation d' WakefulIntentService de sorte que vous rester éveillé tout en essayant de faire tout le Web service de chose.

Si vous avez régulièrement des problèmes avec elle, d'ouvrir une nouvelle question à propos de choses spécifiques que vous rencontrez avec AlarmManager qui vous donne du chagrin.

26voto

Jim Blackler Points 14306

L'une de mes applications ne quelque chose de très similaire. Pour réactiver le service après une période donnée, je recommande postDelayed()

Disposer d'un gestionnaire de champ:

private final Handler handler = new Handler();

et un cours de recyclage Praticable

private final Runnable refresher = new Runnable() {
  public void run() {
    // some action
  }
};

Vous pouvez mettre le feu à vos Notifications dans l'exécutable.

Sur le service de la construction, et après chaque exécution démarrer comme ceci:

handler.postDelayed(refresher, /* some delay in ms*/);

Dans onDestroy() supprimer le post

handler.removeCallbacks(refresher);

Pour démarrer le service au démarrage vous avez besoin d'une auto starter. Cela va dans votre manifeste

<receiver android:name="com.example.ServiceAutoStarter">
        <intent-filter>
            <action android:name="android.intent.action.BOOT_COMPLETED" />
        </intent-filter>
  </receiver>

et le ServiceAutoStarter ressemble à ceci:

public class ServiceAutoStarter extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
    context.startService(new Intent(context, UpdateService.class));
  }
}

L'arrêt du système d'exploitation à partir de tuer le service est délicat. Aussi votre application peut avoir une RuntimeException et de crash, ou votre logique peut caler.

Dans mon cas, il semblait aider à toujours actualiser le service sur l'écran avec un BroadcastReceiver. Donc, si la chaîne de mises à jour devient bloqué, il sera ressuscité en tant que l'utilisateur utilise son téléphone.

Dans le service:

private BroadcastReceiver screenOnReceiver; 

Dans votre service onCreate()

screenOnReceiver = new BroadcastReceiver() {

  @Override
  public void onReceive(Context context, Intent intent) {
    // Some action
  }
};

registerReceiver(screenOnReceiver, new IntentFilter(Intent.ACTION_SCREEN_ON));

Alors annuler l'inscription de votre service sur onDestroy() avec

unregisterReceiver(screenOnReceiver);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X