wake-up-neo.com

Starten Sie den Dienst in Android

Ich möchte einen Dienst anrufen, wenn eine bestimmte Aktivität beginnt. Also, hier ist die Service-Klasse:

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();
    }
}

Und so nenne ich es:

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

Das Problem ist, dass nichts passiert. Der obige Codeblock wird am Ende der Aktivität onCreate aufgerufen. Ich habe bereits debuggt und es wird keine Ausnahme geworfen.

Irgendeine Idee?

108
Miguel Ribeiro

Wahrscheinlich haben Sie den Dienst nicht in Ihrem Manifest, oder es hat kein <intent-filter> das passt zu deiner Aktion. LogCat untersuchen (über adb logcat, DDMS oder die DDMS-Perspektive in Eclipse) sollten einige Warnungen anzeigen, die möglicherweise hilfreich sind.

Wahrscheinlicher ist, dass Sie den Dienst über Folgendes starten sollten:

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

Nur diese Zeile zu schreiben, hat mir nicht gereicht. Der Service hat immer noch nicht funktioniert. Alles hatte erst nach der Registrierung des Dienstes bei Manifest funktioniert

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

    ...

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

Java-Code für startservice:

Dienst starten von Aktivität:

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

Dienst starten von 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");
    }

}

Definieren Sie diesen Service in der Manifestdatei des Projekts:

Füge den folgenden Tag in die Manifest Datei ein:

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

Fertig

52
Hiren Patel

Ich mag es dynamischer zu machen

Class<?> serviceMonitor = MyService.class; 


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

vergiss das Manifest nicht

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