2012-05-24 19 views
30

Tek bir düğmeye tıklamakla, startService(new Intent(currentActivity.this,MyService.class)) yöntemini kullanarak hizmeti başlatmak istiyorum ancak hizmet çalışıyorsa Çalışmakta olan çalıştırma hizmetinden kaçınmak için bu yöntemi çağırmak istemiyorum. Bu nasıl mümkündür. Aynı projede hem Niyet hizmeti ve Service kullanıyorum ve her ikisi için de aynı koşulu uygulamak istiyorum.Zaten çalışıyorsa hizmetin yeniden çalıştırılmasını nasıl engeller

+1

http://stackoverflow.com/questions/8019899/starting-a-service-multiple-times –

cevap

67

Bir hizmet yalnızca bir kez çalışır, böylece startService(Intent)'u birden çok kez arayabilirsiniz.

Serviste bir onStartCommand() alırsınız. Öyleyse aklında tut.

Kaynak: Context.startService() için birden çağrılar böylece olursa olsun bir hizmet Context.stopService() kez durdurulacak ya stopSelf() denir başlatıldığında kaç kez, (onlar onStartCommand() için birden fazla karşılık gelen çağrılara neden gerçi) yuva yapma Not; Ancak, hizmetlerin, başlatılan niyetler işlenene kadar hizmetin durdurulmadığından emin olmak için stopSelf(int) yöntemini kullanabilirler. konu üzerine http://developer.android.com/reference/android/app/Service.html: At

Servis Ömrü hizmetinizde Bind

+0

Hızlı cevabınız için teşekkürler. Yorumunuz bana çok yardımcı olacaktır, ancak bu yöntemleri tekrar aramak istemiyorsanız hizmet çalışıyor. başka bir fikir ??? –

+9

@AtulBhardwaj: "startService()' * her zaman tetikle "onStartComand()' işlevini çağırır. Dönemi. Yani, ya startService() 'yi çağırmayın ya da birden çok kez çağrılmayı başarabilen daha akıllı bir" onStartCommand() "seçeneğine sahip olun. – CommonsWare

+0

@CommonsWare Noktanız var :) –

7

; görüşmesi başlatırken:

public static boolean isServiceRunning(String serviceClassName){ 
      final ActivityManager activityManager = (ActivityManager)Application.getContext().getSystemService(Context.ACTIVITY_SERVICE);  
      final List<RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);  
      for (RunningServiceInfo runningServiceInfo : services) {   
      if (runningServiceInfo.service.getClassName().equals(serviceClassName)){    
       return true;   
      }  
      }  
     return false; 
     } 
+0

Bu kod, yalnızca etkinliğe hizmet bağladığımda işe yarar mı? Uygulamanın çalışmasına kadar bir etkinliğe hizmetin bağlanacağını düşünüyorum.Lütfen yorum –

+1

Bu her zaman işe yaramaz. "Hizmet durduruluyor" dikkate alınmaz. Ve esas olarak Çalışan Hizmetler UI'sini göstermek içindir. Bunu kullandım ve KitKat'ta her zaman işe yaramaz. Aksine, startService DAİMA kullanabilirsiniz ve görevlerinizi yapmak için onCreate ve onStartCommand hizmetini kullanabilirsiniz. Doğru yol bu. –

+1

** Bağlantılı Servis ** neden gerekli? Bir ** Başlangıç ​​Hizmeti ** kullanamaz mıyız? –

15

Kullanım startService(): Hizmet çalışıyorsa

Intent bindIntent = new Intent(this,ServiceTask.class); 
    startService(bindIntent); 
    bindService(bindIntent,mConnection,0); 

Sonra kontrol etmek gibi bir yöntem kullanırlar. Başlatma Hizmeti, onStartCommand() numaralı telefonu arayacaktır. Hizmet başlatılmadıysa, onCreate() numaralı telefonu arayacaktır. Değişkenlerinizi sıfırlayın ve/veya onCreate()'da bir Konu başlatın.

+0

Bu doğru cevaptır. onCreate() göz ardı edilir. – likejiujitsu

1

Herhangi bir etkinlikten herhangi bir hizmet başlattığımızda, Android sistemi, hizmetin onStartCommand() yöntemini çağırır Ve hizmet zaten çalışmıyorsa, sistem önce onCreate() öğesini çağırır ve sonra onStartCommand() öğesini çağırır.

Yani demek istediğim, android hizmetinin başlangıcında yalnızca bir kez başlatılması ve başka bir istemci yeniden başlatmak istediği zamana kadar devam etmesini sağlamaktır. Bu nedenle, yalnızca onStartCommand() yöntemi her zaman çağrılır.

İlgili konular