2012-04-19 17 views
25

मैंने एंड्रॉइड सेवा के आसपास बहुत कुछ पढ़ा है। मैं समझता हूँ के रूप में, जीवन चक्र है:क्यों कोई सेवा.ऑनटॉप विधि नहीं?

void onCreate() 
    void onStart(Intent intent) 
    ... 
void onDestroy() 

http://www.linuxtopia.org/online_books/android/devguide/guide/topics/fundamentals.html

लेकिन कोई onStop तरीका है। सवाल:

  • क्यों वहाँ एक को रोकने तरीका नहीं है?
  • क्या होता है जब मेरी सेवा पर स्टॉप सेवा अनुरोध किया जाता है? (बाहर से, शायद एंड्रॉइड द्वारा ही)। क्या मैं इस घटना का पता लगा सकता हूं?
  • मैं प्रसंस्करण (या कम से कम सत्यापित) करना चाहता हूं कि मेरी सेवा एक प्रक्रिया के भीतर एक सिंगलटन है। मैं यह कैसे कर सकता हूं (या एंड्रॉइड दृश्यों के पीछे इसे लागू करता है)?

संदर्भ के लिए, मेरे पास कुछ संसाधन हैं जो सेवा चल रहा है ("शुरूआत" में) आवंटित और रिलीज़ करना चाहते हैं, और संसाधनों का एक और समूह मैं सेवा आवंटित करना और रिलीज़ करना चाहता हूं एक "बनाया" राज्य है।

उत्तर

49

मैं समझता हूँ के रूप में, जीवन चक्र है:

onStart() कुछ वर्षों के लिए मान्य नहीं है। onStartCommand() वर्तमान जीवन चक्र विधि है।

स्टॉप विधि क्यों नहीं है?

क्योंकि किसी की आवश्यकता नहीं है।

क्या होता है जब मेरी सेवा पर स्टॉप सेवा अनुरोध किया जाता है?

आपको onDestroy() के साथ बुलाया जाएगा।

क्या मैं इस घटना का पता लगा सकता हूं?

आप onDestroy() ओवरराइड कर सकते हैं।

मैं लागू करना चाहता हूं (या कम से कम सत्यापित) कि मेरी सेवा एक प्रक्रिया के भीतर एक सिंगलटन है। मैं यह कैसे कर सकता हूं (या एंड्रॉइड दृश्यों के पीछे इसे लागू करता है)?

सेवाएं प्राकृतिक सिंगलेट हैं। किसी भी समय आपकी सेवा का 0 या 1 उदाहरण होगा।

संदर्भ के लिए, मेरे पास कुछ संसाधन हैं जो सेवा चल रहा है ("शुरूआत" में) आवंटित और रिलीज करना चाहते हैं, और संसाधनों का एक और समूह मैं सेवा आवंटित करना और रिलीज़ करना चाहता हूं एक "बनाया" राज्य है।

राज्य "निर्मित" आदेश पैटर्न (startService() और onStartCommand()) और बाध्यकारी पैटर्न (bindService() और onBind()) के साथ दोनों का उपयोग किया जाता है। इसलिए, यदि आप startService() पर कॉल करते हैं, तो आपकी सेवा पूरी तरह से "बनाए गए" राज्य में मिलियनकॉन्ड से कम उम्मीद के लिए होगी।

+4

ध्यान रखें कि यदि आप BIND_AUTO_CREATE के साथ बाइंड सेवा को कॉल करते हैं, तो ऑनस्ट्रो() को तब तक नहीं बुलाया जाएगा जब तक कि आप – aaronvargas

+0

को अनबिंड नहीं करते हैं, मैंने देखा कि डिवाइस पर बंद होने पर ऑनडस्ट्राय() 'को कॉल नहीं किया जाता है। क्या कोई अन्य कॉलबैक है जिसे उस मामले में ओवरराइड किया जा सकता है? – fiddler

+1

@ फिडलर: इस बात की कोई गारंटी नहीं है कि कुछ मामलों में 'फोर्स स्टॉप, आपका ऐप क्रैश, सिस्टम रैम की आपातकालीन आवश्यकता), केवल बिजली पर नहीं, बल्कि ऑनड्रॉयय() 'कहा जाएगा। एंड्रॉइड सिर्फ आपकी प्रक्रिया को समाप्त करने के लिए कोई कॉलबैक नहीं है। * विशेष रूप से * शक्ति के संबंध में, आप ['ACTION_SHUTDOWN'] (https://developer.android.com/reference/android/content/Intent.html#ACTION_SHUTDOWN) के लिए' BroadcastReceiver' को पंजीकृत करने का प्रयास कर सकते हैं, लेकिन मैं चाहता हूं महत्वपूर्ण कुछ भी करने के लिए समय पर भरोसा नहीं है। – CommonsWare

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