web-dev-qa-db-fra.com

Démarrer le service dans Android

Je souhaite appeler un service lorsqu'une activité commence. Alors, voici la classe de 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 de l'activité. J'ai déjà débogué et aucune exception n'est levée.

Une idée?

108
Miguel Ribeiro

Vous n'avez probablement pas le service dans votre manifeste, ou il n'a pas de <intent-filter> correspondant à votre action. L'examen de LogCat (via adb logcat, DDMS ou la perspective DDMS dans Eclipse) devrait faire apparaître certains avertissements utiles.

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

startService(new Intent(this, UpdaterServiceManager.class));
265
CommonsWare
startService(new Intent(this, MyService.class));

Juste écrire cette ligne ne me suffisait pas. Le service n'a toujours pas fonctionné. Tout avait fonctionné seulement après avoir enregistré le service au manifeste

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

    ...

    <service
        Android:name=".MyService"
        Android:label="My Service" >
    </service>
</application>
78
Vitalii Korsakov

Code Java pour démarrerservice:

Démarrer le service à partir de Activité:

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

Démarrer 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:

Ajouter la balise ci-dessous dans le fichier manifeste:

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

Fait

52
Hiren Patel

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'oublie pas le manifeste

<service Android:enabled="true" Android:name=".MyService.class" />
2
Joolah