2012-05-24 27 views
30

एक बटन मैं विधि startService(new Intent(currentActivity.this,MyService.class)) का उपयोग कर सेवा शुरू करना चाहते हैं पर क्लिक करने पर चल रहा है, लेकिन सेवा चल रही है अगर मैं रन सेवा पहले से ही चल से बचने के लिए इस विधि कॉल करने के लिए नहीं करना चाहते हैं फिर से चलाने की सेवा को रोकने के लिए कैसे। यह कैसे मुमकिन दोनों आशय सेवा और एक ही परियोजना में सेवा का उपयोग कर रहा है और दोनों के लिए एक ही शर्त लागू करना चाहते हैं।यदि पहले से ही एंड्रॉयड

+1

संबंधित http://stackoverflow.com/questions/8019899/starting-a-service-multiple-times –

उत्तर

67

एक सेवा केवल एक बार, तो आप startService(Intent) कई बार फोन कर सकते हैं चलेंगे।

आप सेवा में onStartCommand() प्राप्त होगा। इसलिए इस बात का ध्यान रखें।

स्रोत: ध्यान दें कि घोंसला नहीं है Context.startService() को कई कॉल (हालांकि वे onStartCommand() को अनेक संबंधित कॉल में परिणाम है), तो कोई बात नहीं यह कितनी बार शुरू कर दिया है एक सेवा एक बार रोक दिया जाएगा Context.stopService() या stopSelf() कहा जाता है; हालांकि, सेवाओं को stopSelf(int) विधि का उपयोग यह सुनिश्चित करने के लिए कर सकते हैं कि सेवा शुरू नहीं होने तक सेवा बंद नहीं हो जाती है।

में: http://developer.android.com/reference/android/app/Service.html विषय पर: सेवा जीवनचक्र

+0

आपके त्वरित उत्तर के लिए धन्यवाद। आपकी टिप्पणी मुझे बहुत मदद करेगी लेकिन इन तरीकों को फिर से कॉल नहीं करना चाहती सेवा चल रही है। कोई अन्य विचार ??? –

+9

@AtulBardwaj: 'स्टार्ट सेवा() '* हमेशा * ट्रिगर' ऑनस्टार्ट कॉमांड()' पर कॉल करता है। अवधि। इसलिए, या तो 'startService()' को कॉल न करें, या एक स्मार्ट 'ऑनस्टार्ट कमांड()' है जिसे कई बार बुलाया जा सकता है। – CommonsWare

+0

@CommonsWare अपनी बात :) –

7

आपकी सेवा से आबद्ध; कॉल प्रारंभ करने वाले:

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

मामले में इस कोड को काम केवल अगर मैं गतिविधि के लिए सेवा के लिए बाध्य करता है समझे ??? मुझे लगता है कि एक गतिविधि के लिए सेवा बाध्यकारी चलेगा जब तक एप्लिकेशन चल रहा है.कृपया टिप्पणी –

+1

यह हमेशा काम नहीं होगा। यह खाते में "सेवा रोकना" नहीं लेता है। और यह मुख्य रूप से रनिंग सेवा यूआई दिखाने के लिए है। मैंने इसका इस्तेमाल किया है और यह हमेशा किटकैट में काम नहीं करेगा। इसके बजाय, आप हमेशा स्टार्ट सेवा का उपयोग कर सकते हैं और अपने कार्यों को करने के लिए क्रिएट और ऑनस्टार्ट कमांड पर सेवा का उपयोग कर सकते हैं। यह सही तरीका है। –

+1

** ** बाउंड सेवा ** क्यों आवश्यक है? क्या हम सिर्फ ** प्रारंभिक सेवा ** का उपयोग नहीं कर सकते? –

15

उपयोग startService():

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

तो अगर आपकी सेवा काम कर रहा है की जाँच करने के, की तरह एक विधि का उपयोग करें। प्रारंभ सेवा onStartCommand() फोन करेगा सेवा शुरू नहीं किया गया है, तो अभी तक यह onCreate() कॉल करेंगे। onCreate() में अपने चर शुरू करें और/या थ्रेड शुरू करें।

+0

यह सही उत्तर है। ऑनक्रेट() को अनदेखा किया जाता है। – likejiujitsu

1

जब भी हम किसी भी गतिविधि से कोई सेवा शुरू करते हैं, तो एंड्रॉइड सिस्टम सेवा की ऑनस्टार्ट कमांड() विधि को कॉल करता है और यदि सेवा पहले से नहीं चल रही है, तो सिस्टम पहले क्रिएट() पर कॉल करता है, और फिर यह स्टार्ट कॉमांड() पर कॉल करता है।

तो इसका मतलब यह है कि एंड्रॉइड सेवा अपनी जीवन चक्र में केवल एक बार शुरू होती है और इसे तब तक चलती रहती है जब तक कि कोई अन्य क्लाइंट इसे फिर से शुरू नहीं करना चाहता है, तो केवल स्टार्ट कॉमांड() विधि हर समय लागू होगी।

संबंधित मुद्दे