Android'de hizmeti başlatın


115

Belirli bir etkinlik başladığında bir servisi aramak istiyorum. İşte Hizmet sınıfı:

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

Ve işte ben ona böyle diyorum:

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

Sorun, hiçbir şeyin olmamasıdır. Yukarıdaki kod bloğu, aktivitenin sonunda çağrılır onCreate. Zaten hata ayıkladım ve hiçbir istisna atılmadı.

Herhangi bir fikir?


1
Zamanlayıcılarla Dikkat - AFAIK, kaynakları boşaltmak için hizmetiniz kapatıldığında, hizmet yeniden başlatıldığında bu zamanlayıcı yeniden başlatılmayacaktır. Haklısınız START_STICKY, hizmeti yeniden başlatacaksınız, ancak o zaman yalnızca onCreate çağrılır ve zamanlayıcı değişkeni yeniden başlatılmaz. Bunu START_REDELIVER_INTENTdüzeltmek için Alarm hizmeti veya API 21 İş Zamanlayıcı ile oynayabilirsiniz .
Georg

Unutmanız durumunda <service android:name="your.package.name.here.ServiceClass" />, uygulama etiketini kullanarak android bildiriminde hizmeti kaydettirdiğinizden emin olun .
Japheth Ongeri - inkalimeva

Yanıtlar:


278

Muhtemelen bildiriminizde hizmet yok veya <intent-filter>eyleminizle eşleşen bir hizmet yok . LogCat'i incelemek (üzerinden adb logcat, DDMS veya Eclipse'deki DDMS perspektifi) yardımcı olabilecek bazı uyarıları ortaya çıkarmalıdır.

Daha büyük olasılıkla, hizmeti şu yolla başlatmalısınız:

startService(new Intent(this, UpdaterServiceManager.class));

1
Nasıl hata ayıklayabilirsiniz? hizmetimi hiç

Her yere bir miktar Log.e etiketi ekleyin: Hizmeti başlatmadan önce, hizmet amacının sonucu, hizmet sınıfının içinde seyahat edeceği yer (onCreate, onDestroy, herhangi ve tüm yöntemler).
Zoe

android sdk 26+ üzerindeki uygulamalarım için çalışıyor, ancak android sdk 25 veya daha düşük sürümde değil. herhangi bir çözüm var mı?
Mahidul Islam

@MahidulIslam: Probleminizi ve semptomlarınızı daha ayrıntılı olarak açıklayan minimal tekrarlanabilir bir örnek sağlayabileceğiniz ayrı bir Stack Overflow sorusu sormanızı tavsiye ederim .
CommonsWare

@CommonsWare Zaten bir soru sordum ve bu: - stackoverflow.com/questions/49232627/…
Mahidul Islam

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

Sadece bu satırı yazmak benim için yeterli değildi. Servis hala işe yaramadı. Her şey yalnızca manifestte hizmet kaydolduktan sonra çalıştı

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

    ...

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

1
Android coderzpassion.com/implement-service-android'deki hizmetlerle ilgili her şeyi öğrenmenin en iyi örneği ve geç kaldığım için özür dilerim
Jagjit Singh

55

Başlatma hizmeti için Java kodu :

Faaliyetten hizmeti başlat :

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

Fragment'ten hizmeti başlat :

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

}

Bu Hizmeti Projenin Manifest Dosyasına Tanımlayın:

Manifest dosyasına aşağıdaki etiketi ekleyin :

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

Bitti


7
Aktiviteleri ve hizmetleri aynı pakette bıraktığımda performansı ne kadar artırır? Bunu daha önce hiç duymadım.
OneWorld

Belki de koşu hızı ile ilgili değil, çok belirsiz ve gevşek bir anlamda performansı kastediyorlardı?
Anubian Noob

3

Daha dinamik yapmayı seviyorum

Class<?> serviceMonitor = MyService.class; 


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

Manifestoyu unutma

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

1
Intent serviceIntent = new Intent(this,YourActivity.class);

startService(serviceIntent);

manifiste hizmet ekle

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

Oreo ve daha büyük cihazlarda hizmet çalıştırmak için yer hizmeti için kullanın ve kullanıcıya bildirim gösterin

veya arka planda http://stackoverflow.com/questions/tagged/google-play-services referansında konum güncellemesi için coğrafi sınırlama hizmetini kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.