Démarrer le service sous Android

115

Je souhaite appeler un service lorsqu'une certaine activité commence. Alors, voici la classe Service:

public class UpdaterServiceManager extends Service {

    private final int UPDATE_INTERVAL = 60 * 1000;
    private Timer timer = new Timer();
    private static final int NOTIFICATION_EX = 1;
    private NotificationManager notificationManager;

    public UpdaterServiceManager() {}

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void onCreate() {
        // Code to execute when the service is first created
    }

    @Override
    public void onDestroy() {
        if (timer != null) {
            timer.cancel();
        }
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startid) {
        notificationManager = (NotificationManager) 
                getSystemService(Context.NOTIFICATION_SERVICE);
        int icon = android.R.drawable.stat_notify_sync;
        CharSequence tickerText = "Hello";
        long when = System.currentTimeMillis();
        Notification notification = new Notification(icon, tickerText, when);
        Context context = getApplicationContext();
        CharSequence contentTitle = "My notification";
        CharSequence contentText = "Hello World!";
        Intent notificationIntent = new Intent(this, Main.class);
        PendingIntent contentIntent = PendingIntent.getActivity(this, 0,
                notificationIntent, 0);
        notification.setLatestEventInfo(context, contentTitle, contentText,
                contentIntent);
        notificationManager.notify(NOTIFICATION_EX, notification);
        Toast.makeText(this, "Started!", Toast.LENGTH_LONG);
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                // Check if there are updates here and notify if true
            }
        }, 0, UPDATE_INTERVAL);
        return START_STICKY;
    }

    private void stopService() {
        if (timer != null) timer.cancel();
    }
}

Et voici comment je l'appelle:

Intent serviceIntent = new Intent();
serviceIntent.setAction("cidadaos.cidade.data.UpdaterServiceManager");
startService(serviceIntent);

Le problème est que rien ne se passe. Le bloc de code ci-dessus est appelé à la fin de l'activité onCreate. J'ai déjà débogué et aucune exception n'est levée.

Une idée?

Miguel Ribeiro
la source
1
Attention avec les minuteries - AFAIK lorsque votre service est arrêté pour libérer des ressources, ce minuteur ne sera pas redémarré lorsque le service est redémarré. Vous avez raison de START_STICKYredémarrer le service, mais alors seul onCreate est appelé et le minuteur var ne sera pas réinitialisé. Vous pouvez jouer avec START_REDELIVER_INTENT, le service d'alarme ou l'API 21 Job Scheduler pour résoudre ce problème.
Georg
Au cas où vous auriez oublié, assurez-vous d'avoir enregistré le service dans le manifeste Android à l'aide <service android:name="your.package.name.here.ServiceClass" />de la balise d'application.
Japheth Ongeri - inkalimeva

Réponses:

278

Vous n'avez probablement pas le service dans votre manifeste, ou il n'en a pas <intent-filter>qui correspond à votre action. L'examen de LogCat (via adb logcat, DDMS ou la perspective DDMS dans Eclipse) devrait afficher des avertissements qui peuvent aider.

Plus probablement, vous devriez démarrer le service via:

startService(new Intent(this, UpdaterServiceManager.class));
CommonsWare
la source
1
Comment pouvez-vous déboguer? jamais appelé mon service, mon debugg ne montre rien
Ajoutez un shitton de balises Log.e partout: avant de lancer le service, le résultat de l'intention de service, à l'intérieur de la classe de service où il voyagerait (onCreate, onDestroy, toutes les méthodes).
Zoe
cela fonctionne pour mes applications sur android sdk 26+ mais ne dose pas sur android sdk 25 ou inférieur. il y a une solution?
Mahidul Islam
@MahidulIslam: Je vous recommande de poser une question distincte de Stack Overflow, dans laquelle vous pouvez fournir un exemple minimal reproductible expliquant votre problème et vos symptômes plus en détail.
CommonsWare
@CommonsWare j'ai déjà posé une question et c'est: - stackoverflow.com/questions/49232627/…
Mahidul Islam
81
startService(new Intent(this, MyService.class));

Le simple fait d'écrire cette ligne ne me suffisait pas. Le service ne fonctionnait toujours pas. Tout n'avait fonctionné qu'après l'enregistrement du service au manifeste

<application
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name" >

    ...

    <service
        android:name=".MyService"
        android:label="My Service" >
    </service>
</application>
Vitalii Korsakov
la source
1
Meilleur exemple pour tout savoir sur les services dans Android coderzpassion.com/implement-service-android et désolé d'être en retard
Jagjit Singh
55

Code Java pour le service de démarrage :

Démarrer le service à partir de l' activité :

startService(new Intent(MyActivity.this, MyService.class));

Démarrez le service à partir de Fragment :

getActivity().startService(new Intent(getActivity(), MyService.class));

MyService.java :

import android.app.Service;
import android.content.Intent;
import android.os.Handler;
import android.os.IBinder;
import android.util.Log;

public class MyService extends Service {

    private static String TAG = "MyService";
    private Handler handler;
    private Runnable runnable;
    private final int runTime = 5000;

    @Override
    public void onCreate() {
        super.onCreate();
        Log.i(TAG, "onCreate");

        handler = new Handler();
        runnable = new Runnable() {
            @Override
            public void run() {

                handler.postDelayed(runnable, runTime);
            }
        };
        handler.post(runnable);
    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onDestroy() {
        if (handler != null) {
            handler.removeCallbacks(runnable);
        }
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return START_STICKY;
    }

    @SuppressWarnings("deprecation")
    @Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);
        Log.i(TAG, "onStart");
    }

}

Définissez ce service dans le fichier manifeste du projet:

Ajoutez la balise ci-dessous dans le fichier manifeste :

<service android:enabled="true" android:name="com.my.packagename.MyService" />

Terminé

Hiren Patel
la source
7
Dans quelle mesure cela améliore-t-il les performances lorsque je laisse des activités et des services dans le même package? Jamais entendu ça avant.
OneWorld
Peut-être parlaient-ils de performances dans un sens très vague, pas de vitesse de course?
Anubian Noob
3

J'aime le rendre plus dynamique

Class<?> serviceMonitor = MyService.class; 


private void startMyService() { context.startService(new Intent(context, serviceMonitor)); }
private void stopMyService()  { context.stopService(new Intent(context, serviceMonitor));  }

n'oubliez pas le Manifeste

<service android:enabled="true" android:name=".MyService.class" />
Thiago
la source
1
Intent serviceIntent = new Intent(this,YourActivity.class);

startService(serviceIntent);

ajouter un service dans le manifist

<service android:enabled="true" android:name="YourActivity.class" />

pour exécuter le service sur oreo et les appareils supérieurs, utiliser pour le service au sol et afficher une notification à l'utilisateur

ou utilisez le service de géorepérage pour la mise à jour de l'emplacement dans la référence en arrière-plan http://stackoverflow.com/questions/tagged/google-play-services

Asif Mehmood
la source