android एप्लिकेशन की मौत होने पर एंड्रॉइड पृष्ठभूमि सेवा पुनरारंभ हो रही है




service background-service (6)

मैं एक ही समस्या में भाग गया और सेवा को वैश्विक प्रक्रिया में चलाने के द्वारा इसे हल करने में सक्षम था। आप इसे मेनिफेस्ट टैग में जोड़कर ऐसा करते हैं:

प्रक्रिया = "com.myapp.ProcessName"

(जो भी नाम बनाओ।)

जब मैंने ऐसा किया तो मुझे पता चला कि ऐप को सूची से हटा दिया गया है जब मेरी सेवा नहीं मारा गया था (और पुनरारंभ)। संभवतः ऐसा इसलिए है क्योंकि जब आप इसे स्वाइप करते हैं तो ऐप प्रक्रिया मारे जाती है, लेकिन वैश्विक सेवा प्रक्रियाएं नहीं होती हैं।

इसका नुकसान यह है कि आपके ऐप और सेवा के बीच संचार अब आईबींडर इंटरफ़ेस के माध्यम से होना चाहिए; आप सीधे किसी अन्य एप्लिकेशन या सेवा में फ़ंक्शंस को कॉल नहीं कर सकते हैं, क्योंकि वे विभिन्न प्रक्रियाओं में चल रहे हैं।

मैं एक ऐसा एप्लीकेशन विकसित कर रहा हूं जिसमें सेंसर डेटा एकत्र करने के लिए पृष्ठभूमि सेवा बनाई गई हो। मैं अपनी गतिविधि से सेवा शुरू कर रहा हूं:

startService(new Intent(this, MyService.class));

मैंने सेवा बनाई है ताकि एप्लिकेशन नष्ट हो जाए, पृष्ठभूमि सेवा अभी भी डेटा एकत्र करना जारी रखती है। मैंने कोशिश की, और यह एक निश्चित हद तक काम किया। मेरी समस्या यह है कि जब मैं एप्लिकेशन को मारता हूं, तो सेवा फिर से शुरू होती है क्योंकि onStart() सेवा और onStart() विधियों को लागू किया जाता है। क्या कोई तरीका है जिसके साथ सेवा को पुनरारंभ नहीं किया गया है?

अद्यतन करें:

जैसा कि नीचे दिए गए उत्तर में सुझाया गया है, मैंने सेवा में निम्न विधि जोड़ा लेकिन कोई भाग्य नहीं।

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    return START_NOT_STICKY;
}

मुझे इस सवाल का जवाब देने में बहुत देर हो चुकी है, लेकिन हो सकता है कि यह दूसरों के लिए सहायक हो। यह वास्तव में मेरे संगीत प्लेयर ऐप के लिए मेरी मदद की।

यदि ऐसी सेवाएं हैं जो विघटनकारी हो सकती हैं या संगीत अनुभव जैसे उपयोगकर्ता अनुभव को प्रभावित कर सकती हैं, तो उस स्थिति में आपको अधिसूचना का उपयोग करना होगा और जब सेवा सफलतापूर्वक शुरू हो जाएगी, तो अधिसूचना बनाएं और फ़ंक्शन का उपयोग करें

startForeground(int Notification_id,Notification);

यह आपकी सेवाओं को पुन: प्रारंभ किए बिना और इसके तरीकों को फिर से शुरू किए बिना पृष्ठभूमि में चलाएगा

documentation


यदि आप एक इरादा सेवा का उपयोग कर रहे हैं, तो इसमें एक है

onHandleIntent() 

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


चिपचिपा शुरू न करें किटकैट से ऊपर काम नहीं करता है, और दूसरा ऑन टास्क ने मार्शमोलो के ऊपर काम नहीं किया है। onTaskRemoved कुछ अपवादों को संभालने के द्वारा इस्तेमाल किया जा सकता है। उस पर काम नहीं किया। लेकिन उसको आजमाएं।


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

सेवा को बदलने के लिए ताकि इसे अलग से मार दिया जा सके और यह मानते हुए कि यह ऑनस्टार्ट कमांड के उपयोग के कारण बाध्य सेवा के बजाय एक प्रारंभिक सेवा है, उस सेवा के लिए मैनिफेस्ट में एक प्रक्रिया नाम निर्दिष्ट करें।

प्रक्रिया और धागे डेवलपर गाइड से :

प्रत्येक प्रकार के घटक तत्व के लिए मैनिफेस्ट एंट्री- <activity>, <service>, <receiver>, and <provider> - एक एंड्रॉइड का समर्थन करता है: प्रक्रिया विशेषता जो उस प्रक्रिया को निर्दिष्ट कर सकती है जिसमें उस घटक को चलाना चाहिए। आप इस विशेषता को सेट कर सकते हैं ताकि प्रत्येक घटक अपनी प्रक्रिया में चलता है या ताकि कुछ घटक एक प्रक्रिया साझा करते हैं जबकि अन्य नहीं करते हैं। आप एंड्रॉइड भी सेट कर सकते हैं: प्रक्रिया ताकि विभिन्न अनुप्रयोगों के घटक एक ही प्रक्रिया में चल सकें-बशर्ते कि एप्लिकेशन समान लिनक्स उपयोगकर्ता आईडी साझा करें और उसी प्रमाणपत्र के साथ हस्ताक्षरित हों।

एंड्रॉइड किसी बिंदु पर एक प्रक्रिया को बंद करने का निर्णय ले सकता है, जब स्मृति कम होती है और अन्य प्रक्रियाओं द्वारा आवश्यक होती है जो उपयोगकर्ता की तुरंत सेवा कर रहे हैं। मारे गए प्रक्रिया में चल रहे अनुप्रयोग घटक परिणामस्वरूप नष्ट हो जाते हैं। उन घटकों के लिए फिर से एक प्रक्रिया शुरू की जाती है जब उनके लिए फिर से काम करना होता है।

<service> Service <service> मेनिफेस्ट फ़ाइल में से :

एंड्रॉयड: प्रक्रिया

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

यदि इस विशेषता को सौंपा गया नाम एक कोलन (':') से शुरू होता है, तो एक नई प्रक्रिया, एप्लिकेशन के लिए निजी, जब आवश्यक हो तब बनाई जाती है और सेवा उस प्रक्रिया में चलती है। यदि प्रक्रिया का नाम लोअरकेस चरित्र से शुरू होता है, तो सेवा उस नाम की वैश्विक प्रक्रिया में चली जाएगी, बशर्ते कि उसे ऐसा करने की अनुमति हो। यह संसाधनों के उपयोग को कम करने, प्रक्रियाओं को साझा करने के लिए विभिन्न अनुप्रयोगों में घटकों को अनुमति देता है।

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


जब स्मृति कम होती है, पृष्ठभूमि में चल रही एक सेवा स्वचालित रूप से मारे जाती है। सेवा शुरू करने के लिए startService () का उपयोग करने के बजाय, StartForeground () का उपयोग करने का प्रयास करें। यह सेवा अग्रभूमि में चलती है और स्मृति कम होने पर भी कभी नहीं मारा जाएगा।





background-service