2011-08-31 14 views
14

मेरे पास एक पृष्ठभूमि सेवा है जो कभी-कभी ओएस द्वारा मार दी जाती है जब यह स्मृति पर कम चलती है।सेवा को पुनरारंभ करने के लिए कैसे मजबूर करें?

  1. इस व्यवहार को अनुकरण कैसे करें ताकि मैं इसे डीबग कर सकूं?

देव गाइड बस कहते हैं, "आपकी सेवा शुरू कर दिया है, तो आप डिजाइन चाहिए यह शान से प्रणाली द्वारा पुन: प्रारंभ हो संभालने के लिए। प्रणाली आपकी सेवा को मारता है, यह यह रूप में जल्द ही पुन: प्रारंभ होता के रूप में संसाधनों फिर से उपलब्ध हो जाते हैं।"

  1. कॉल को फिर से शुरू करने पर कॉल होने पर कॉल का अनुक्रम क्या होता है?

एक तरफ (संबंधित) सवाल है, क्या एक सक्रिय रूप से service.onDestroy बिना, AsyncTask सेवा में तब शुरू हुई जब सेवा ओएस, अर्थात ने मार डाला हो जाता है चल रहा है कहा जाता हो रही है क्या होता है? क्या यह चल रहा है या सेवा के साथ चुपचाप फट गया है?

उत्तर

6

नए संस्करण के तहत, एक सेवा निम्न इवेंट होगा शुरू हो रहा:

onCreate() 

इसके बाद ...

int onStartCommand(Intent intent, int flags, int startid) 

मैं टिप्पणी में पता है ऊपर आप उस का उपयोग कर का उल्लेख है, लेकिन यह लायक है दोहराना: पुराने "ऑनस्टार्ट()" ईवेंट का उपयोग न करें। ऑनस्टार्ट कमांड चीजों को करने का नया तरीका है।

ऑनक्रेट() का उपयोग किसी ऑब्जेक्ट्स आदि बनाने के लिए किया जा सकता है, लेकिन ऑनस्टार्ट कमांड() में वास्तव में आपकी सेवा का कोड करें।

ऑनस्टार्ट कमांड() के साथ किए जाने पर आपको परिणाम वापस करना चाहिए। "START_STICKY" का उपयोग ओएस को बताता है कि अगर इसे मारना है तो इसे पुनरारंभ कर सकते हैं। "START_NOT_STICKY" का उपयोग करने से ओएस को दोबारा उपलब्ध होने के बाद इसे पुनरारंभ करने की कोशिश करने से परेशान नहीं किया जाता है। इसका मतलब है कि आपके एप्लिकेशन को फिर से सेवा शुरू करने की आवश्यकता होगी। अन्य विकल्प भी हैं - एपीआई दस्तावेज़ों की जांच करें।

उन झंडे की जांच करने से आपको यह देखने की अनुमति मिल जाएगी कि आपकी सेवा ने क्यों शुरू किया है - यदि आपका स्वयं का ऐप लॉन्च हुआ है या ओएस ने इसे पुनरारंभ करने के लिए लॉन्च किया है। आपको समय-समय पर किसी भी महत्वपूर्ण चर की स्थिति को संग्रहीत करने की आवश्यकता होगी ताकि यदि ओएस ने इसे फिर से शुरू कर दिया है तो आप उन्हें पुनर्प्राप्त कर सकते हैं - आप शायद उन लोगों को स्टोर करने के लिए साझा किए गए निजी संग्रह का उपयोग कर सकते हैं। निश्चित रूप से ऑनस्ट्रोय घटना में किसी को स्टोर करें, लेकिन उस पर भरोसा न करें।

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

ध्यान रखें कि यदि आपकी सेवा ओएस द्वारा मारे गए हैं तो आपके पास किसी भी चर को स्टोर करने का मौका नहीं हो सकता है। आपको यह देखने में सक्षम होना चाहिए कि क्या आपका राज्य है जहां आप ओएस द्वारा पुनरारंभ करते समय अपेक्षा करते हैं और यदि बस सबकुछ रीसेट न करें या शायद ही मर जाए।

जहां तक ​​डिबगिंग है, क्या आपने एक और ऐप लिखने पर विचार किया है जो कम स्मृति की स्थिति को मजबूर करने के लिए किसी गतिविधि में स्मृति को चूसने के अलावा कुछ भी नहीं करता है? शीर्ष गतिविधि को स्मृति को प्राथमिकता मिलनी चाहिए और सेवा को मरने के लिए मजबूर होना चाहिए।

सेवा में लॉन्च किए गए अतिरिक्त थ्रेड अभी भी एक ही आवेदन प्रक्रिया, का हिस्सा हैं, इसलिए उन्हें सेवा (और शेष एप्लिकेशन) के साथ मार दिया जाएगा। आप नियमित लॉग विवरण जोड़कर इसे सत्यापित कर सकते हैं धागे और फिर सेवा की हत्या।

कुछ और जो आपके लिए उपयोगी हो सकता है यह देखने के लिए जांच कर रहा है कि आपकी सेवा पहले से ही आपके आवेदन के अंदर से चल रही है या नहीं। ऐसा करने के लिए यहां एक फ़ंक्शन है:

// Determine if one of my services is currently running 
public static boolean isMyServiceRunning(Context context, String servicename) { 
    ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); 
    for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
     if (servicename.equals(service.service.getClassName())) { 
      return true; 
     } 
    } 
    return false; 
} 
+0

डीडीएमएस में समाप्त (जैसा कि yjw उल्लेख किया गया है) मुझे पुनरारंभ व्यवहार देगा। और पूरी तरह से स्पष्टीकरण के लिए धन्यवाद। –

+0

डीडीएमएस पर अच्छी युक्ति और स्पष्टीकरण पर कोई समस्या नहीं है। ऐसा हुआ कि मैं बस एक ही समस्या के माध्यम से बारकोड स्कैनिंग ऐप लिख रहा था जिसने सेवा के रूप में सभी काम किए ताकि स्क्रीन पर चालू होने की आवश्यकता न हो। –

3

यदि यह एक दूरस्थ सेवा के विपरीत स्थानीय सेवा (डिफ़ॉल्ट) है, तो यह आपके ऐप के समान प्रक्रिया में चल रहा है। इसका मतलब है कि आप अपने ऐप की प्रक्रिया को मार कर इसे मारने का अनुकरण कर सकते हैं। आप डीडीएमएस का उपयोग कर उदाहरण के लिए ग्रहण या कमांड लाइन से, या यहां तक ​​कि अपने फोन (सेटिंग्स -> एप्लिकेशन) से भी ऐसा कर सकते हैं।

+1

मैं हत्या कर सकता हूं लेकिन इसके साथ कोई पुनरारंभ नहीं होता है। –

+0

जांचें कि आप अपनी सेवा के ऑनस्टार्ट कॉमांड से कितना मूल्य लौटते हैं। मुझे लगता है कि यह वही है जो आप चाहते हैं: http://developer.android.com/reference/android/app/Service.html#START_STICKY – Erdal

+0

हां यही मैं उपयोग कर रहा हूं। मेरी मुख्य समस्या यह है कि मुझे नहीं पता कि एंड्रॉइड हत्या-पुनरारंभ करने-सेवा व्यवहार को कैसे अनुकरण करना है। –