क्या किसी एप्लिकेशन को छोड़ दिया गया है?


1151

एंड्रॉइड सीखने की मेरी कोशिश पर आगे बढ़ते हुए, मैंने बस निम्नलिखित पढ़ा :

प्रश्न: क्या उपयोगकर्ता के पास एप्लिकेशन को तब तक मारने का विकल्प है जब तक कि हम उसे मारने के लिए मेनू विकल्प नहीं रखते हैं? यदि ऐसा कोई विकल्प मौजूद नहीं है, तो उपयोगकर्ता आवेदन कैसे समाप्त करता है?

उत्तर: (रोमेन गाइ): उपयोगकर्ता नहीं करता है, सिस्टम इसे स्वचालित रूप से संभालता है। यही गतिविधि जीवनचक्र (विशेषकर onPause / onStop / onDestroy) के लिए है। कोई फर्क नहीं पड़ता कि आप क्या करते हैं, "छोड़ें" या "बाहर निकलें" एप्लिकेशन बटन न डालें। यह एंड्रॉइड के एप्लिकेशन मॉडल के साथ बेकार है। यह भी इसके विपरीत है कि कोर एप्लिकेशन कैसे काम करते हैं।

हे, मैं एंड्रॉइड की दुनिया में हर कदम के लिए मैं किसी तरह की समस्या में भाग लेता हूं = (

जाहिरा तौर पर, आप एंड्रॉइड में एप्लिकेशन नहीं छोड़ सकते हैं (लेकिन जब भी ऐसा लगता है एंड्रॉइड सिस्टम आपके ऐप को बहुत अच्छी तरह से नष्ट कर सकता है)। उसके साथ क्या है? मैं यह सोचना शुरू कर रहा हूं कि "सामान्य ऐप" के रूप में कार्य करने वाले ऐप को लिखना असंभव है - जब वह ऐसा करने का फैसला करता है, तो उपयोगकर्ता ऐप छोड़ सकता है। यह ऐसा कुछ नहीं है जिसे करने के लिए ओएस पर भरोसा किया जाना चाहिए।

मैं जिस एप्लिकेशन को बनाने का प्रयास कर रहा हूं वह एंड्रॉइड मार्केट के लिए कोई एप्लिकेशन नहीं है। यह आम जनता द्वारा "व्यापक उपयोग" के लिए एक आवेदन नहीं है, यह एक व्यवसायिक ऐप है जो बहुत ही संकीर्ण व्यावसायिक क्षेत्र में उपयोग होने वाला है।

मैं वास्तव में एंड्रॉइड प्लेटफॉर्म के लिए विकसित होने की उम्मीद कर रहा था, क्योंकि यह विंडोज़ मोबाइल और .NET में मौजूद बहुत सारे मुद्दों को संबोधित करता है। हालाँकि, पिछला हफ्ता मेरे लिए कुछ हद तक ठीक रहा है ... मुझे उम्मीद है कि मुझे एंड्रॉइड का त्याग नहीं करना पड़ेगा, लेकिन यह अभी बहुत अच्छा नहीं लगता है = (

क्या मेरे लिए वास्तव में आवेदन छोड़ने का कोई तरीका है ?

जवाबों:


1285

यह अंततः आपके प्रश्न पर पहुंच जाएगा, लेकिन मैं सबसे पहले आपके विभिन्न मुद्दों पर आपके विभिन्न टिप्पणियों को इस लेख के समय दिए गए विभिन्न उत्तरों को संबोधित करना चाहता हूं। मेरा आपके मन को बदलने का कोई इरादा नहीं है - बल्कि, ये अन्य लोगों के लिए हैं जो भविष्य में इस पोस्ट को पढ़ने के लिए आते हैं।

मुद्दा यह है कि मैं एंड्रॉइड के लिए यह निर्धारित करने की अनुमति नहीं दे सकता कि मेरा ऐप कब समाप्त होने वाला है। यह उपयोगकर्ता की पसंद होना चाहिए।

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

iPhone उपयोगकर्ता बहुत कुछ उसी तरह से हैं, जिसमें iPhone बटन को दबाने के लिए जरूरी "फील" नहीं होता है, जैसे ऐप को समाप्त कर दिया गया था, क्योंकि कई iPhone ऐप उस जगह को उठाते हैं जहां उपयोगकर्ता ने छोड़ा था, भले ही ऐप वास्तव में बंद हो गया हो (केवल iPhone के बाद से वर्तमान में एक समय में एक तृतीय-पक्ष ऐप की अनुमति देता है)।

जैसा कि मैंने ऊपर कहा था, मेरे ऐप में बहुत सारी चीज़ें चल रही हैं (डेटा को डिवाइस में PUSHed किया जा रहा है, उन कार्यों की सूची जो हमेशा होनी चाहिए, आदि)।

मुझे नहीं पता कि "कार्यों के साथ सूचियाँ जो हमेशा होनी चाहिए" का अर्थ है, लेकिन "डेटा को डिवाइस में रखा जा रहा है" एक सुखद कल्पना है और किसी भी मामले में एक गतिविधि द्वारा नहीं किया जाना चाहिए। AlarmManagerअधिकतम विश्वसनीयता के लिए अपने डेटा को अपडेट करने के लिए एक निर्धारित कार्य (के माध्यम से ) का उपयोग करें ।

हमारे उपयोगकर्ता लॉग इन करते हैं और ऐसा नहीं कर सकते कि हर बार उन्हें फोन कॉल मिले और एंड्रॉइड ऐप को मारने का फैसला करे।

कई iPhone और Android एप्लिकेशन हैं जो इससे निपटते हैं। आमतौर पर, यह इसलिए होता है क्योंकि वे उपयोगकर्ताओं को मैन्युअल रूप से हर समय लॉग इन करने के लिए बाध्य करने के बजाय लॉगऑन क्रेडेंशियल्स पर पकड़ रखते हैं।

उदाहरण के लिए, हम एप्लिकेशन से बाहर निकलते समय अपडेट की जांच करना चाहते हैं

यह किसी भी ऑपरेटिंग सिस्टम पर एक गलती है। आप सभी को पता है कि, आपका आवेदन "बाहर" किया जा रहा है क्योंकि OS बंद हो रहा है, और फिर आपकी अपडेट प्रक्रिया मध्य-धारा में विफल हो जाएगी। आम तौर पर, यह अच्छी बात नहीं है। या तो प्रारंभ पर अपडेट की जांच करें या अपडेट को पूरी तरह से अतुल्यकालिक रूप से जांचें (जैसे, एक निर्धारित कार्य के माध्यम से), कभी भी बाहर निकलने पर।

कुछ टिप्पणियों का सुझाव है कि बैक बटन मारने से ऐप को बिल्कुल भी नहीं मारा जाता है (ऊपर मेरे प्रश्न में लिंक देखें)।

BACK बटन दबाने से "ऐप को मारना नहीं है"। यह उस गतिविधि को पूरा करता है, जब उपयोगकर्ता ने BACK बटन दबाया था।

यह केवल तभी समाप्त होना चाहिए जब उपयोगकर्ता इसे समाप्त करना चाहते हैं - कभी भी किसी अन्य तरीके से नहीं। यदि आप एंड्रॉइड में ऐसा व्यवहार करने वाले एप्लिकेशन नहीं लिख सकते हैं, तो मुझे लगता है कि एंड्रॉइड का उपयोग वास्तविक एप्लिकेशन लिखने के लिए नहीं किया जा सकता है = (और)

फिर न तो वेब अनुप्रयोग कर सकते हैं। या WebOS , अगर मैं उनके मॉडल को सही ढंग से समझता हूं (मुझे अभी तक एक के साथ खेलने का मौका नहीं मिला है)। उन सभी में, उपयोगकर्ता कुछ भी "समाप्त" नहीं करते - वे बस छोड़ देते हैं। iPhone थोड़ा अलग है, इस में यह केवल वर्तमान में एक चीज (कुछ अपवादों के साथ) को चलाने की अनुमति देता है, और इसलिए छोड़ने का कार्य ऐप के काफी तत्काल समापन का तात्पर्य करता है।

क्या मेरे लिए वास्तव में आवेदन छोड़ने का कोई तरीका है?

जैसा कि बाकी सभी ने आपको बताया था, उपयोगकर्ता (BACK के माध्यम से) या आपके कोड (के माध्यम से finish()) आपकी वर्तमान में चल रही गतिविधि को बंद कर सकते हैं। उपयोगकर्ताओं को आम तौर पर किसी और चीज की आवश्यकता नहीं होती है, ठीक से लिखे गए अनुप्रयोगों के लिए, वेब अनुप्रयोगों का उपयोग करने के लिए उन्हें "छोड़" विकल्प की आवश्यकता होती है।


कोई भी दो अनुप्रयोग वातावरण समान नहीं हैं, परिभाषा के अनुसार। इसका मतलब यह है कि आप वातावरण में रुझान देख सकते हैं क्योंकि नए पैदा होते हैं और अन्य दब जाते हैं।

उदाहरण के लिए, "फ़ाइल" की धारणा को खत्म करने की कोशिश करने के लिए एक बढ़ते आंदोलन है। अधिकांश वेब एप्लिकेशन उपयोगकर्ताओं को फ़ाइलों के बारे में सोचने के लिए मजबूर नहीं करते हैं। iPhone ऐप्स आमतौर पर उपयोगकर्ताओं को फ़ाइलों के बारे में सोचने के लिए मजबूर नहीं करते हैं। एंड्रॉइड ऐप आमतौर पर उपयोगकर्ताओं को फ़ाइलों के बारे में सोचने के लिए मजबूर नहीं करते हैं। और इसी तरह।

इसी तरह, एक ऐप को "समाप्त" करने की धारणा को खत्म करने की कोशिश करने के लिए एक बढ़ते आंदोलन है। अधिकांश वेब एप्लिकेशन उपयोगकर्ता को लॉग आउट करने के लिए बाध्य नहीं करते हैं, बल्कि निष्क्रियता के बाद उपयोगकर्ता को निष्क्रिय कर देते हैं। एंड्रॉइड के साथ एक ही चीज, और कुछ हद तक, iPhone (और संभवतः WebOS)।

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

उदाहरण के लिए, हाइपरकार्ड और स्मॉलटाक जैसे कुछ विकास परिवेशों में एक सेटअप में अनुप्रयोग और विकास उपकरण सह-मिला हुआ था। यह कॉन्सेप्ट ऐप्स के भाषा एक्सटेंशन के बाहर (जैसे, एक्सेल में VBA , ऑटोकैड में लिस्प ) को ज्यादा नहीं झेल पाया । डेवलपर्स जो मानसिक मॉडल के साथ आए थे, जिन्होंने ऐप में ही विकास साधनों के अस्तित्व को माना था, इसलिए, या तो अपने मॉडल को बदलना होगा या खुद को ऐसे वातावरण तक सीमित करना होगा जहां उनका मॉडल सही होगा।

इसलिए, जब आप लिखते हैं:

मेरे द्वारा खोजी गई अन्य गन्दी चीजों के साथ, मुझे लगता है कि एंड्रॉइड के लिए हमारे ऐप को विकसित करने से कुछ होने वाला नहीं है।

यह सबसे अच्छा है, आप के लिए, अभी के लिए प्रतीत होता है। इसी तरह, मैं आपको आपके एप्लिकेशन को वेब पर पोर्ट करने के प्रयास के खिलाफ परामर्श दूंगा, क्योंकि कुछ ऐसी ही समस्याओं के बारे में, जो आपने एंड्रॉइड के साथ रिपोर्ट की हैं, आप वेब एप्लिकेशन में भी पाएंगे (उदाहरण के लिए, कोई "समाप्ति")। या, इसके विपरीत, किसी दिन अगर आप ऐसा वेब के लिए अपने app बंदरगाह, आप पा सकते हैं कि वेब अनुप्रयोग का प्रवाह Android के लिए एक बेहतर मैच हो सकता है, और आप उस समय एक Android बंदरगाह पर फिर से कर सकते हैं।


21
एक ने सोचा कि मेरे सिर में बहाव है: अगर मैं सिर्फ एक सेवा के रूप में पूरे ऐप को फिर से लिखता हूं, और उस सेवा को वास्तविक अनुप्रयोग के रूप में मानता हूं - शायद यह बेहतर काम करेगा? तब मैं गतिविधियाँ (जैसे एंड्रॉइड उन्हें चाहता है) को सेवा में निहित डेटा को प्रस्तुत करने के लिए "गूंगा" कर सकता था। उस स्थिति में, मैं शायद लॉगिन स्टेट और अन्य सामान वहां रख सकता था। StartForeground (int, Notification) का उपयोग करके मैं एंड्रॉइड को सेवा को मारने से लगभग रोक सकता हूं ...?
टेड

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

25
@SomeCallMeTim: नहीं, यह उपयोग करने का एक वैध कारण नहीं है killProcess()। यह बेहतर आईओएस कोड लिखने का एक वैध कारण है।
कॉमन्सवेयर

24
@CommonsWare: क्षमा करें, लेकिन यह एक अच्छा जवाब है जो मेरे लिए किसी काम का नहीं है। मैं पोर्ट कर रहा हूँ जो कि मुझे पोर्ट करने के लिए भुगतान किया गया है। क्या मुझे पोर्ट करते हुए, कोड को फिर से लिखने या अपने नियोक्ता के लिए लागत कम करने वाले तरीके से दो बार खर्च करना चाहिए, जिससे उन्हें एंड्रॉइड पर अधिक गेम डालने की अनुमति मिल सके? यह वैसे भी एक पूरी तरह से अकादमिक प्रश्न है: वे नहीं चाहते कि मैं उनके इंजन में इतने बड़े बदलाव करूँ, क्योंकि मैं iOS पर परिवर्तनों का परीक्षण नहीं कर सकता। और यह सिर्फ गलत है: उपयुक्त वस्तुओं के लिए सिंगलटन पैटर्न का उपयोग करने के बारे में कुछ भी "बुरा" नहीं है। Android सिर्फ WRT NDK ऐप्स को तोड़ा है।
SomeCallMeTim

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

289

मैं इस धागे के भविष्य के पाठकों के लिए यहां एक सुधार जोड़ना चाहूंगा। इस विशेष बारीकियों ने मेरी समझ को लंबे समय तक बचा लिया है इसलिए मैं यह सुनिश्चित करना चाहता हूं कि आप में से कोई भी एक ही गलती न करें:

System.exit()यदि आप स्टैक पर एक से अधिक गतिविधि करते हैं तो अपने ऐप को न मारें। वास्तव में क्या होता है कि प्रक्रिया को मार दिया जाता है और तुरंत स्टैक पर एक कम गतिविधि के साथ फिर से शुरू होता है । यह तब भी होता है जब आपके ऐप को फोर्स क्लोज डायलॉग द्वारा मार दिया जाता है, या जब आप डीडीएमएस से प्रक्रिया को मारने की कोशिश करते हैं। यह एक ऐसा तथ्य है जो मेरे ज्ञान के लिए पूरी तरह से अनिर्दिष्ट है।

संक्षिप्त उत्तर है, यदि आप अपने आवेदन से बाहर निकलना चाहते हैं, तो आपको अपने स्टैक में सभी गतिविधियों पर नज़र रखना है और finish()उन सभी में से जब उपयोगकर्ता बाहर निकलना चाहता है (और नहीं, गतिविधि स्टैक के माध्यम से पुनरावृति करने का कोई तरीका नहीं है , इसलिए आपको इस सब का प्रबंधन खुद करना होगा)। यहां तक ​​कि यह वास्तव में प्रक्रिया या किसी भी झूलने वाले संदर्भ को नहीं मारता है जो आपके पास हो सकता है। यह बस गतिविधियों को पूरा करता है। इसके अलावा, मुझे यकीन नहीं है कि क्या Process.killProcess(Process.myPid())कोई बेहतर काम करता है; मैंने इसका परीक्षण नहीं किया है।

यदि, दूसरी तरफ, आपके लिए अपने स्टैक में शेष गतिविधियों को रखना ठीक है, तो एक और तरीका है जो आपके लिए चीजों को सुपर आसान बनाता है: Activity.moveTaskToBack(true)बस आपकी प्रक्रिया को पृष्ठभूमि देगा और होम स्क्रीन दिखाएगा।

लंबे उत्तर में इस व्यवहार के पीछे दर्शन की व्याख्या शामिल है। दर्शन कई मान्यताओं से पैदा हुआ है:

  1. सबसे पहले, यह केवल तब होता है जब आपका ऐप अग्रभूमि में होता है। यदि यह पृष्ठभूमि में है तो प्रक्रिया ठीक-ठीक समाप्त हो जाएगी। हालाँकि, यदि यह अग्रभूमि में है, तो OS मानता है कि उपयोगकर्ता जो कुछ भी करना चाहता है, वह करता रहा है। (यदि आप डीडीएमएस से प्रक्रिया को मारने की कोशिश कर रहे हैं, तो आपको पहले होम बटन को हिट करना चाहिए, और फिर इसे मारना चाहिए)
  2. यह भी मानता है कि प्रत्येक गतिविधि अन्य सभी गतिविधियों से स्वतंत्र है। यह अक्सर सच होता है, उदाहरण के लिए कि आपका ऐप ब्राउज़र गतिविधि लॉन्च करता है, जो पूरी तरह से अलग है और आपके द्वारा नहीं लिखा गया है। ब्राउज़र की गतिविधि उसी कार्य पर बनाई जा सकती है या नहीं हो सकती है, जो उसकी प्रकट विशेषताओं पर निर्भर करती है।
  3. यह मानता है कि आपकी प्रत्येक गतिविधि पूरी तरह से आत्मनिर्भर है और एक पल की सूचना में उसे मारा / बहाल किया जा सकता है। (मैं इस विशेष धारणा को नापसंद करता हूं, क्योंकि मेरे ऐप में कई गतिविधियां हैं जो कैश्ड डेटा की एक बड़ी मात्रा पर निर्भर करती हैं, बहुत बड़ी कुशलता से इस दौरान onSaveInstanceStateसिलसिलेवार किया जाता है , लेकिन व्हाट्सएप क्या करते हैं?) अधिकांश अच्छी तरह से लिखे गए एंड्रॉइड ऐप के लिए यह सच होना चाहिए? चूँकि आप कभी नहीं जानते हैं कि पृष्ठभूमि में आपका ऐप कब मारा जाएगा।
  4. अंतिम कारक इतनी अधिक धारणा नहीं है, बल्कि ओएस की एक सीमा है: ऐप को स्पष्ट रूप से मारना ऐप क्रैश करने के समान है, और स्मृति को पुनः प्राप्त करने के लिए एंड्रॉइड ऐप को मारने के समान है। यह हमारी तख्तापलट की कृपा में परिणत होता है: चूंकि एंड्रॉइड यह नहीं बता सकता है कि ऐप आउट हो गया है या क्रैश हो गया है या बैकग्राउंड में मार दिया गया है, यह मानता है कि उपयोगकर्ता वापस वहीं लौटना चाहता है, और जहां गतिविधि प्रबंधक प्रक्रिया को पुनरारंभ करता है।

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

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

तो, मेरी समापन सलाह:

  • प्रक्रिया को मारने की कोशिश मत करो। या तो finish()सभी गतिविधियों पर कॉल करें या कॉल करें moveTaskToBack(true)
  • यदि आपकी प्रक्रिया क्रैश हो जाती है या मारे जाते हैं, और यदि, मेरी तरह, आपको उस डेटा की आवश्यकता है जो स्मृति में था जो अब खो गया है, तो आपको रूट गतिविधि पर वापस लौटना होगा। ऐसा करने के लिए, आपको startActivity()एक इरादे के साथ कॉल करना चाहिए जिसमें Intent.FLAG_ACTIVITY_CLEAR_TOPझंडा शामिल है ।
  • यदि आप ग्रहण डीडीएमएस परिप्रेक्ष्य से अपने ऐप को मारना चाहते हैं, तो बेहतर था कि यह अग्रभूमि में न हो, या यह स्वयं को पुनः आरंभ करेगा। आपको पहले होम बटन को प्रेस करना चाहिए, और फिर प्रक्रिया को मारना चाहिए।

8
दरअसल, जब से मैंने एंड्रॉइड के साथ फिर से शुरू किया, मैं सभी गतिविधियों को समाप्त कर रहा हूं (केवल एक गतिविधि किसी भी समय सक्रिय है), और फिर मैं System.exit (0) कहता हूं; मेरी सेवा में - और जैसा मैं चाहता हूं, वैसा ही काम करता है। मुझे पता है कि ज्यादातर पीपीएल कहते हैं कि "ऐसा मत करो", लेकिन मुझे उस चाल के साथ जैसा व्यवहार चाहिए, वैसा ही मिलता है ...
टेड

13
कभी-कभी प्रक्रिया को मारना बहुत उपयोगी होता है - उदाहरण के लिए जब देशी कोड का उपयोग करने वाले गेम लिखते हैं। प्रक्रिया को मारने का मतलब है कि सिस्टम को वापस आवंटित स्मृति को तुरंत जारी करना।
सुल्तान

10
परवाह करने वाले किसी भी व्यक्ति के लिए, Process.killProcess बिल्कुल System.exit () के समान व्यवहार को प्रदर्शित करता है
PacificSky

6
एक सामान्य AtivityBase से सभी गतिविधियों को वितरित करें। फिर बल को बंद करें ध्वज को सेट किया गया है, तो onResume जाँच में एप्लिकेशन को बंद करने के लिए एक ध्वज पकड़ें। यदि ऐसा है तो System.exit (0) को कॉल करें; यह पूरी गतिविधि स्टैक के माध्यम से कैस्केड करेगा और अंत में ऐप को पूरी तरह से बंद कर देगा।
नर गर

12
वास्तविक उत्तर प्रदान करने के लिए धन्यवाद ( moveTaskToBack()जो मैं देख रहा था)। इतने सारे लोग बस कहते हैं "नहीं, आप कभी भी अपने ऐप से बाहर निकलने के लिए एक बेवकूफ हैं।" यहां तक ​​कि यह विचार किए बिना कि ऐसे मामले भी हो सकते हैं, जहां आप यह चाहते हैं (जैसे विफल लॉगिन)।
तम्मम्

179

मेरे सभी एप्लिकेशन ने बटन छोड़ दिए हैं ... और मुझे इसकी वजह से अक्सर उपयोगकर्ताओं से सकारात्मक टिप्पणियां मिलती हैं। मुझे परवाह नहीं है अगर प्लेटफ़ॉर्म को इस तरह से डिज़ाइन किया गया था कि अनुप्रयोगों को उनकी आवश्यकता नहीं होनी चाहिए। "उन्हें वहाँ मत डालो" कहना हास्यास्पद की तरह है। यदि उपयोगकर्ता छोड़ना चाहता है ... मैं उन्हें बिल्कुल वैसा ही करने की पहुंच प्रदान करता हूं। मुझे नहीं लगता कि यह कम करता है कि एंड्रॉइड कैसे काम करता है और एक अच्छा अभ्यास लगता है। मैं जीवन चक्र को समझता हूं ... और मेरा अवलोकन यह रहा है कि एंड्रॉइड इसे संभालने में अच्छा काम नहीं करता है .... और यह एक बुनियादी तथ्य है।


15
+1 क्योंकि दुर्भाग्य से यह इस समय में इतना अच्छा काम नहीं करता है (लेकिन मैं अभी भी डिजाइन के अनुसार काम करने की कोशिश करना चाहता हूं, इसलिए यह मुझे एक मुश्किल में डाल देता है)
रिचर्ड ले मेसुरियर

25
छोड़ने के लिए आप किस तंत्र का उपयोग करते हैं?
गैरी रुडोल्फ

4
@ आईजीआर खत्म () - आईएनजी गतिविधियां एप्लिकेशन को नहीं मारती (आवेदन का विस्तार करती है)। इसलिए जब कोई भी गतिविधि सक्रिय नहीं थी तब भी सेटिंग्स सक्रिय और वास्तविक हैं, जैसे कि जब गतिविधियां उन्हें एक्सेस करने की कोशिश करती हैं, तो वे वही होंगे जो पहले उपयोग किए गए थे। System.exit (0); दूसरी ओर एप्लिकेशन को मारता है, जैसे कि जब फिर से शुरू किया जाता है तो ऐप को नए सिरे से सेटिंग्स को इनिशियलाइज़ करना होगा। मुझे अपने एप्लिकेशन को मैन्युअल रूप से अपडेट करते समय इसकी आवश्यकता है, क्योंकि मैं अक्सर डेटा के प्रारूप को बदलता हूं और मुझे तुरंत उन्हें फिर से चालू करने की आवश्यकता होती है।
Nar Gar

1
खैर, यह एकमात्र तरीका है जिसे मुझे इस समय पूरा करने की आवश्यकता है। जब एप्लिकेशन अपडेट किया जाता है, तो मैं system.exit का उपयोग करता हूं (अन्यथा मुझे अपने कोड परिवर्तनों के आधार पर क्रमांकन या क्लास कास्ट अपवाद मिलेगा)। हालांकि मुझे यह उल्लेख करना चाहिए कि मैं उपयोगकर्ता को सिस्टम के माध्यम से ऐप को मारने के लिए यूआई हैंडल नहीं देता हूं। यह मेरे लिए आरक्षित है क्योंकि ऐप का इंजीनियर केवल तभी उपयोग किया जाएगा जब ऐप को पूरी तरह से अनलोड करने की आवश्यकता हो। बाकी समय एक साधारण खत्म () या (डिफ़ॉल्ट बैक बटन ऑपरेशन) का उपयोग किया जाता है।
नर गर

13
हाँ .. 'नॉट एंड्रॉइड स्टैंडर्ड' के साथ नरक .. एंड्रॉइड शक्तिशाली coz है, यह लोगों को प्रयोग करने में सक्षम बनाता है .. यदि यह कुछ करने के लिए एपीआई प्रदान करता है, तो कोई यह कैसे कह सकता है कि यह एंड्रॉइड मानक नहीं है? मैं उन सभी 'दार्शनिक' उत्तरों को पचा नहीं सकता। आप अपने उपयोगकर्ताओं को ध्यान में रखते हुए ऐप बनाते हैं। अगर वे खुश हैं या यदि वे इस विशेषता को देखना चाहते हैं, तो यह लागू करना बिल्कुल ठीक है कि भले ही वे तथाकथित दार्शनिक इसके खिलाफ हों ..
राहुल

144

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

यह जानना नहीं कि आपका रहस्यमय ऐप "क्या करता है" वास्तव में महत्वपूर्ण नहीं है। चलो मान लेते हैं कि यह कुछ सुपर सिक्योर कॉर्पोरेट इंट्रानेट में टनल है, कुछ मॉनीटरिंग या इंटरैक्शन करता है और तब तक लॉग इन रहता है जब तक कि उपयोगकर्ता "एप्लिकेशन को क्विट नहीं करता"। क्योंकि आपका आईटी विभाग इसे कमांड करता है, इसलिए उपयोगकर्ताओं को इंट्रानेट के IN या OUT होने पर बहुत सचेत होना चाहिए। इसलिए उपयोगकर्ताओं के लिए "छोड़ने" के लिए आपकी मानसिकता महत्वपूर्ण है।

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

यह सभी इरादों और उद्देश्यों के लिए है, जैसा कि आप चाहते हैं कि आप क्या कहते हैं। Android तरीके से किया। इस "निकास" के उदाहरणों के लिए Google टॉक या Google मैप्स नेविगेशन देखें संभव मानसिकता है। अंतर केवल इतना है कि आपकी गतिविधि से बैक बटन दबाने से आपकी UNIX प्रक्रिया पूरी होने तक प्रतीक्षा में रह सकती है, जब उपयोगकर्ता आपके एप्लिकेशन को पुनर्जीवित करना चाहता है। यह वास्तव में एक आधुनिक ऑपरेटिंग सिस्टम से अलग नहीं है जो हाल ही में फ़ाइलों को मेमोरी में एक्सेस करता है। जब आप अपने विंडोज़ प्रोग्राम को छोड़ देते हैं, तो सबसे अधिक संभावना वाले संसाधनों की आवश्यकता होती है जो अभी भी स्मृति में हैं, अन्य संसाधनों द्वारा प्रतिस्थापित किए जाने की प्रतीक्षा में क्योंकि वे अब लोड किए गए हैं कि उन्हें अब ज़रूरत नहीं है। Android एक ही बात है।

मैं वास्तव में आपकी समस्या नहीं देखता।


3
@ एरिक, आप समस्या को नहीं देखते क्योंकि आप इससे दूर भाग रहे हैं। आप बस एक और प्रोग्राम का उपयोग करते हैं जो "एंड्रॉइड मॉडल" द्वारा नहीं किया जा सकता करने के लिए पुराने "प्रोग्राम मॉडल" पर चलता है। "एंड्रॉइड मॉडल" के साथ समस्या को देखने के लिए, आपको यह कल्पना करना होगा कि आपके पास लिनक्स / विंडोज बक्से को कार्यों को सौंपने की लक्जरी नहीं है। आपको यह कल्पना करना होगा कि आप "एंड्रॉइड मॉडल" को चलाने वाले केवल बॉक्स वाले फ्रंटस्टैंड से बैकस्टेंड तक सब कुछ करने के लिए मजबूर हैं । फिर, आप देखेंगे कि "एंड्रॉइड मॉडल" की सीमाएं आकाश के समान स्पष्ट हैं।
पचेरियर

एक अखंड आवेदन के रूप में अपने आवेदन के बारे में सोचो। यह जावा में लिखा गया है जिसे एकल JVM (जावा वर्चुअल मशीन) प्रक्रिया द्वारा निष्पादित किया जा रहा है। System.exit () JVM से बाहर निकलता है और पूरी तरह से सभी UI स्क्रीन और सब कुछ समाप्त कर देता है। इसका अपवाद IF है, जो प्रोग्रामर को कई थ्रेड सेट करने की परेशानी में जाता है, जो कई प्रक्रियाओं में चलते हैं - लेकिन डिफ़ॉल्ट रूप से, यह ऐसा नहीं है, और Google के अनुसार, सामान्य रूप से नहीं किया जाना चाहिए।
जेसी गॉर्डन

@JesseGordon यह सिर्फ सच नहीं है। System.exit()केवल स्टैक से एक गतिविधि निकालता है। जेवीएम पर तुरंत लगाम लगाई गई है। इस जवाब को देखें ।
forresthopkinsa

1
@forresthopkinsa ठीक है मैंने इसे एंड्रॉइड 7.0 पर परीक्षण किया है। एक साधारण सिंगल थ्रेडेड ऐप अभी भी अपने समर्पित जेवीएम उदाहरण में चलता है, जो उस ऐप के लिए एक यूजर आईडी के रूप में चल रहा है। मैंने इस परीक्षण के लिए एक बहु-थ्रेडेड एप्लिकेशन की कोशिश नहीं की। और System.exit () STILL पूरे JVM को उस ऐप के लिए मार देता है। यदि System.exit () को प्राथमिक गतिविधि से कहा जाता है, तो यह बाहर निकल जाता है। अगर System.exit () को एक सबएक्टिविटी से बुलाया जाता है, तो JVM को अभी भी मार दिया जाता है, लेकिन एंड्रॉइड इसे मुख्य / पहली गतिविधि पर वापस एक नई प्रक्रिया आईडी के तहत पुनः आरंभ करता है। android.os.Process.killProcess (android.os.Process.myPid ()); और मार <pid> उसी तरह से काम करें।
जेसी गॉर्डन

1
रुचिकर .. आपके द्वारा जोड़े गए उत्तर को देखते हुए, @forresthopkinsa, ऐसा लग रहा है कि Android वेब ब्राउज़र की तरह कर रहा है, सिस्टम के बाद की गतिविधियों को पुनर्स्थापित कर रहा है। इसलिए उपयोगकर्ता इसे बाहर निकलने की सूचना नहीं देता है, लेकिन बाहर निकलने का कारण बनने वाली गतिविधि को छोड़कर। ।? अजीब। लेकिन फिर भी, System.exit () सभी गतिविधियों को बंद कर देता है और मुफ्त () की मेमोरी को बंद कर देता है और उस ऐप के लिए JVM को समाप्त कर देता है। लेकिन मुझे इस बात का कोई अंदाजा नहीं है कि एंड्रॉइड किस तरह की हरकतों को फिर से शुरू / बहाल करता है। क्या यह ऐप किलर ऐप्स को विफल करने के लिए है? इसलिए मुझे लगता है कि अगर कोई बाहर निकलने का बटन चाहता है, तो उन्हें इसे मुख्य गतिविधि में रखना चाहिए।
जेसी गॉर्डन

71

यह बहुत सारे विशेषज्ञों के योगदान के साथ एक दिलचस्प और व्यावहारिक चर्चा है। मुझे लगता है कि इस पोस्ट को एंड्रॉइड विकास मुख्य वेबसाइट के भीतर से वापस पा लिया जाना चाहिए, क्योंकि यह एंड्रॉइड ओएस के मुख्य डिजाइनों में से एक के चारों ओर घूमता है।

मैं यहां अपने दो सेंट भी जोड़ना चाहूंगा।

अब तक मैं एंड्रॉइड के जीवन चक्र की घटनाओं से निपटने के तरीके से प्रभावित हो गया हूं, जिससे नेटिव ऐप्स को वेब जैसा अनुभव प्राप्त हो सके।

यह कहते हुए कि मैं अभी भी मानता हूं कि एक Quitबटन होना चाहिए । क्यों? ... मेरे लिए या टेड या किसी भी तकनीकी गुरु के लिए नहीं, बल्कि एक अंतिम उपयोगकर्ता की मांग को पूरा करने के एकमात्र उद्देश्य के लिए।

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

इसका मतलब यह नहीं है कि कोई व्यक्ति (OS, डेवलपर?) अपने विवेक से इस बात का ध्यान रखेगा ... इसका सीधा सा मतलब है कि "मेरा Red X बटन कहां है जिसका मैं उपयोग कर रहा हूं"। मेरी कार्रवाई 'एक बटन दबाने पर कॉल समाप्त करने' के अनुरूप होनी चाहिए, 'बटन दबाकर डिवाइस को बंद करें', और इसी तरह आगे भी ... यह एक धारणा है। यह प्रति संतुष्टि देता है कि मेरी कार्रवाई वास्तव में अपने उद्देश्य को प्राप्त करती है।

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


2
सही। Good ol 'विंडोज मोबाइल ने विंडोज पीसी के समान ही एक्स बटन की पेशकश की, सिवाय इसके कि उसने वास्तव में ऐप को नहीं छोड़ा, यह सिर्फ "स्मार्ट" ने इसे कम कर दिया। कई उपयोगकर्ताओं को शायद कभी नहीं पता चला कि ऐप ने वास्तव में नहीं छोड़ा। (दृष्टिकोण ने बहुत काम किया, हालांकि यदि आपने .NET कॉम्पैक्ट फ्रेमवर्क का उपयोग किया है, तो एप्लिकेशन को सूचित नहीं किया गया था कि ऐसा हुआ था और इसलिए संसाधनों को मुक्त करने या वास्तव में छोड़ने का विकल्प नहीं था।)
क्वाटर्ली

3
वास्तव में, यह आपके उपयोगकर्ताओं को उन्हें एक गर्म, फजी एहसास देने के लिए झूठ बोलने की मात्रा है। अंततः, अतीत के अवशेषों को किनारे पर जाने देना बेहतर है, ऐसा न हो कि वे प्रौद्योगिकी के स्थायी जुड़ाव बने रहें। मोबाइल और वेब नए प्लेटफ़ॉर्म हैं, और उनसे डेस्कटॉप के समान व्यवहार की उम्मीद नहीं की जाती है। और वास्तविक रूप से, कम से कम, एंड्रॉइड के जीवनचक्र निर्णय उपयोगकर्ताओं के साथ पकड़ते प्रतीत होते हैं: जैसा कि मेरा सबसे बड़ा ऐप अपनी 2 साल की सालगिरह को पार करता है, मैंने "एक्जिट" बटन के सूखने पर एंड-यूज़र अनुरोधों की धारा को देखा है क्योंकि वे सूख जाते हैं। नया मंच।
जॉन ओ

2
@ क्या आप सलाह देते हैं? ऐप में कहीं भी an एग्जिट ’का विकल्प नहीं दे रहे हैं?
इगोरगानापोलस्की

खैर, जब कोई उपयोगकर्ता एक निकास बटन का अनुरोध करता है, तो मैं उन्हें ठीक से समझाऊंगा कि डेस्कटॉप पर चीजों की तुलना में अलग तरीके से कैसे काम किया जाता है (यह वही स्पष्टीकरण है जो मैं उन्हें देता हूं जब वे कार्य हत्यारों का उल्लेख करते हैं)। अब, जानकारी को पकड़ा गया लगता है, और मुझे अब वे अनुरोध नहीं मिलते हैं। इसलिए, मैं आपको इसे कुछ बार समझाने की सलाह देता हूं (शायद डिब्बाबंद प्रतिक्रिया के साथ) और बटन को छोड़ दें। या एक नकली निकास बटन में डाल दिया जो एक संवाद को यह बताता है कि क्यों अधिक निकास बटन नहीं हैं। : डी (एंड्रॉइड 4+ में भी एक उपयोगकर्ता मल्टीटास्किंग डिस्प्ले के "ऑफ" को "मार" कर सकता है।)
जॉन ओ

3
मैंने यह भी कहा कि "प्रक्रिया को मत मारो" सभी सलाह के पीछे तर्क नहीं मिला। मेरी राय में, ग्राहक हमेशा सही होता है, इसलिए यह अनुरोध किए जाने के बाद एक एक्जिट बटन प्रदान करने में क्या गलत है और "अपने उपयोगकर्ताओं से झूठ बोलकर उन्हें एक गर्म, फजी अहसास देने के लिए", अगर वे चाहते हैं? यह आंशिक रूप से क्या है जो अच्छे ऐप्स को लिख रहा है। अधिकांश उपयोगकर्ता यह नहीं जानते या परवाह नहीं करते हैं कि वास्तव में हुड के तहत क्या चल रहा है, लेकिन अगर उन्हें आपका ऐप पसंद है और यह वही करता है जो वे चाहते हैं और उम्मीद करते हैं, तो वे वापस आएंगे और आपके अधिक एप्लिकेशन खरीदेंगे। यही हम सब चाहते हैं, है ना? या क्या मैं कुछ न कुछ भूल रहा हूं?
DDSports

37

आप बटन को दबाकर या अपने फोन में कॉल करके छोड़ सकते हैं । बस फोन एक से करता है, तो आप स्पष्ट रूप से यह बंद को मारने के लिए चाहता हूँ।Backfinish()Activityfinish()MenuItem

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


5
इसका कोई मतलब नहीं है अगर यह एक उद्देश्य को पूरा करता है, और हमारे आवेदन में यह ऐसा करता है। उदाहरण के लिए, हम एप्लिकेशन से बाहर निकलते समय अपडेट की जांच करना चाहते हैं। हम ऐप से बाहर नहीं निकल सकते, फिर कोई अपडेट नहीं किया जा सकता है। कुछ टिप्पणियों का सुझाव है कि बैक बटन पर मारना ऐप को बिल्कुल भी नहीं मारता है (ऊपर मेरे प्रश्न में लिंक देखें)।
टेड

2
जैसा कि रोमैन कहते हैं, यह नहीं है कि कोर एप्लिकेशन कैसे काम करते हैं। इसलिए यदि उपयोगकर्ताओं को एक ऐप छोड़ने के लिए "बैक" दबाने के लिए उपयोग किया जाता है, तो संभावना है कि वे स्पष्ट रूप से क्विट चुनने के बजाय आपके ऐप के साथ ऐसा करना जारी रखेंगे? आप स्टार्टअप, या onDestroy (), या दोहराए जाने वाले अलार्म का उपयोग करके एक अपडेट की जांच कर सकते हैं .. यह ऐसा कुछ नहीं लगता है जिसे उपयोगकर्ता द्वारा ट्रिगर करने की आवश्यकता होती है।
क्रिस्टोफर ऑर

1
टॉम: मैं विंडोज मोबाइल के लिए लगभग 5 वर्षों से कोडिंग कर रहा हूं। "सीमित संसाधनों" के साथ एक फोन। वहां ऐसा कोई व्यवहार नहीं है, और इसमें कोई समस्या नहीं है कि यह "बड़े भाई" में कार्य नहीं करता है। "रियल ऐप्स" = जहां प्रोग्रामर का इस पर बहुत अधिक नियंत्रण होता है, अर्थात छोड़ने पर, जब GUI- सामान हटाया जाता है आदि ...
Ted

1
जे: क्योंकि अगर यह अभी भी स्मृति में है, तो मैं एप इम सोच को अपडेट नहीं कर सकता। कैंट डेली फाइलें जो उपयोग में हैं, सही है? मैं बाहर निकलने पर अपडेट करना चाहता हूं क्योंकि हम अपने उपयोगकर्ताओं को शुरू में अपडेट करने के लिए मजबूर नहीं कर सकते। कि उन्हें कैसे काम करना है और उन्हें क्या चाहिए। यह उनके लिए ठीक नहीं है कि उन्हें अलग-अलग कारणों से अपनी पारी की शुरुआत में एक अपडेट के लिए मजबूर किया जाए। यह थोड़ा जटिल है।
टेड

1
जय: नहीं, जैसा कि मैंने कहा था कि यह एक मार्केट ऐप नहीं है, और इसका कारण यह भी नहीं है। यह एक बहुत ही खास ऐप है, सामान्य उपयोग के लिए नहीं।
टेड

31

यह बहस उम्र-पुराने सवाल को उबालती है कि क्या डेवलपर्स सबसे अच्छा जानते हैं या क्या उपयोगकर्ता सबसे अच्छा जानता है। मानव कारकों के सभी क्षेत्रों में पेशेवर डिजाइनर हर दिन इसके साथ संघर्ष करते हैं।

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

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

हालाँकि, मेरा यह भी मानना ​​है कि आपको उपयोगकर्ता को निराश नहीं करना चाहिए, भले ही वह निराशा उनके अपने अज्ञान से उत्पन्न हो। उस वजह से, मैं यह निष्कर्ष निकालता हूं कि 'क्विट' विकल्प होना अच्छा डिज़ाइन है, भले ही यह ज्यादातर एक प्लेसबो बटन हो, जो एक व्यू को बंद करने से ज्यादा कुछ नहीं करता है।


8
हां, 'क्विट' बटन होना वास्तव में उपयोगकर्ता के अनुकूल है। यदि वह 5 गतिविधियों में गहरी है तो उपयोगकर्ता ऐप को कैसे छोड़ देगा? यकीन है कि वे कई बार वापस दबा सकते हैं, लेकिन मुझे नहीं लगता कि वे ऐसा चाहते हैं।
इगोरगानापोलस्की

4
केवल 5? एंड्रॉइड 2.2 वेब ब्राउज़र मुझे कुछ मिनट बिताता है जब तक कि मैं अंतिम रूप से बाहर निकलने तक वापस बटन टैप नहीं करता हूं
जो प्लेंटे

3
मैं एंड्रॉइड के डेवलपर्स को सुनना शुरू कर दूंगा जब वे मेमोरी मैनेजर विकसित करते हैं जो काम करता है। Froyo के रूप में, इसने बेहद खराब तरीके से काम किया, रैंडम एप्स को मार दिया, उन एप्स को फिर से शुरू किया जिन्हें (और उन्हें वैध तरीके से शुरू करने का कोई इरादा नहीं है), और OTOH, एक मेमोरी पूरी तरह क्रॉल करते हुए जब मेमोरी 50MB फ्री हो।
डीवीके

10
जब आपका धर्म कहता है कि एंड्रॉइड टास्क किलर "गैर-आवश्यक" है, लेकिन एटीके का उपयोग करके उन गूंगे कार्यों को मारने के लिए जिनके पास कोई व्यवसाय नहीं चल रहा है, ओएस को 1-5% सामान्य गति से रेंगने से बदल देता है, जो सामान्य गति का 100% है ( मापा जाता है) 2% से अधिक एटीके usages के 100% समय के लिए हर बार सिस्टम 50MB मुक्त कम अंत हिट करता है, आपका धर्म गलत है
DVK

@JoePlante आप पहले सभी खुले टैब और विंडो बंद कर सकते हैं और फिर छोड़ने के लिए बस एक बार बैक बटन दबाएं :) कम से कम मेरे GS2 पर।
ldam

29

टेड, जिसे आप पूरा करने की कोशिश कर रहे हैं वह किया जा सकता है, शायद अभी आप इसे कैसे सोच रहे हैं।

मेरा सुझाव है कि आप गतिविधियों और सेवाओं पर पढ़ें। "ऐप" शब्द का उपयोग करना बंद करें और घटकों, अर्थात गतिविधि, सेवा का उल्लेख करना शुरू करें। मुझे लगता है कि आपको एंड्रॉइड प्लेटफ़ॉर्म के बारे में अधिक जानने की आवश्यकता है; यह एक मानक पीसी ऐप से मानसिकता में बदलाव है। यह तथ्य कि आपकी किसी भी पोस्ट में "एक्टिविटी" (अक्सर पूछे जाने वाले प्रश्न का छोटा हिस्सा, यानी आपके शब्दों का नहीं) शब्द होता है, जिसमें मुझे बताया गया है कि आपको कुछ और पढ़ने की जरूरत है।


Ive ने android.com पर अधिकतर सामान पढ़ा =) और मैं अपने कई सवालों से जुड़ सकता हूँ जहाँ मैं गतिविधियों के बारे में बात करता हूँ, इसलिए यह सच नहीं है (उदा: stackoverflow.com/questions/2032335/… या stackoverflow.com/questions/ 2032335 /… आदि ...) हालांकि, मैं इसे एक आखिरी बार दे सकता हूं, और एक सर्वर के रूप में "ऐप" बनाने की कोशिश कर सकता हूं ...
टेड

4
एक ऐप में सेवाएँ और गतिविधियाँ हो सकती हैं, और ऐसा लगता है कि आपके ऐप को दोनों की आवश्यकता हो सकती है। गतिविधि केवल UI भाग है।
आरोन

23

एंड्रॉइड एप्स में एक्जिट बटन शामिल करने के लिए ब्लॉग पोस्ट कब (संकेत: कभी नहीं) यह बताती है कि मैं इससे कहीं बेहतर कर सकता हूं। काश हर Android डेवलपर इसे पहले ही पढ़ चुका होता।

कुछ अंशः

मेरे अनुभव में [उपयोगकर्ता] वास्तव में क्या चाहते हैं: यह गारंटी देने का एक नायाब तरीका है कि एक ऐप संसाधनों (बैटरी, सीपीयू चक्र, डेटा स्थानांतरण, आदि) का उपभोग करना बंद कर देगा।

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

  • ज्यादातर मामलों में निकास बटन बस कॉल करता है Activity.finish()। यह वह जगह है वास्तव में पीछे बटन दबाने के बराबर है। बिल्कुल सही। सेवाएं चलती रहती हैं और मतदान होता रहता है। उपयोगकर्ता सोच सकते हैं कि उन्होंने ऐप को मार दिया है, लेकिन उन्होंने ऐसा नहीं किया है, और जल्द ही वे और भी नाराज हो जाएंगे।
  • बाहर निकलें व्यवहार अब अस्पष्ट है। क्या आपके एग्जिट बटन को सिर्फ एक्टिविटी को बंद करना चाहिए, या इसे सभी संबंधित सेवाओं, रिसीवर और अलार्म को भी बंद कर देना चाहिए? क्या करना चाहिए Back? अगर वे Homeबजाय हिट क्या होता है ? यदि आपके ऐप में विजेट है तो क्या होगा? क्या एग्जिट बटन को भी अपडेट होने से रोकना चाहिए?

इसका उपाय यह है कि आप बैक बटन को वैसा ही व्यवहार करें जैसा आप बाहर निकलने वाले बटन से करना चाहते हैं। जब भी ऐप दिखाई न दे, बस संसाधनों का उपभोग करना बंद कर दें।

आगे बढ़ो और पूरा लेख पढ़ें।


3
Exit और Back का उपयोग हमेशा एक ही उद्देश्य के लिए नहीं किया जाता है। उदाहरण के लिए, पेंडोरा को ही लें। जब आप इस ऐप से बाहर निकलने के लिए पीछे हटते हैं, तो यह ऐप से बाहर नहीं निकलता है (इसे सेवा के रूप में पृष्ठभूमि में खेलता रहता है)।
इगोरगानापोलस्की

@IgorG। एक म्यूजिक प्लेयर एप को म्यूजिक बजाने के लिए "स्टॉप" बटन की जरूरत होती है, एप से बाहर निकलने के लिए "एग्जिट" बटन की नहीं।
धीरज वेपकोमा

क्या आपने कभी पेंडोरा, iHeartRadio, Spotify, Jango और अन्य संगीत स्ट्रीमिंग ऐप्स का उपयोग किया है? वे सभी एक छोड़ दिया बटन है। एक ऐप छोड़ने के रूप में संगीत नाटक रोकना एक ही बात नहीं है। खासकर अगर आपके पास नोटिफिकेशन बार में चलने वाली सर्विस है।
इगोरगानापोलस्की

2
पौराणिक या नहीं, आदिम उपयोगकर्ताओं या नहीं, लेकिन लगभग हर यूआई सॉफ्टवेयर कभी भी लिखा है - किसी भी मंच और ओएस पर - एक छोड़ / बंद / निकास बटन को लागू करता है। आप इसे और कैसे लागू करेंगे?
इगोरगानापोलस्की

3
@ DheerajV.S।, जब भी ऐप दिखाई न दे, तो संसाधनों का उपभोग करना बंद कर दें? बुरी सलाह। बहुत। बहुत x99। जब भी मैं अपने आप को एक फोटो ईमेल करने की कोशिश करता हूं, तो मुझे ऐप को पूरे 5 मिनट तक देखना पड़ता है क्योंकि अगर मैं इसे कम कर देता हूं, तो यह फोटो को ईमेल करना बंद कर देता है। सही है, मैं अपने फोन का उपयोग पूरे 5 मिनट के लिए नहीं कर सकता क्योंकि कुछ डेवलपर को लगता है कि ऐप केवल दिखाई देने पर ही चलना चाहिए। अब वीडियो की तरह एक बड़ी फाइल भेजने की कल्पना करें .....
पचेरियर

21

उत्तर: (रोमेन गाइ): उपयोगकर्ता नहीं करता है, सिस्टम इसे स्वचालित रूप से संभालता है। यही गतिविधि जीवनचक्र (विशेषकर onPause / onStop / onDestroy) के लिए है। कोई फर्क नहीं पड़ता कि आप क्या करते हैं, "छोड़ें" या "बाहर निकलें" एप्लिकेशन बटन न डालें। यह एंड्रॉइड के एप्लिकेशन मॉडल के साथ बेकार है। यह भी इसके विपरीत है कि कोर एप्लिकेशन कैसे काम करते हैं।

1: किसी एप्लिकेशन से पूरी तरह से बाहर निकलना आम तौर पर असंसदीय हो सकता है, लेकिन यह बेकार नहीं है। क्या होगा अगर खिड़कियों में कोई निकास विकल्प नहीं था? सिस्टम मैमोरी भरा होने के साथ धीमी गति से होगा और ओएस को यह अनुमान लगाना होगा कि आपके साथ कौन से प्रोग्राम किए गए थे। मुझे परवाह नहीं है कि रोमेन गाइ या यहां तक ​​कि लैरी पेज और सर्गेई ब्रिन का क्या कहना है - ये निर्विवाद तथ्य हैं: सिस्टम धीमी गति से चलता है जब उन्हें एक नया ऐप लॉन्च होने से पहले अपनी स्मृति प्राप्त करने के लिए कार्यों को मारना पड़ता है। आप बस मुझे यह नहीं बता सकते हैं कि किसी ऐप को मारने में समय नहीं लगता है! यहां तक कि दूर के तारों से प्रकाश समय लेने के लिए ... वहाँ है पूरी तरह से पास किए गए एप्लिकेशन के लिए उपयोगकर्ता की अनुमति देता है में कुछ का उपयोग।

2: कैसे कोर अनुप्रयोगों के विपरीत काम करते हैं? इसका क्या मतलब है? जब मैंने अभी के लिए एक ऐप चलाया है, तो यह अब कोई काम नहीं कर रहा है ... यह ओएस द्वारा मारे जाने की प्रतीक्षा कर रहा है जब इसकी स्मृति की आवश्यकता होती है।

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

यदि उपयोगकर्ता किसी ऐप को कम से कम करना चाहता है, तो सबसे अच्छी बात यह है कि इसे कम से कम करें। यदि कोई उपयोगकर्ता किसी ऐप से बाहर निकलना चाहता है, तो हर तरह से बाहर निकलना सबसे अच्छा है।

क्या इस पर ध्यान दिया जाता है? यह एंड्रॉइड का दृश्य है - वे इस पर भौंकते हैं। और कई स्वतंत्र रोकी एंड्रॉइड डेवलपर्स ने इस पर ध्यान केंद्रित किया।

लेकिन जब यह सही से नीचे आता है, तो अच्छी कोडिंग और खराब कोडिंग होती है। अच्छे प्रोग्राम फ्लो मॉडल हैं और खराब प्रोग्राम फ्लो मॉडल हैं।

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

यह आपकी कार की तरह है: ऐसे समय होते हैं जब आप इसे चलाना छोड़ देते हैं, जैसे स्टॉप लाइट पर रुकना, या शायद फास्ट फूड ड्राइव के माध्यम से, या एटीएम में रुकना। लेकिन ऐसी अन्य स्थितियां हैं, जहां आप इसे बंद करना चाहते हैं - जैसे कि जब आप काम करने के लिए मिलते हैं, या किराने की दुकान या घर भी।

इसी तरह, यदि आप एक गेम खेल रहे हैं और फोन बजता है, तो हाँ। खेल को रोकें और इसे चालू रखें। लेकिन अगर उपयोगकर्ता गेम के साथ थोड़ी देर के लिए किया जाता है, तो हर तरह से उन्हें बाहर निकलने दें।

कुछ अनुप्रयोगों पर बाहर निकलने का बटन दूसरों की तुलना में अधिक सामने होना चाहिए। उदाहरण के लिए, खेल, या ऐसे कार्यक्रम जहाँ उपयोगकर्ता पूरी तरह से बाहर निकलना चाहते हैं, एक स्पष्ट निकास होना चाहिए। अन्य कार्यक्रम, जैसे, शायद, ईमेल प्रोग्राम, जहां बाहर निकलना एक असंभावित इच्छा है (ताकि यह ईमेल के लिए जाँच रख सके) - इन कार्यक्रमों में एग्जिट विकल्प के साथ प्राइम कंट्रोल इनपुट स्क्रीन स्पेस को बर्बाद नहीं करना चाहिए, लेकिन अच्छे प्रोग्राम प्रवाह के लिए, यह बाहर निकलने का विकल्प होना चाहिए। क्या होगा अगर कोई तय करता है कि वे अपने मेल प्रोग्राम को ईमेल की जांच करने की कोशिश नहीं करना चाहते हैं जब वे खराब कवरेज क्षेत्र में हैं, या शायद स्काइप कॉल में या जो भी हो? यदि वे चाहें तो उन्हें ईमेल प्रोग्राम से बाहर निकलने दें!

निलंबित करना और बाहर निकालना दो महत्वपूर्ण कार्य हैं और न ही दूसरे की भूमिका को पूरा करते हैं।


2
"अगर उपयोगकर्ता किसी ऐप को कम से कम करना चाहता है, तो सबसे अच्छी बात यह है कि इसे कम से कम किया जाए। यदि कोई उपयोगकर्ता किसी ऐप से बाहर निकलना चाहता है, तो हर तरह से बाहर निकलना सबसे अच्छा है।" - एक चीज है (उस दशक के अनुभव के आधार पर): उपयोगकर्ता शायद ही कभी जानते हैं, कि वे क्या चाहते हैं। यदि आप उनकी मदद नहीं करते हैं, तो आपको इसे बदलना होगा। ऊपर के नमूनों के बारे में: मुझे आपको अन्य नमूने देने चाहिए: आप एक कार पर काम कर रहे हैं और चीजों के लिए हाथ में एक टेबल है। क्या आप हमेशा सभी आवश्यक साधनों को कैबिनेट में रखने के लिए सही जगह पर रखते हैं या सबसे अधिक उपयोग किए जाने वाले सामान को हाथ में रखते हैं? और बस एक बड़ा लेट इस्तेमाल किया हुआ एक नए के लिए जगह है?
20

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

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

वास्तव में मैं अपने विंडोज मशीन में प्रोग्राम बंद नहीं करता हूं, मेरे पास 32 जीबी रैम है, मैं बस सब कुछ छोड़ देता हूं, जब मैं अपना काम पूरा करता हूं तो मैं उन्हें बंद कर देता हूं। कार्यक्रम को बंद क्यों करें, इसे 5 मिनट बाद फिर से खोलने के लिए, इसका कोई मतलब नहीं है। एक बड़ी सी ++ परियोजना के बारे में सोचो जो उत्तरदायी बनने के लिए 2min लेता है, मैं सिर्फ Visual Studio को हमेशा के लिए खुला छोड़ देता हूं। और मुझे उम्मीद है कि खुले होने के 15 दिनों तक भी यह दुर्घटना नहीं होगी (और हां, मैं इसके लिए ईसीसी मेमोरी का उपयोग करता हूं)।
लुइज़ फेलिप

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

19

मुझे लगता है कि बिंदु यह है कि जब तक आपके पास छोटी गाड़ी का सॉफ्टवेयर नहीं है, ऐप को छोड़ने की कोई आवश्यकता नहीं है। जब उपयोगकर्ता इसका उपयोग नहीं कर रहा है और डिवाइस को अधिक मेमोरी की आवश्यकता है, तो एंड्रॉइड ऐप को क्विट करता है। यदि आपके पास एक ऐसा ऐप है जिसे पृष्ठभूमि में सेवा चलाने की आवश्यकता है, तो आप संभवतः सेवा को बंद करने का एक तरीका चाहते हैं।

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

यदि आपके पास कोड है जो बाहर निकलने पर चलता है, तो आप onPause (), onStop (), या onDestroy () को उचित रूप से ओवरराइड कर सकते हैं। http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle


5
मेरे द्वारा खोजी गई अन्य गन्दी चीजों के साथ, मुझे लगता है कि एंड्रॉइड के लिए हमारे ऐप को विकसित करने से कुछ होने वाला नहीं है। इसका बहुत अधिक "बड़ा भाई" है, जो एंड्रॉइड मुझे बता रहा है कि कौन सा ऐप चल रहा है या नहीं। एक प्रोग्रामर के रूप में मेरे पास वह विकल्प होना चाहिए, न कि google या android = (
Ted

3
आपकी गतिविधियाँ - सक्रिय उपयोगकर्ता इंटरफ़ेस - जब कोई अन्य एप्लिकेशन शीर्ष पर आता है, तो चले जाते हैं या आप पीछे या जो कुछ भी दबाते हैं। उपयोगकर्ता उनके साथ बातचीत नहीं कर रहा है, इसलिए उपयोगकर्ता को लंबे समय तक वापस नहीं आने की स्थिति में सहेजना सबसे सुरक्षित है, और इसी तरह, जैसा कि आप जानते हैं। Serviceपृष्ठभूमि में हो रहे काम को जारी रखने के लिए हालांकि डेटा पुश करने या जो कुछ भी हो, आपको लिखने से कुछ भी नहीं रोक रहा है। जब आप किसी अन्य एप्लिकेशन का उपयोग कर रहे हों तो Google टॉक काम करना बंद नहीं करता है। संगीत खिलाड़ी के साथ भी। दूसरे ऐप्स देखें कि वे कैसे काम करते हैं।
क्रिस्टोफर ऑर

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

1
मैं सोच सकता हूं कि कोई उपयोगकर्ता कुछ वास्तव में संसाधन गहन अनुप्रयोगों को छोड़ना चाह सकता है। हो सकता है कि इसे रोक दिए जाने पर संसाधनों के उपयोग को कम कर दिया जाए, लेकिन यह हमेशा संभव नहीं हो सकता है
केसबैश

1
यह प्रश्न अभी भी जीवित है, मैं इसे देखने के 4 साल बाद =) मैं इसे वास्तव में पृष्ठभूमि में एक सेवा के रूप में चलाता हूं, लेकिन मैंने छोड़-बटन जोड़ दिया है, क्योंकि मुझे अभी भी लगता है - 4 साल बाद - यह आवश्यक है और महत्वपूर्ण है। और मैं अधिक से अधिक ऐप देखता हूं, जिसमें वह भी है (उदाहरण के लिए स्काइप)।
टेड

19

यदि आप अपने डेटा / कनेक्शन (और इस प्रकार आपके "एप्लिकेशन") को लगातार बनाने में असमर्थ हैं, तो आप एंड्रॉइड के साथ क्या करने की "आवश्यकता" करने में असमर्थ होंगे।

जो लोग उन cutesy छोटे ऐप हत्यारों को डाउनलोड करते हैं वे आमतौर पर बैटरी जीवन या स्मृति उपयोग में मदद नहीं करते हैं, लेकिन ओएस को स्मृति प्रबंधन करने का काम करने से रोकते हैं ...

http://android-developers.blogspot.com/2010/04/multitasking-android-way.html


जब हम कार्य हत्यारों के बारे में बात कर रहे हैं, तो कुछ दिन पहले Android reddit पर एक बहुत ही ज्ञानवर्धक पोस्ट दिखाई दी। जिस्ट है, ध्यान से कार्य हत्यारों का उपयोग करें या आप वास्तव में अपनी बैटरी जीवन को नुकसान पहुंचा सकते हैं: reddit.com/r/Android/comments/cwhm6/…
नील ट्राफ

@ नील ट्रफ्ट, मुझे पोस्ट पर टिप्पणियाँ बहुत ज्ञानवर्धक लगीं। दुकानों में बिक्री प्रतिनिधि अपने ग्राहकों के लिए कार्य हत्यारों की सिफारिश और स्थापित कर रहे हैं :)
dipu

3
@, यह भी कैसे दूर से संभव है कि मैं एक ऐप को पूरी तरह से बाहर कर दूं जो मैंने एक हफ्ते के लिए एंड्रॉइड ओएस पर अपनी नौकरी के लिए किया है? तो वहाँ अधिक मुक्त स्मृति है। वह संभवतः Android में बाधा नहीं डाल सकता है! यह यकीन है कि बाद में चीजों को गति दे सकता है, हालांकि! अगर मुझे पता है कि मैं थोड़ी देर के लिए ऐप के साथ हूं, तो यह बिल्कुल कोई उद्देश्य नहीं है। यह केवल मेमोरी लेता है, और जितनी जल्दी या बाद में, मैं एक नया ऐप लॉन्च करूंगा और ओएस में एक और देरी होगी क्योंकि इसे कुछ ऐप को मारना होगा जो मुझे पता था कि WEEKS को पहले से पता था कि मेरे साथ किया गया था।
जेसी गॉर्डन

@ जेसे गॉर्डन, क्या आपने ऐप को मारने के बाद वास्तविक प्रक्रियाओं को देखा है? वे पुनः आरंभ हो जाते हैं, OS मान लेता है कि कोई समस्या थी ... स्मृति की आवश्यकता होने पर OS ऐप्स को मार देगा। क्या आपने यहां पर उल्लिखित लेखों में कुछ भी पढ़ा है?
दान

@, यह सोचने के लिए कि एंड्रॉइड ऐसा कुछ करेगा .... इसे वास्तव में कुछ गंभीर सफेद-धुलाई की पुन: शिक्षा की आवश्यकता है।
पचेरियर

18

मैं एडिसन-वेस्ले द्वारा प्रकाशित "एंड्रॉइड वायरलेस एप्लीकेशन डेवलपमेंट" को पढ़ने पर विचार करूंगा । मैं इसे पूरा कर रहा हूं और यह बहुत अच्छी तरह से है।

ऐसा प्रतीत होता है कि आपके पास Android प्लेटफ़ॉर्म की कुछ मूलभूत गलतफहमियाँ हैं। मैं भी एंड्रॉइड ऐप्स के एप्लिकेशन जीवन-चक्र के साथ पहले थोड़ा निराश था, लेकिन अधिक समझ में आने के बाद, मैं वास्तव में इस दृष्टिकोण का आनंद लेने के लिए आया हूं। यह पुस्तक आपके सभी सवालों का जवाब देगी और बहुत कुछ। यह वास्तव में सबसे अच्छा संसाधन है जो मैंने नए एंड्रॉइड डेवलपर्स के लिए पाया है।

इसके अलावा, मुझे लगता है कि आपको मौजूदा ऐप के लाइन-फॉर-लाइन पोर्ट से जाने देना होगा। अपने एप्लिकेशन को एंड्रॉइड प्लेटफ़ॉर्म पर पोर्ट करने के लिए, कुछ एप्लिकेशन डिज़ाइन को बदलने जा रहा है। उपयोग किए गए एप्लिकेशन-जीवनचक्र आवश्यक है, क्योंकि मोबाइल उपकरणों में डेस्कटॉप सिस्टम के सापेक्ष बहुत सीमित संसाधन होते हैं और एंड्रॉइड डिवाइस एक क्रमबद्ध और संसाधन-जागरूक फैशन में कई एप्लिकेशन चलाने की अनुमति देते हैं। प्लेटफ़ॉर्म के गहन अध्ययन में कुछ और करें, और मुझे लगता है कि आप महसूस करेंगे कि आप जो करना चाहते हैं वह पूरी तरह से संभव है। शुभकामनाएँ।

वैसे, मैं एडिसन-वेस्ले या इस पुस्तक से जुड़े किसी भी व्यक्ति या संगठन से संबद्ध नहीं हूं। मेरे पोस्ट को फिर से पढ़ने के बाद मुझे लगता है कि मैं एक छोटे से प्रशंसक बन गया। मैंने वास्तव में वास्तव में इसका आनंद लिया और इसे बेहद मददगार पाया। :)


2
पुस्तक की टिप के लिए धन्यवाद। यदि मैं कर सकता हूं और अगर मैं एंड्रॉइड पोर्ट पर स्थानांतरित करने का निर्णय लेता हूं, तो मैं इस पर एक नज़र डालूंगा। हालांकि इसे फिर से बताने के लिए: हमारे उपयोगकर्ता कंप्यूटर पर आने पर बहुत अद्यतित नहीं होते हैं। मैं उनके लिए Android में NotificationBar उदाहरण के लिए उपयोग करना बहुत कठिन होगा। बहुत छोटा (उनके पास बड़ी उंगलियां हैं)। उनके लिए इसकी एक अलग दुनिया है, इसलिए हमें इसे उपयोगकर्ता के लिए सरल और बिना विकल्प के रखने की आवश्यकता है। हमने अपने .NET-सॉल्यूशन को ध्यान में रखते हुए बनाया है - न कि उन्हें एक विकल्प दें =)
Ted

मैंने वह सुना। आपको यह मानकर चलना होगा कि अधिकांश उपयोगकर्ता बहुत अधिक तकनीक वाले नहीं हैं।
एंडी

8
मोबाइल डिवाइस में "कम" संसाधन के मंत्र से मैं बहुत थक गया हूं। जागो, वे 500Mhz पर चल रहे हैं और स्मृति का भार है। मेरे पुराने डेल एम्स में 128MB RAM था। मौजूदा उपकरणों में आमतौर पर 512RAM से अधिक और 1GHZ पर चल रहा है! यह मेरे पुराने पेंटियम 90Mhz की तुलना में 10 गुना अधिक है, और मैंने ppl को यह कहते हुए सुना कि यह "बहुत सीमित संसाधन" है और यह है। इसके जागने और कॉफी को सूंघने का समय - हम 2010 में अब 80 के दशक में हैं।
टेड

16

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

लेकिन यह कहा जा रहा है, जहां इच्छा है वहां एक रास्ता है। Android प्रदान करता है - android.os.Process वर्ग के माध्यम से अंतर्निहित प्रक्रिया को नियंत्रित करने के लिए जावा की तुलना में बहुत बेहतर एपीआई। और जावा के विपरीत यह डेवलपर को एक साधारण java.lang.System.exit () कॉल के पीछे छिपाकर एक मोरन की तरह व्यवहार नहीं करता है।

तो आप अपने आवेदन को एंड्रॉइड में आत्महत्या करने के लिए कैसे पूछते हैं? खैर, चाल सरल है:

मानक android.app.Application वर्ग से विरासत में प्राप्त करके अपना Android एप्लिकेशन वर्ग बनाएं (इसे AndroidManifest.xml फ़ाइल में घोषित करने के लिए याद रखें)।

ऑनक्रिएट () विधि को ओवरराइड करें, और अपना आवेदन शुरू करने वाले प्रोसेस आईडी को स्टोर करें:

this.pid = android.os.Process.myPid(); // Save for later use.

अब अपने आवेदन को मारने के लिए, एक मार () विधि प्रदान करें:

android.os.Process.sendSignal(pid, android.os.Process.SIGNAL_KILL);

अब जब भी आपको आत्महत्या करने के लिए अपने एप्लिकेशन की आवश्यकता होती है तो बस आवेदन के संदर्भ को टाइप करें, और अपनी मार विधि को कॉल करें!

((MySuicidalApp) context.getApplicationContext()).kill()

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


हां, मैं केवल यहां आया क्योंकि मैं अपने ऐप को एक स्थिति में बंद करना चाहता था क्योंकि यह समझ में आता है, मेरा ओबीबी डेटा कैश भ्रष्ट है और मुझे पूरे ऐप को पुनः आरंभ करने की आवश्यकता है
लुइज़ फेलिप

14

जब मैं एंड्रॉइड में एक एप्लीकेशन की कल्पना करता हूं, तो मैं इसे इस तरह से देखता हूं:

  • आप अपने आवेदन के साथ काम कर रहे हैं
  • फोन बज उठा
  • आप फोन ले लीजिए
  • कॉल के अंत में, आप उसी स्थान पर अपने आवेदन पर वापस आते हैं

ऐसा करने के लिए, आपको केवल अपने फोन के Backबटन या बटन की जरूरत Homeहै (या तो छोटी या लंबी प्रेस द्वारा) और सूचना पट्टी।

जब मैं अपने आवेदन से बाहर निकलता हूं, तो मैं केवल Backबटन का उपयोग करता हूं जब तक कि मैं इससे बाहर या बटन नहीं हूं Home

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

पीसी पर, आपके पास एक बहु-जीयूआई डेस्कटॉप है, और एंड्रॉइड पर, आपके पास स्पष्ट रूप से बहु-कार्य हैं, लेकिन आप केवल एक बार में एक ऐप प्रदर्शित करते हैं (मैं यहां विजेट्स पर विचार नहीं करता हूं ^ ^)। और मोबाइल फोन पर, किसी भी समय, आप जो कुछ भी कर रहे हैं उससे अधिक महत्वपूर्ण कुछ के लिए एक अधिसूचना हो सकती है।

तो एक आवेदन की पूरी अवधारणा कुछ अलग पर भरोसा करती है कि "आवेदन - कार्य - निकास आवेदन" दर्ज करें।


12

Hmmmm ...

मुझे लगता है कि आप अभी Android ऐप को सही तरीके से नहीं देख रहे हैं। आप कुछ ऐसा कर सकते हैं जो आप आसानी से चाहते हैं:

  • एप्लिकेशन गतिविधियों को सहेजें / पुनर्स्थापित करें जैसे कि यह डेवलपर लाइव साइकिल प्रलेखन में प्रोत्साहित किया गया है।

  • यदि पुनर्स्थापना चरण में कुछ लॉगिन की आवश्यकता है (कोई लॉगिन / सत्र जानकारी उपलब्ध नहीं है) तो इसे करें।

  • आखिरकार एक बटन / मेनू / टाइमआउट जोड़ें, जिस स्थिति में आप finish()लॉगिन और अन्य सत्र की जानकारी को सहेजे बिना कर देंगे , जिससे जाहिर तौर पर ऐप सत्र समाप्त हो जाएगा: इसलिए यदि ऐप को फिर से शुरू किया गया / लाया गया तो यह एक नया सत्र शुरू करेगा।

इस तरह से आपको वास्तव में परवाह नहीं है कि क्या ऐप वास्तव में मेमोरी से हटा दिया गया है या नहीं।

क्या तुम सच में स्मृति से निकालने के लिए चाहते हैं (यह क्या प्रयोजन के लिए हतोत्साहित किया जाता है, और BTW?) आप के अंत में सशर्त यह मार सकता है onDestroy()के साथ java.lang.System.exit(0)(या शायद restartPackage(..)?)। बेशक यह केवल उस स्थिति में करें जब आप "वास्तव में ऐप को समाप्त करना चाहते हैं", क्योंकि यह onDestroy()गतिविधियों के सामान्य जीवन चक्र का हिस्सा है और ऐप का अंत नहीं है।


11

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


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

3
@JesseGordon ने क्या कहा, और इस कारण से एक और पहलू कि छोड़ने का क्या मतलब है: अगर मैं इस संसाधन-गहन ऐप से बाहर नहीं निकलता हूं तो मुझे पता है कि मैं एक महीने के लिए फिर से उपयोग नहीं करने जा रहा हूं, ओएस कभी-कभी गलत तरीके से किसी अन्य ऐप को मार देगा जब संसाधन बेकार हो जाते हैं, तो इस बेकार संसाधन हॉग ऐप को छोड़ते हुए ... जिससे अन्य ऐप को फिर से शुरू करने में अधिक समय लगता है।
डॉन हैच

10

मैं टेड से सहमत हूं। मैं समझता हूं कि एप्लिकेशन से बाहर निकलना "एंड्रॉइड तरीका" नहीं है, लेकिन ऐसा नहीं लगता है कि इसे पहले ही बंद कर दिया जाना चाहिए। यहां तीन कारण बताए गए हैं कि आप आवेदन के लिए एक वास्तविक निकास चाहते हैं (केवल गतिविधि नहीं):

  1. उपयोगकर्ता कम मेमोरी के मामले में किस ऐप को मार देता है, इस पर कुछ नियंत्रण चाहते हैं। यदि महत्वपूर्ण ऐप A बैकग्राउंड में चल रहा है, तो हो सकता है कि जब आप ऐप ए के साथ काम कर रहे हों, तो आप ए से बाहर निकलें, ताकि ऐप ए ऑपरेटिंग सिस्टम द्वारा नहीं मारा जा सके।

  2. यदि आपके एप्लिकेशन में मेमोरी में कैश किया गया संवेदनशील डेटा है, तो आप ऐप को मारना पसंद कर सकते हैं ताकि वायरस / कृमि / बदमाश ऐप उस पर प्राप्त न कर सकें। मुझे पता है कि सुरक्षा मॉडल को रोकने के लिए माना जाता है, लेकिन सिर्फ मामले में ...

  3. यदि आपका एप्लिकेशन संसाधनों (जैसे नेटवर्क, सीपीयू, सेंसर, आदि) का उपयोग करता है जो फोन को प्रतिकूल रूप से प्रभावित कर सकता है, तो यह सुनिश्चित करने का एक तरीका है कि उन संसाधनों को मुक्त कर दिया गया है जो आवेदन से बाहर हैं। मैं समझता हूं कि अच्छी तरह से व्यवहार किए गए एप्लिकेशन को संसाधनों की आवश्यकता होने पर उन्हें मुक्त करना चाहिए। लेकिन फिर से, आवेदन से बाहर निकलना यह सुनिश्चित करने का एक उचित तरीका लगता है।


6
आपको क्या लगता है "एप्लिकेशन" का प्रतिनिधित्व करता है? अगर मैं फेसबुक ऐप खोलता हूं, और एक नया प्रोफ़ाइल पिक सेट करता हूं - मेरा कैमरा या गैलरी एप्लिकेशन शुरू हो जाते हैं। एक उपयोगकर्ता के रूप में, मैं अभी भी वही कार्य कर रहा हूं (फेसबुक का उपयोग करके)। अगर मैं फेसबुक बंद करने का फैसला करता हूं, तो मेरे कैमरा और गैलरी एप्लिकेशन को भी बंद करना होगा (क्योंकि वे फेसबुक से शुरू की गई गतिविधियां हैं) ... क्या होगा अगर मैं अपने कुछ अन्य चित्रों को संपादित करने के बीच में था और केवल फेसबुक बंद करने का इरादा था ? आपने समस्या को संभावित डेटा हानि में स्थानांतरित कर दिया होगा।
सीनहेजेस

खैर, मुझे नहीं लगता कि यह डेटा हानि के रूप में दूर जा सकता है। यदि आपके पास अपनी गतिविधि के समान कार्य में तृतीय-पक्ष गतिविधि चल रही है, और आपकी स्वयं की गतिविधि निकास बटन के साथ एक है, तो उपयोगकर्ता को finish()बाहर निकलने के बटन को हिट करने से पहले तीसरे पक्ष की गतिविधि करनी होगी । और तीसरे पक्ष की गतिविधि उस समय किसी भी सहेजे गए जानकारी को सहेजना चाहिए। मुझे नहीं लगता कि जब तक यह एक अलग कार्य में नहीं चल रहा है तब तक आप ऐप स्विचर का उपयोग एक्जिट बटन गतिविधि में वापस कर सकते हैं। और अगर यह एक अलग काम है, तो यह एक अलग प्रक्रिया है, और इसलिए बाहर निकलने के बटन से नहीं मारा जाएगा।
नील ट्राफट

2
1. मुझे लगता है कि 99.99% Android उपयोगकर्ताओं को इस बात की चिंता नहीं करनी चाहिए कि OS पर्दे के पीछे अनुप्रयोगों का प्रबंधन कैसे करता है। बाकी गीक्स हैं और उन्नत उपकरण पाएंगे जो सिस्टम को वैसा ही व्यवहार करना चाहिए जैसा वे चाहते हैं। 2. जब गतिविधि रुकी या बंद हो जाती है तो आप किसी भी संवेदनशील डेटा को हमेशा लोड कर सकते हैं। 3. ऊपर के समान, संसाधनों को जीवनचक्र कॉलबैक विधियों में मुक्त किया जा सकता है। जब गतिविधि फिर से शुरू होती है, तो संसाधनों को फिर से आवंटित किया जा सकता है।
Zsolt Török

4
मुझे लगता है कि इसके बजाय यह दिलचस्प है कि कई एंड्रॉइड उपयोगकर्ता "एडवांस टास्क किलर" स्थापित कर रहे हैं, एक ऐसा ऐप जो अन्य ऐप्स को बंद कर देता है क्योंकि आप सामान्य रूप से खुद नहीं कर सकते। मैं हर समय इसका इस्तेमाल करता हूं। एक ऐप छोड़ना ऐसा कुछ नहीं है जो मुझे लगता है कि आप बिना कर सकते हैं।
टेड

2
@ ZsoltTörök, 99.99% लोग धीमे कंप्यूटर / फोन के साथ सौदा करते हैं और इस बात से परेशान हो जाते हैं कि ओएस पर्दे के पीछे के अनुप्रयोगों का प्रबंधन कैसे करें।
पचेरियर

10

लिनक्स कर्नेल में एक सुविधा है जिसे आउट-ऑफ-मेमोरी किलर कहा जाता है (जैसा कि ऊपर उल्लेख किया गया है, नीतियां उपयोगकर्ताओं के स्तर पर कॉन्फ़िगर करने योग्य हैं और साथ ही कर्नेल एक इष्टतम नहीं है, लेकिन किसी भी तरह से अनावश्यक नहीं है)।

और यह एंड्रॉइड द्वारा अत्यधिक उपयोग किया जाता है:

कुछ यूजर्स ऐप इन किल ऐप्स की सहायता के लिए उपलब्ध हैं, उदाहरण के लिए:


9

आपको स्पष्ट रूप से वह उत्तर मिल गया है जिसे आप फिनिश () कमांड में चाहते हैं। यह आपके ऐप को मेमोरी से नहीं हटाएगा, लेकिन एंड्रॉइड ऐसा तब करेगा जब उसे संसाधनों की आवश्यकता होगी, इसलिए इससे कोई फर्क नहीं पड़ता कि आप स्पष्ट रूप से ऐसा नहीं कर रहे हैं।

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

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

यह दृष्टिकोण ऑपरेटिंग सिस्टम के हाथों में, एप्स को बंद करने सहित ओएस संसाधनों के प्रबंधन को छोड़ने के एंड्रॉइड के दर्शन का उल्लंघन किए बिना "निकास" कमांड होने के अपने लक्ष्य को पूरा करने की अनुमति देता है।

व्यक्तिगत रूप से, मैं इस दृष्टिकोण का उपयोग नहीं करूंगा, क्योंकि एंड्रॉइड उपयोगकर्ता एक ऐप की उम्मीद करते हैं कि जब वे इसे दोबारा जारी करते हैं, तो इसकी निरंतरता को बनाए रखने के लिए, और इसलिए उन्हें ऐप से "बाहर निकलने" के तरीके की आदत नहीं होती है। मैं इसके बजाय एक "स्पष्ट" फ़ंक्शन का समर्थन करूंगा जो उपयोगकर्ता इस प्रक्रिया में "छोड़ने" की आवश्यकता के बिना, कुछ डिफ़ॉल्ट प्रारंभिक स्थिति में ऐप को रीसेट करने के लिए आह्वान कर सकता है।

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

System.exit (0) के बारे में:

यदि आप अपने ऐप को अशिष्टता के साथ बंद करने के लिए system.exit (0) का उपयोग करने का निर्णय लेते हैं (जैसे, अंतिम बैक बटन प्रेस के परिणामस्वरूप), तो मैं आपको चेतावनी दूंगा कि यद्यपि मेरे लिए यह "काम करता है", और कुछ में मामलों का एकमात्र तरीका है कि मैं किसी ऐप को बिना किसी निशान के बंद करने में सक्षम रहा हूं, एक मामूली गड़बड़ है जो कि जेली बीन में होती है जब आप इस दृष्टिकोण का उपयोग करते हैं।

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

मुझे संदेह है कि इसका कारण यह है कि हाल की ऐप्स सूची आपके ऐप के संदर्भ में चल रही है, जो आपके द्वारा system.exit (0) का उपयोग करके ऐप को बंद करने के कारण गैर-कार्यात्मक हो गई है। फिनिश का उपयोग करते हुए आपके ऐप के एक अधिक सभ्य समापन ने ओएस को इस तरीके से सूचित किया होगा जिसने उसे अपनी हालिया ऐप्स सूची को ताज़ा करने की अनुमति दी होगी, लेकिन system.exit (0) जाहिरा तौर पर ऐसा नहीं करता है।

यह अपने आप में एक बहुत बड़ी समस्या नहीं है, क्योंकि बहुत कम लोग हाल के ऐप्स से कोई ऐप खोलेंगे, फिर उसे बाहर कर दें, और फिर उसी ओपन हाल के ऐप्स की सूची से इसे फिर से खोलें। और अगर वे होम बटन पर टैप करते हैं और फिर हाल के ऐप्स सूची को फिर से खोलते हैं , तो आपके ऐप की प्रविष्टि वहां होगी, और यह पूरी तरह कार्यात्मक होगा। लेकिन मुझे लगता है कि यह दर्शाता है कि system.exit (0) का उपयोग आपके ऐप और OS के बीच उचित संचार में हस्तक्षेप कर सकता है, और यह बताता है कि इस दृष्टिकोण का उपयोग करने के अन्य, अधिक गंभीर, संभवतः सूक्ष्म परिणाम हो सकते हैं।


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

9

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


मुझे पता है। Apple उत्पाद कुछ उपभोक्ताओं के लिए अच्छे हैं। वे डेवलपर्स के लिए अच्छे नहीं हैं। एंड्रॉइड ओएस में मोबाइल फोन के लिए "पीसी दुनिया की विंडोज ओएस" जैसा बनने की पूरी संभावना है। और भी बेहतर हो सकता है। यह पीसी दुनिया की खिड़कियों की तुलना में पहले से ही अधिक खुला है, सिवाय इसके कि हमें कार्य प्रबंधक लिखने की अनुमति नहीं है।
डिपु

7

एक (अपेक्षाकृत) सरल डिजाइन है जो आपको "बाहर निकलने" के आस-पास प्राप्त करने की अनुमति देगा। अपने ऐप को एक "आधार" राज्य (गतिविधि) बनाएं जो सिर्फ एक खाली स्क्रीन है। गतिविधि के पहले onCreate पर, आप एक और गतिविधि लॉन्च कर सकते हैं जो आपके ऐप की मुख्य कार्यक्षमता है। "निकास" को तब तक पूरा किया जा सकता है () इस दूसरी गतिविधि को पूरा करें और सिर्फ एक खाली स्क्रीन के आधार पर वापस जाएं। OS जब तक चाहे, इस खाली स्क्रीन को मेमोरी में रख सकता है ...

संक्षेप में, क्योंकि आप ओएस से बाहर नहीं निकल सकते हैं, आप बस एक स्व-निर्मित शून्य में बदल सकते हैं।


2
अच्छा विचार। हालांकि, यहां तक ​​कि एक गतिविधि (या सेवा) को पूरा करने से ओएस बंद नहीं होता है। अरे नहीं, भले ही onDestroy को सभी चर निष्पादित किए गए हैं और सामान अभी भी है। मैंने अभी देखा कि एक सेवा में, सब कुछ एक ही है, भले ही onDestroy कहा जाता है ...
Ted

2
... और इस प्रकार System.exit (0) ने मदद की =)
टेड

7

एप्लिकेशन डेवलपर के लिए अपने स्वयं के आवेदन को मारने के लिए एक निकास समारोह के बिना यह बहुत खराब डिजाइन है।

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


9
public void appRestart () {Intent i = new Intent (getBaseContext (), MyActivity.class); i.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity (i); }
androidworkz

2
यह उपरोक्त टिप्पणी का कोड वास्तव में अच्छी तरह से काम करता है। कम से कम आप ऐप से पूरी तरह से बाहर निकलने के बजाय पहली गतिविधि पर जा सकते हैं। :)
हरप्रीत

7

किसी भी बिंदु पर एक ऐप को बंद करने के लिए FLAG_ACTIVITY_CLEAR_TOPIntent और फिर फ्लैग का उपयोग करेंsystem.exit();

या इसी तरह का तरीका है, लेकिन system.exit()जब आप बाहर निकलना चाहते हैं तो इस तरीके से कॉल करें:

public void exit() {
    startActivity(new Intent(this, HomeActivity.class).
    setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK).putExtra(EXIT_FLAG, true));
}

आपके HomeActivity.onCreate()ऐड में निम्नलिखित कोड है

protected void onCreate(Bundle savedInstanceState) {
    if (getIntent().getBooleanExtra(EXIT_FLAG, false)) {
        if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
            finish();
        }
    }
......................

यह एंड्रॉइड जीवन-चक्र को तोड़ने के बिना काम करेगा।


7

सबसे पहले, कभी भी System.exit (0) का उपयोग कभी न करें। यह एक व्यक्ति को सोते समय सिर पर मुक्के मारने जैसा है!

दूसरा: मैं इस समस्या का सामना कर रहा हूं। अपना समाधान साझा करने से पहले मैं अपने विचार साझा करना चाहता हूं।

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

मुझे लगता है कि अगर आप सही समय और शर्तों पर सही काम (अपडेट, सेव और पुश) करते हैं तो एक अच्छा कोड लिखते हैं और सही चीजों (सर्विस और रिसीवर) का उपयोग करते हुए यह बहुत अच्छा काम करेगा और कोई भी शिकायत नहीं करेगा ।

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

मैंने प्रत्येक गतिविधि में हमेशा दिखाई देने वाला एक विकल्प मेनू बनाया (मैं एक सुपर गतिविधि है जो ऐसा करता है)।

जब उपयोगकर्ता उस बटन पर क्लिक करता है तो ऐसा होता है:

Intent intent = new Intent(this, DashBoardActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

SharedPreferences settings = getSharedPreferences(getString(PREF_ID), Context.MODE_PRIVATE);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean(FORCE_EXIT_APPLICATION, true);

  // Commit the edits!
editor.commit();
startActivity(intent);
finish();

इसलिए मैं SharedPreferences में बचत कर रहा हूं कि मैं अपने ऐप को मारना चाहता हूं, और मैं एक आशय शुरू करता हूं। कृपया उन झंडों को देखें; वे मेरे डैशबोर्ड गतिविधि को मेरी "घर" गतिविधि कहते हुए मेरे सभी बैकस्टैक को साफ़ कर देंगे।

तो मेरे डैशबोर्ड गतिविधि में मैं इस विधि को चालू करता हूं:

private void checkIfForceKill() {

    // CHECK IF I NEED TO KILL THE APP

    // Restore preferences
    SharedPreferences settings = getSharedPreferences(
            getString(MXMSettingHolder.PREF_ID), Context.MODE_PRIVATE);
    boolean forceKill = settings.getBoolean(
            MusicSinglePaneActivity.FORCE_EXIT_APPLICATION, false);

    if (forceKill) {

        //CLEAR THE FORCE_EXIT SETTINGS
        SharedPreferences.Editor editor = settings.edit();
        editor.putBoolean(FORCE_EXIT_APPLICATION, false);

        // Commit the edits!
        editor.commit();

        //HERE STOP ALL YOUR SERVICES
        finish();
    }
}

और यह बहुत अच्छी तरह से काम करेगा।

केवल एक चीज जो मुझे समझ नहीं आ रही है कि ऐसा क्यों हो रहा है कि जब मैं अंतिम फिनिश करता हूं (और मैंने जाँच की है: यह ऑनपॉन्ज के सभी सही प्रवाह का अनुसरण कर रहा है → onStop → onDestroy) एप्लिकेशन अभी भी हाल की गतिविधि पर है (लेकिन यह खाली है)।

यह नवीनतम इरादे की तरह लगता है (जो डैशबोर्डएक्टिविटी शुरू कर चुका है) अभी भी सिस्टम में है।

मुझे इसे हटाने के लिए और भी खुदाई करनी है।


8
बहुत से उपभोक्ताओं को पता नहीं है कि एक ओएस अकेले कैसे काम करता है, यह उन्हें बेवकूफ नहीं बनाता है। एक्जिट / क्विट / ऑफ बटन चाहने से वे सामान्य हो जाते हैं। जब आप एक कमरा छोड़ते हैं तो आप रोशनी बंद कर देते हैं, इससे भी महत्वपूर्ण बात यह है कि जब आप अपना घर छोड़ते हैं तो आप दरवाजे को बंद कर देते हैं और यहीं पर मुझे एक कार्यक्रम से बाहर निकलने में असमर्थता के साथ समस्या दिखाई देती है। कार्यक्रम को पृष्ठभूमि में जीवित रखना एक बड़ा सुरक्षा जोखिम है।
स्क्विगल्स

4
"मुझे लगता है कि एक" बाहर निकलें बटन "बेवकूफ है"। अधिकांश सॉफ्टवेयर एप्लिकेशन एक निकास बटन प्रदान करते हैं।
इगोरगानापोलस्की

आपने कहा "// यहां अपनी सभी सेवाओं को रोकें" और फिर समाप्त () का उपयोग किया। Android सेवाओं में फिनिश () विधि नहीं है। उनके पास unbindService (mConnection) है;
इगोरगानापोलस्की

@ प्रश्न यदि आपके पास एक कमरा है जो स्वचालित रूप से अपनी सभी लाइट बंद कर देता है और जब आप बाहर निकलते हैं तो अपने दरवाजे को बंद कर देते हैं, आपको इसकी देखभाल करने की आवश्यकता नहीं है।
शेषु विनय

7

एंड्रॉइड एप्लिकेशन जीवन चक्र मोबाइल फोन उपयोगकर्ताओं के लिए डिज़ाइन किया गया है, न कि कंप्यूटर उपयोगकर्ताओं के लिए।

एप्लिकेशन जीवन-चक्र क्रूर सरलीकृत प्रतिमान है जो एक लिनक्स सर्वर को उपभोक्ता उपकरण में बदलने के लिए आवश्यक है।

Android लिनक्स पर जावा है, एक वास्तविक क्रॉस-प्लेटफ़ॉर्म सर्वर ओएस है। यही कारण है कि यह इतनी जल्दी फैल गया। ऐप जीवन-चक्र ओएस की अंतर्निहित वास्तविकता को समाप्‍त कर देता है।

मोबाइल उपयोगकर्ताओं के लिए, एप्लिकेशन अभी स्थापित हैं या स्थापित नहीं हैं। दौड़ने या बाहर निकलने की कोई अवधारणा नहीं है। वास्तव में, ऐप प्रक्रियाएं तब तक चलने के लिए होती हैं जब तक ओएस उन्हें अपने आयोजित संसाधनों के लिए जारी नहीं करता है।

चूंकि यह स्टैक ओवरफ्लो है, इसलिए इसे पढ़ने वाला कोई भी कंप्यूटर उपयोगकर्ता है और मोबाइल ऐप जीवनचक्र को समझने के लिए अपने ज्ञान का 90% हिस्सा बंद करना होगा।


"कंप्यूटर उपयोगकर्ताओं को अपने ज्ञान का 90% बंद करना होगा" मैं आपकी छलांग का पालन नहीं करता हूं। हाँ, यही रोमेन गाइ कहता है, लेकिन यह सच नहीं है। ऐसा लगता है कि "कंप्यूटर उपयोगकर्ताओं के लिए उन्नत विकल्प" खंड, "छोड़ो" बटन के साथ, सभी की जरूरतों को पूरा करेगा।
डॉन हैच

मुझे नहीं पता कि यह "रोमैन गाइ" कौन है, या वह मुझे क्यों उद्धृत कर रहा है। हाल के कार्यों को बंद करने से ऐप बंद हो जाएगा, जैसा कि ऐप की जानकारी से बंद हो जाता है। ADB उन्नत उपयोगकर्ताओं के लिए शेल एक्सेस की अनुमति देता है।
डोमिनिक सेरिसानो

6

वास्तव में एक अर्ध-उचित एंड्रॉइड एप्लिकेशन जीवनचक्र को लागू करने की तुलना में मुझे इस प्रश्नोत्तर को पढ़ने में अधिक समय लगा।

यह एक जीपीएस ऐप है जो अंकों के लिए मतदान करता है और एक थ्रेड का उपयोग करके हर कुछ सेकंड में एक वेबसर्विस को वर्तमान स्थान भेजता है ... यह एक अपडेट के लिए टेड के मामले में हर 5 मिनट में मतदान हो सकता है, फिर ऑनस्पॉट बस अद्यतन गतिविधि शुरू कर सकता है। यदि कोई पाया गया था (एसिंक्रोनस टेड, तो विंडोज प्रोग्रामर की तरह कोड न करें या आपके प्रोग्राम विंडोज प्रोग्राम की तरह चलेंगे ... eww, यह उतना कठिन नहीं है)।

मैंने गतिविधि पर जीवन भर के लिए चीजों को स्थापित करने के लिए ऑन-क्रिएट में कुछ प्रारंभिक कोड दिया, जिनमें शामिल हैं checkUpdate.start();:

...

@Override
public void onStart() {
    super.onStart();
    isRemote = true;
    checkUpdate.resume();

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 0, luh);
}

@Override
public void onPause() {
    isRemote = false;
    checkUpdate.suspend();
    locationManager.removeUpdates(luh);
    super.onStop();
}

यह कोड पूरी तरह से गलत हो सकता है, लेकिन यह काम करता है। यह मेरे पहले Android अनुप्रयोगों में से एक है।

Voilà, ऐसा एप्लिकेशन जो सीपीयू का उपभोग नहीं करता है जब वह पृष्ठभूमि में होता है, फिर भी उसे फिर से खोलने के लिए तुरंत तैयार हो जाता है क्योंकि यह रैम में है (हालांकि रैम को एंड्रॉइड जीवनचक्र नहीं है) ... एक ऐप हमेशा तैयार रहता है, यह एक फोन है , दोस्तों / लड़कियों। यदि कोई एप्लिकेशन सभी RAM का उपयोग करना था और OS द्वारा बंद नहीं किया जा सकता था, तो बात बजना बंद हो सकती है = P यही कारण है कि OS को पृष्ठभूमि में होने पर आपके एप्लिकेशन को बंद करने में सक्षम होने की आवश्यकता होती है (यदि आपका एप्लिकेशन isn है 'एक संसाधन हॉग यह BTW बंद नहीं किया जाएगा), तो चलो बस बेहतर आवेदन लिखें।


आपको ऑनपॉज विधि से सुपर.ऑनटॉप नहीं कहा जाना चाहिए .. ऐसा लगता है कि यह चीजों को प्रमुखता से बिखेर देगा।
मैट वोल्फ

1
20 या इतने दार्शनिक जवाबों के माध्यम से पढ़ने के बाद कि केवल प्रश्न को चकमा देता है .... +1 कुछ कोड होने के लिए।
पचेरियर

6

हर बार जब आप इरादे से अगले पृष्ठ पर जाते हैं, तो उपयोग करें:

`YourActivityname.this.finish()`;

उदाहरण:

Intent intent = new Intent(getApplicationContext(), SMS.class);

startActivity(intent);
MainActivity.this.finish();

ताकि कोई भी गतिविधि पृष्ठभूमि पर न चले और जब आप अपने ऐप से बाहर निकलें , उपयोग करें:

MainActivity.this.finish();
android.os.Process.killProcess(android.os.Process.myPid());
System.exit(0);
getParent().finish();

यह बाहर निकलना मेरे लिए एक आकर्षण की तरह काम करता है :)


1
यह Mainactivity के बजाय ऐप से बाहर नहीं निकलता है।
शरथ

1
लेकिन सावधान रहें - ऑनपॉज () किलप्रोसेस और सिस्टम.एक्सिट के मामले में नहीं बुलाया गया है। हमें इससे कुछ समस्याएँ थीं।
पावेल बिरुकोव

4

किसी भी मामले में, यदि आप अपने आवेदन को समाप्त करना चाहते हैं तो आप हमेशा कॉल कर सकते हैं System.exit(0);


5
System.exit()यदि आपके पास स्टैक पर एक से अधिक गतिविधि हैं, तो अपने ऐप को न मारें। एक Android डेवलपर जो इसका उपयोग करता है, वह मूल एंड्रॉइड ऐप जीवन-चक्र को समझ नहीं पाया है। इस उत्तर को पढ़ें ।
धीरज वेपकोमा

के साथ पूर्ण समाधान System.exit(0); stackoverflow.com/questions/2033914/...
सोहेल जाहिद

2
दरअसल, System.exit () आपके ऐप को मारता है। हालाँकि, अगर System.exit () को मुख्य गतिविधि के अलावा किसी स्थान से बुलाया गया था, तो एंड्रॉइड स्टैक पर एक कम गतिविधि के साथ ऐप को पुनरारंभ करेगा। मेरे लिए जो एक स्वच्छ इरादे System.exit के लिए एक हास्यास्पद प्रतिक्रिया की तरह लगता है। मेरा मतलब है, अगर यह एक div0 या कुछ अनजाने में दुर्घटना थी, तो शायद यह फिर से शुरू करने के लिए विनम्र होगा। लेकिन वे भी ऑटो-री-लॉन्च का कारण नहीं बनते क्योंकि मुझे याद है। लेकिन किसी भी मामले में, ऐप को मार दिया जाता है। इसे फिर से शुरू किया जा सकता है, लेकिन इसका मतलब यह नहीं है कि यह मारा नहीं गया था।
जेसी गॉर्डन

3

यदि आपके पास 10,20 हैं .. एकाधिक गतिविधियाँ चल रही हैं और आप उन्हें समाप्त करना चाहते हैं और सिस्टम से बाहर निकल जाना चाहते हैं।

में एक स्थिर सरणी बनाएं application classयाconstants class.

स्थिरांक

public class Constants {

public static ArrayList<Activity> activities = new ArrayList<Activity>();

}

MainActivity इस सरणी में वर्तमान गतिविधि संदर्भ जोड़ें

activity = MainActivity.this; Constants.activities.add(activity);

public class MainActivity extends Activity {

    private ImageView imageButton;
    private Activity activity;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        activity = MainActivity.this;
        Constants.activities.add(activity);

        imageButton = (ImageView) findViewById(R.id.camera);
        imageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // existing app.
                if (Constants.activities != null) {
                    for (int i = 0; i < Constants.activities.size(); i++) {
                        Activity s = Constants.activities.get(i);
                        s.finish();
                    }
                }
                //super.finish();
                finish();
                android.os.Process.killProcess(android.os.Process.myPid());
                System.exit(1);
            }
        });
    }
}

1
यह आपके ऐप को तब क्रैश कर सकता है जब उपयोगकर्ता एक बटन को दो बार टैब करते हैं, खासकर जब सिस्टम किसी भी कारण से भारी लोड के तहत हो। यह सरणी से गतिविधियों को हटाकर रोका जा सकता है।
उम्मीद है कि
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.