2012-04-16 15 views
6

मैं एक एसडीपी का उपयोग कर एक एसआईपी आवेदन लिख रहा हूँ। मेरे आवेदन में कई गतिविधियां हैं और इसलिए मैं सेवा की ऑनक्रेट और ऑनस्ट्रोय विधियों का उपयोग करके एसडीके को प्रारंभ और बंद कर देता हूं ताकि मैं इसे अपने आवेदन की अवधि (केवल एक व्यक्तिगत गतिविधि) के लिए चला सकूं।मैं इसे पुनरारंभ किए बिना गतिविधियों के बीच एक सेवा कैसे साझा कर सकता हूं?

उदाहरण एप्लिकेशन मैं कॉल से काम कर रहा हूं स्टार्ट सेवा और फिर बस सेवा को रिसाव करता है - मैं यह नहीं करना चाहता लेकिन मुझे यकीन नहीं है कि मेरे पास कोई विकल्प है।

क्या मैं की तरह करने के लिए होगा मेरे गतिविधि आधार वर्ग के OnCreate विधि में Context.BIND_AUTO_CREATE का उपयोग करके सेवा बाँध और OnDestroy में निकल। मेरी सभी गतिविधियां इस से बढ़ती हैं, इसलिए मेरे पास मेरी सभी गतिविधियों में सेवा उपलब्ध होगी।

लेकिन, जब कॉन्फ़िगरेशन में परिवर्तन होता है या मैं गतिविधियों को स्विच करता हूं तो क्या होता है? क्या की संक्षिप्त अवधि गतिविधियों के बीच सेवा आक्रामक रूप से मारे जाती है, या क्या यह गारंटी है कि यह नहीं होगा? यदि यह पूर्व है, तो क्या यह सेवाओं के उपयोग को थोड़ा अपंग नहीं करता है? बिल्कुल मेरे आवेदन के जीवनकाल के लिए कुछ जारी रखने के लिए मुझे किस डिज़ाइन पैटर्न का उपयोग करना चाहिए?

उत्तर

3

मैंने महसूस किया गया है मैं गलत सवाल पूछ रहा हूँ। मुझे लगता है कि जब उपयोगकर्ता इसके साथ खत्म होता है तो एप्लिकेशन नष्ट हो जाएगा, जो शायद यह नहीं होगा, यह सिर्फ पृष्ठभूमि में बैठेगा, और मेरी सेवा भी होगी। मुझे लगता है कि मुझे एक नया स्वरूप चाहिए।

इसके अलावा अगर मैं वास्तव में उस पथ को जारी रखना चाहता था (जो अब मैं नहीं करता), तो मैं अपने आवेदन के लिए सेवा को बांध सकता था, यह तब आवेदन के जीवनकाल के लिए मौजूद होगा (जिसे, जैसा कि मैंने याद किया, करेंगे जब तक उपयोगकर्ता इसे मारता है या एंड्रॉइड इसे पुनः प्राप्त नहीं करता तब तक अनिश्चित रहें)। इस उदाहरण में मुझे अनइंड को विशेष रूप से कॉल करने की आवश्यकता नहीं है, क्योंकि बाध्यकारी एप्लिकेशन के साथ नष्ट हो जाएगा।

2

क्रियाएँ में, startService() और भी सेवा करने के लिए बाँध का उपयोग कर सेवा शुरू । कॉन्फ़िगरेशन परिवर्तन होने पर यह आपकी सेवा को जीवंत रखेगा।

अपनी गतिविधियों के onDestroy() में सेवा से अनबिंड करें। यह सेवा अभी भी चल रही है क्योंकि आपने इसे शुरू नहीं किया है।

अपनी लॉन्चर गतिविधि में एक स्थिर काउंटर वैरिएबल रखें। अपने onCreate() में अन्य गतिविधि लॉन्च के लिए इसे 1 तक बढ़ाएं और इसे onDestroy() में से एक करके घटाएं। इसलिए, यदि 3 गतिविधियां खोली गई हैं और यह मानते हुए कि आप दूसरे 2 को बैकस्टैक में रखते हैं, तो स्थिर काउंटर तीन है। अब onDestroy() प्रत्येक काउंटर को कम करता है और जांचता है कि यह शून्य है, तो सेवा को रोकें।

मेरी FirstActivity (लांचर) में, मैं public static int counter = 0;

तो प्रत्येक गतिविधि में है:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    FirstActivity.counter++; 
} 

@Override 
protected void onDestroy() { 
    super.onDestroy(); 

    if (--FirstActivity.counter == 0) { 
     stopService(new Intent(this, MyService.class)); 
    } 
} 
+0

और मैं आपके द्वारा सुझाए गए तरीके से स्टॉप सेवा को कैसे कॉल करूं? एप्लिकेशन बंद होने का पता लगाने का कोई तरीका नहीं है, अगर मुझे सेवा की आवश्यकता नहीं है, तो मैं इसे एप्लिकेशन में रखूंगा! – pjcard

+0

और मैं कहता हूं "हाँ", रास्ता है। एप्लिकेशन लाइफसाइक्सेस प्राप्त करने के लिए, आपको एक कस्टम एप्लिकेशन क्लास एप्लिकेशन को विस्तारित करने और इसे पंजीकृत करने की आवश्यकता है। मैं जवाब में इसके बारे में उल्लेख करना भूल गया।और हां, आपको किसी सेवा की आवश्यकता नहीं हो सकती है क्योंकि आप इसे ऐप लाइफसाइकिल तक सीमित कर रहे हैं। रेटो मेयर द्वारा यहां जवाब देखें: http://stackoverflow.com/questions/456211/activity-restart-on-rotation-android – Akhil

+0

क्षमा करें अखिल, यह अभी भी सही नहीं है। मेरे पास पहले से ही एक कस्टम एप्लिकेशन क्लास है लेकिन इसमें बाहर निकलने वाले एप्लिकेशन का पता लगाने के लिए कोई तरीका नहीं है। इस सवाल पर मेरा "अतिरिक्त" अनुभाग देखें कि यह क्यों है। – pjcard

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

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