वास्तव में, वहाँ कई समस्याओं है कि यह करने के लिए इस सवाल का और जवाब के कुछ लोगों द्वारा संबोधित कर रहे हैं:
अपने मूल सवाल का जवाब करने के लिए, "हाँ, यह अपेक्षित व्यवहार है"।
एंड्रॉइड प्रत्येक गतिविधि को एक अलग आत्मनिर्भर इकाई मानता है। एंड्रॉइड कार्य स्टैक में गतिविधियों की स्थिति को याद करता है और जब भी यह चाहें आपकी प्रक्रिया को मारने में कोई समस्या नहीं होती है (जिसमें आपकी सभी गतिविधियां होती हैं), क्योंकि यह "जानता है" कि जब भी इसकी आवश्यकता होती है तो यह हमेशा आपकी गतिविधियों का पुनर्निर्माण कर सकती है। यह अवधारणा निश्चित रूप से टूट जाती है जब आपके पास एक जटिल अनुप्रयोग होता है जहां आप गतिविधियों के बीच निर्भरता रखते हैं और/या आपके पास Application
कक्षा (या समान स्थिर/सिंगलटन स्थान) में संग्रहीत वैश्विक डेटा है।
जब एंड्रॉयड अपनी प्रक्रिया को मारता है यह कार्य में सर्वोच्च गतिविधि याद रखता है और जब उपयोगकर्ता कार्य करने के लिए देता है यह प्रक्रिया पुन और फिर पुन केवल कार्य में सर्वोच्च गतिविधि। आपके मामले में, MainActivity
।
उदाहरण के लिए, अपने कार्य को ढेर इस तरह दिखता है:
StartActivity -> ActivityB -> ActivityC -> ActivityD
और अपने कार्य को पृष्ठभूमि में चला जाता है और Android प्रक्रिया है, जब कार्य केवल ActivityD
करने के लिए उपयोगकर्ता रिटर्न बनाई जाएँगी को मारता है। एक बार ActivityD
समाप्त हो जाने पर, एंड्रॉइड फिर ActivityC
को फिर से बनाएगा। एक बार ActivityC
समाप्त हो जाने पर, एंड्रॉइड ActivityB
इत्यादि को फिर से बनाएगा।संक्षेप में, पूरा स्टैक उपयोगकर्ता द्वारा कार्य को फिर से शुरू करने पर पुनर्निर्मित किया गया है।
मेनिफेस्ट सेटिंग्स या इरादे झंडे का कोई संयोजन नहीं है जो आपको इच्छित व्यवहार प्राप्त करेगा। यह अच्छा होगा अगर एंड्रॉइड ने ऐसा कुछ दिया, लेकिन फिलहाल ऐसा नहीं होता है।
आप निर्धारित कर सकते हैं यदि आपके प्रक्रिया अपने आवेदन-व्युत्पन्न वर्ग में एक स्थिर (वर्ग) बूलियन चर का उपयोग करके पुन: प्रारंभ कर दिया गया है (या किसी अन्य वर्ग में)। जब प्रक्रिया को पुनरारंभ किया जाता है तो इस चर के पास हमेशा false
मान होगा और फिर आप कहीं भी वैरिएबल की स्थिति की जांच कर सकते हैं और यदि आवश्यक हो तो पुनः आरंभ करें (अपना डेटा पुनः लोड करें)। फिर आप चर को true
पर सेट करते हैं। यह true
रहेगा जब तक कि प्रक्रिया की हत्या और पुनर्निर्मित न हो जाए, भले ही आपकी सभी गतिविधियां खत्म हों। इस तरह आप केवल तभी प्रारंभ कर सकते हैं जब आवश्यक हो।
आप इसे SplashScreen
से अपने एप्लिकेशन को पुनरारंभ करने के लिए एक संकेतक के रूप में भी उपयोग कर सकते हैं। अपने सभी गतिविधियों में तो, onCreate()
में, आप राज्य इस बूलियन चर का जांच कर सकते हैं और यदि आवेदन को पुनः आरंभ कर दिया गया है तो आप बस SplashScreen
इस तरह रीडायरेक्ट कर सकते हैं:
Intent intent = new Intent(this, SplashScreen.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
इस में सभी गतिविधियों खत्म हो जाएगा कार्य करें और कार्य की जड़ पर SplashScreen
को पुनरारंभ करें।
बाद, यदि आपने आवेदन करने के लिए उपयोगकर्ता रिटर्न (जब यह पृष्ठभूमि में किया गया था और बाद में AndroidOS ने मार डाला), तो आप डेटा है कि आप में डाउनलोड संग्रहीत करना चाहिए डेटा हर बार डाउनलोड करने के लिए होने से रोकना चाहते निजी कैश क्षेत्र और जब एप्लिकेशन को पुनरारंभ किया जाता है तो इसका उपयोग करें। यह आपकी प्रक्रिया को मारने और पुनरारंभ करने पर बार-बार डेटा डाउनलोड करने से रोकता है।
इससे निपटने का एक और तरीका सेवा में अपना डेटा लोड करना होगा। अगर आपके पास Service
आपकी प्रक्रिया में चल रहा है तो एंड्रॉइड आपकी प्रक्रिया को मारने की संभावना कम है। उपयोगकर्ता को आपके आवेदन के साथ समाप्त होने पर आपको यह सुनिश्चित करने की आवश्यकता है कि आप अपना Service
बंद कर दें।
मुझे एहसास है कि यह उत्तर लंबी हवादार है। उम्मीद है कि आप इससे कुछ प्राप्त कर सकते हैं।
आप एंड्रॉइड सेट कर सकते हैं: प्रकट फ़ाइल में गतिविधि टैग में noHistory = "true" – rajpara
AFAIK, आपका प्रश्न गलत है, बल रोक दिया गया ऐप हमेशा अपनी मुख्य-लॉन्चर गतिविधि से शुरू होगा। – MKJParekh