52 votes

Comment lancer une application Android en mode service uniquement

Je suis en train de créer une application dont le seul composant est une service qui continue à fonctionner en arrière-plan (en fait un serveur proxy) mais je ne trouve pas le moyen de démarrer ce service. L'application ne peut pas avoir d'interface utilisateur ou d'interaction avec l'utilisateur, donc je n'utilise pas Activity.
Broadcast receiver Je peux écouter la diffusion du BOOT mais comment démarrer le service la première fois qu'il est installé et comment le maintenir en fonctionnement ? Ou existe-t-il une diffusion que je peux écouter après l'installation de l'application, par exemple TIME_TICK, mais elle doit être enregistrée à partir de l'activité, je pense.

1 votes

Je n'ai pas essayé moi-même mais serait-il possible de démarrer un service à partir de l'objet Application ?

0 votes

44voto

snctln Points 8687

Malheureusement, il n'existe actuellement aucun moyen fiable de recevoir un événement de diffusion après l'installation de votre application. ACTION_PACKAGE_ADDED L'intention n'est pas diffusée au paquet nouvellement installé.

Vous devrez disposer d'une classe de récepteur de radiodiffusion ainsi que de votre service afin de recevoir la ACTION_BOOT_COMPLETED événement. Je recommande également d'ajouter l'élément ACTION_UTILISATEUR_PRÉSENT pour être attrapé par ce récepteur de diffusion, ce qui nécessite Android 1.5 (minSDK=3), cela appellera votre récepteur de diffusion chaque fois que l'utilisateur déverrouille son téléphone. La dernière chose que vous pouvez faire pour essayer de maintenir votre service en fonctionnement sans qu'il puisse facilement être arrêté automatiquement est d'appeler Service.setForeground() dans votre service onCreate pour indiquer à Android que votre service ne doit pas être arrêté, ceci a été ajouté principalement pour les services de type lecteur mp3 qui doivent continuer à fonctionner mais peut être utilisé par n'importe quel service.

Assurez-vous que vous ajoutez les permissions appropriées pour les événements boot_complete et user_present dans votre manifeste.

Voici une classe simple que vous pouvez utiliser comme récepteur de diffusion pour les événements.

package com.snctln.util.WeatherStatus;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class WeatherStatusServiceReceiver extends BroadcastReceiver
{
    @Override
    public void onReceive(Context context, Intent intent)
    {
        if(intent.getAction() != null)
        {
            if(intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED) ||
                intent.getAction().equals(Intent.ACTION_USER_PRESENT))
            {
                context.startService(new Intent(context, WeatherStatusService.class));
            }
        }
    }
};

Bonne chance.

7 votes

De bons conseils. Une chose à propos de Service.setForeground() : il ne fonctionne plus dans Android 2.0+. Tous les services "à longue durée de vie" sont désormais tenus d'avoir une notification persistante dans la zone de notification pendant leur exécution. Exemple ici : developer.Android.com/resources/samples/ApiDemos/src/com/

2 votes

ACTION_USER_PRESENT est une astuce géniale. Cela fait des années que je me bats pour maintenir mon service en vie, et cela vient de résoudre le problème.

5 votes

J'ai découvert qu'à partir de la version 3.0, il faut lancer l'application au moins une fois pour pouvoir obtenir l'intention de l'application - c'est bizarre, mais ça marche pour moi. Cela signifie que l'on doit créer une petite activité (c'est-à-dire avec des éléments d'introduction) qui est lancée après l'installation. Après cela, vous recevrez les intentions correctement.

15voto

shaobin0604 Points 525

Retourner à START_STICKY en Service.onStartCommand

Android va redémarrer votre service

2 votes

START_STICKY est valable uniquement pour Android 2.0+.

0 votes

Mais le service doit fonctionner au moins une fois pour obtenir la continuité, n'est-ce pas ?

1voto

jboi Points 2810

Je suis en train de faire des recherches sur la même question. Voici ce que j'ai trouvé : http://kfb-Android.blogspot.de/2009/04/registering-for-timetick-after-reboot.html

Cette simple petite démo montre une solution en jouant un peu de ping-pong entre une BroadcatReceiver y un Service . Le récepteur est enregistré pour démarrer au moment du démarrage en s'enregistrant dans le Manifeste pour recevoir ACTION_BOOT_COMPLETED . Il démarre juste un service lorsqu'il reçoit ACTION_BOOT_COMPLETED . Le site Service enregistre à son tour le BroadcastReceiver alors pour le ACTION_TIME_TICK .

La logique de l'application sera mise en œuvre dans le BroadcastReceiver .

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