ऐप फिर से शुरू होने के बजाय फिर से शुरू होता है


194

उम्मीद है कि कोई मेरी मदद कर सकता है, अगर समाधान नहीं, तो कम से कम एक व्यवहार के लिए स्पष्टीकरण।

समस्या:

कुछ उपकरणों पर, लॉन्चर आइकन को दबाने से वर्तमान कार्य फिर से शुरू हो जाता है, दूसरों पर इसका परिणाम प्रारंभिक लॉन्च के इरादे से निकाल दिया जाता है (प्रभावी रूप से ऐप को पुनरारंभ करना)। क्यों होता है ऐसा?

विस्तार:

जब आप "लॉन्चर आइकन" दबाते हैं, तो एप्लिकेशन सामान्य रूप से शुरू होता है - अर्थात, मेरा मानना ​​है कि, Activityएक्शन android.intent.action.MAINऔर श्रेणी के साथ एक इंटेंट आपके पहले नाम के साथ लॉन्च किया गया है android.intent.category.LAUNCHER। यह हमेशा मामला नहीं हो सकता है:

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

हालाँकि, चयनित अन्य उपकरणों पर अलग व्यवहार होता है:

  • मोटोरोला Xoom पर, जब आप लॉन्चर आइकन दबाते हैं, तो ऐप हमेशा शुरुआती लॉन्च की शुरुआत करेगा, Activityचाहे जो भी चल रहा हो। मुझे लगता है कि लांचर आइकन हमेशा "LAUNCHER" इरादे को शुरू करते हैं।

  • सैमसंग टैब 2 पर, जब आप लॉन्चर आइकन दबाते हैं, यदि आपने अभी ऐप इंस्टॉल किया है, तो यह हमेशा प्रारंभिक Activity(एक्सूम के रूप में ही) लॉन्च करेगा - हालांकि, इंस्टॉल होने के बाद डिवाइस को पुनरारंभ करने के बाद, लॉन्चर आइकन बदलेगा ऐप को फिर से शुरू करें। मुझे लगता है कि ये डिवाइस डिवाइस स्टार्टअप पर लुकिंग टेबल में "इंस्टॉल किए गए एप्लिकेशन" जोड़ते हैं जो लॉन्चर आइकन को सही ढंग से चलने वाले कार्यों को फिर से शुरू करने की अनुमति देते हैं?

मुझे लगता है कि कई जवाब पढ़ा है ध्वनि मेरी समस्या के समान लेकिन बस जोड़ने android:alwaysRetainTaskState="true"या का उपयोग कर launchMode="singleTop"के लिए Activityइस सवाल का जवाब नहीं हैं।

संपादित करें:

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


1
यह पूछने के लिए एक तुच्छ प्रश्न की तरह लग सकता है, लेकिन क्या आपने Xoom के लिए अपने विकसित विकल्पों में "गतिविधियों को सही न रखें" सेट किया है?
एंड्रयू स्कस्टर

नहींं (मैं कामना करता हूं! :)) - मैंने पृष्ठभूमि में प्रत्येक गतिविधि और गतिविधियों के जीवनचक्र को अभी भी उपलब्ध के रूप में लॉग इन किया है (वे बंद हो गए - नष्ट नहीं हुए)। ओएस finish()उन्हें उन उदाहरणों में कॉल करने लगता है जहां यह Activityउन्हें फिर से शुरू करने के बजाय पहले फिर से शुरू करता है।
ग्रीम

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

2
नहींं - मैं ऊपर बताई गई समस्या के बारे में निश्चित हूं। एप्लिकेशन को पृष्ठभूमि में रखने के लिए घर का उपयोग करना (वापस नहीं, जो आप सही हैं) () गतिविधि। यह Xoom पर संभव है कि टास्क लिस्ट से ऐप को फिर से शुरू करें (सिर्फ लॉन्चर से नहीं) इसलिए बैकस्टैक निश्चित रूप से नहीं मारा गया है।
ग्रीम

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

जवाबों:


238

आपके द्वारा अनुभव किया जा रहा व्यवहार एक समस्या के कारण होता है जो एपीआई 1 के बाद से कुछ एंड्रॉइड लॉन्चर में मौजूद है। आप बग के बारे में विवरण और संभावित समाधान यहां पा सकते हैं: https://code.google.com/p/android/issues/ विवरण? आईडी = 2373

यह सैमसंग के उपकरणों के साथ-साथ अन्य निर्माताओं पर एक अपेक्षाकृत आम मुद्दा है जो एक कस्टम लांचर / त्वचा का उपयोग करते हैं। मैंने स्टॉक एंड्रॉइड लॉन्चर पर होने वाली समस्या को नहीं देखा है।

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

इस समस्या को हल करने के लिए मैंने जिस समाधान को लागू करने के लिए चुना है, वह है प्रारंभिक इरादे शुरू करने वाले इरादे में Intent.CATEGORY_LAUNCHER श्रेणी और Intent.ACTION_MAIN कार्रवाई की जाँच करना। यदि वे दो झंडे मौजूद हैं और गतिविधि कार्य के मूल में नहीं है (जिसका अर्थ है कि ऐप पहले से चल रहा था), तो मैं प्रारंभिक गतिविधि पर कॉल () समाप्त करता हूं। यह सटीक समाधान आपके लिए काम नहीं कर सकता है, लेकिन कुछ ऐसा ही होना चाहिए।

यहां मैं प्रारंभिक / लॉन्च गतिविधि के ऑनक्रिएट () में क्या कर रहा हूं:

    if (!isTaskRoot()
            && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
            && getIntent().getAction() != null
            && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

        finish();
        return;
    }

4
अब तक यह मेरे लिए काम करता है जिसके अब तक कोई प्रतिकूल प्रभाव नहीं हैं। तार्किक मान्यताओं के आधार पर, मुझे कोई कारण नहीं दिखता कि यह मान्य क्यों नहीं है।
javahead76

3
मुझे लगता है कि इस बग से निपटने का यह उचित तरीका है। मेरे लिये कार्य करता है।
सोकोलोव

3
मेरे लिए काम किया, लगभग 8 विभिन्न उपकरणों पर सत्यापित किया। बहुत बहुत धन्यवाद!
शैया अजनेर 15

3
WOOOOOW ने मेरी समस्या को ठीक कर दिया ive पिछले 2 घंटों से एक समस्या की तलाश कर रहा था
जीन रेमंड डाहर

2
धन्यवाद @ starkej2 एक जादू की तरह काम किया।
राजीव साहू

54

यह प्रश्न 2016 में अभी भी प्रासंगिक है। आज एक क्यूए परीक्षक ने एंड्रॉइड एम में स्टॉक लॉन्चर से फिर से शुरू करने के बजाय मेरा एक ऐप फिर से शुरू करने की सूचना दी ।

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

  1. प्ले स्टोर से डाउनलोड करें (या साइडेलोड एपीके)
  2. प्ले स्टोर डायलॉग से ऐप लॉन्च करें: गतिविधि A दिखाई देती है [कार्य स्टैक: A]
  3. गतिविधि B पर नेविगेट करें [कार्य स्टैक: A -> B]
  4. 'होम' बटन दबाएं
  5. एप्लिकेशन ड्रॉअर से ऐप लॉन्च करें: गतिविधि ए दिखाई देती है! [कार्य ढेर: ए -> बी -> ए] (उपयोगकर्ता गतिविधि 'बी' के लिए यहां से 'बैक' बटन दबा सकता है)

नोट: यह समस्या डिबग एपीके के लिए एडीबी के माध्यम से तैनात नहीं है, केवल प्ले स्टोर से डाउनलोड किए गए एपीके में या साइड-लोडेड है। बाद के मामलों में, चरण 5 से लॉन्च के इरादे में ध्वज Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONTनहीं था, लेकिन डिबग मामलों में नहीं था। ऐप को लॉन्चर से कोल्ड-स्टार्ट करते ही समस्या दूर हो जाती है। मेरा संदेह टास्क एक विकृत (अधिक सटीक, गैर-मानक) इरादे के साथ है, जो सही लॉन्च व्यवहार को रोकता है जब तक कि कार्य पूरी तरह से साफ नहीं हो जाता है।

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

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

मैंने इस उत्तर को प्रासंगिक पाया और अपनी रूट गतिविधि (ए) की 'ऑनक्रिएट' पद्धति में निम्नलिखित डाला ताकि उपयोगकर्ता द्वारा एप्लिकेशन को खोलने पर यह उचित रूप से फिर से शुरू हो जाए।

                    /**
     * Ensure the application resumes whatever task the user was performing the last time
     * they opened the app from the launcher. It would be preferable to configure this
     * behavior in  AndroidMananifest.xml activity settings, but those settings cause drastic
     * undesirable changes to the way the app opens: singleTask closes ALL other activities
     * in the task every time and alwaysRetainTaskState doesn't cover this case, incredibly.
     *
     * The problem happens when the user first installs and opens the app from
     * the play store or sideloaded apk (not via ADB). On this first run, if the user opens
     * activity B from activity A, presses 'home' and then navigates back to the app via the
     * launcher, they'd expect to see activity B. Instead they're shown activity A.
     *
     * The best solution is to close this activity if it isn't the task root.
     *
     */

    if (!isTaskRoot()) {
        finish();
        return;
    }

अद्यतन: गतिविधि को सीधे कार्य की जड़ में होने पर क्वेरी करने के इरादे के झंडे को दूर करने से इस समाधान को स्थानांतरित कर दिया। इरादे झंडे का अनुमान लगाना और परीक्षण करना अलग-अलग तरीकों से कठिन होता है, जिसमें MAIN गतिविधि खोलना है (घर से लॉन्च करें, 'अप' बटन से लॉन्च करें, Play Store से लॉन्च करें, आदि)


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

11
नोट: ऐप के Google Play पेज से "ओपन" का उपयोग करके, भले ही आपने इसे एंड्रॉइड स्टूडियो के माध्यम से एपीके इंस्टॉल किया हो , इसे शुरू करने के बाद आप इसे फिर से शुरू करने के बाद ("ठंडा-शुरू" करके) पुन: पेश करने के लिए मुद्दा प्राप्त कर सकते हैं । मुझे यह काम ठीक करने के लिए बहुत उपयोगी लगा।
ऊद

अच्छी व्याख्या!
karanatwal.github.io

इस स्पष्टीकरण के लिए धन्यवाद :)
AndroidEntharies

2
ऐसा बहुत सारे ऐप्स के साथ होता है। Google फ़ोटो एक प्रमुख है जिसे मैंने परीक्षण किया है।
रघुबंश मणि

19

अहा! (tldr; बॉटम में बोल्ड स्टेटमेंट देखें)

मुझे समस्या मिल गई है ... मुझे लगता है।

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

यदि वह दमन सही है, तो मुझे पूरा यकीन है कि बग होना चाहिए, यह देखते हुए कि प्रत्येक Taskएक ही प्रक्रिया में है और पहले बने एक फिर से शुरू होने वाले उम्मीदवार के रूप में मान्य है?

मेरी समस्या तब, इन झंडों को एक जोड़े से हटाकर तय की गई थी Intents:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK );

हालांकि यह बिल्कुल स्पष्ट है कि FLAG_ACTIVITY_NEW_TASKएक नया निर्माण होता है Task, मैंने इस बात की सराहना नहीं की कि उपरोक्त दमन प्रभाव में था। मैंने इसे एक अपराधी माना और इसे परीक्षण के लिए हटा दिया और मुझे अभी भी समस्या हो रही थी इसलिए मैंने इसे खारिज कर दिया। हालाँकि, मेरे पास अभी भी नीचे की शर्तें थीं:

i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)

मेरी स्प्लैश स्क्रीन Activityऊपर के झंडे का उपयोग करके मेरे ऐप में "मुख्य" शुरू कर रही थी । बाद में, अगर मैंने अपने ऐप को "रीस्टार्ट" कर लिया Activityथा और अभी भी चल रहा था, तो मैं इसके बारे में जानकारी रखना चाहूंगा।

आप दस्तावेज़ में देखेंगे कि यह नया शुरू करने का कोई उल्लेख नहीं करता है Task:

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

उदाहरण के लिए, गतिविधियों से मिलकर एक कार्य पर विचार करें: ए, बी, सी, डी। यदि डी एक गतिविधि के साथ स्टार्ट एक्टिविटी () कहता है जो गतिविधि बी के घटक को हल करता है, तो सी और डी समाप्त हो जाएगा और बी दिए गए इरादे को प्राप्त करेगा। जिसके परिणामस्वरूप स्टैक अब: ए, बी।

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

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

इसलिए, मेरे पास नीचे वर्णित स्थिति थी:

  • Aका शुभारंभ Bके साथ FLAG_ACTIVITY_CLEAR_TOP, Aखत्म।
  • Bकिसी सेवा को पुनः आरंभ करने की इच्छा रखने वाला उपयोगकर्ता को भेजता है Aजिसके पास सेवा पुनः आरंभ करने का तर्क है और UI (कोई झंडे) नहीं है।
  • ABFLAG_ACTIVITY_CLEAR_TOP के साथ लॉन्च हुआ, Aसमाप्त हुआ।

इस स्तर पर दूसरा FLAG_ACTIVITY_CLEAR_TOPध्वज फिर से शुरू हो रहा है Bजो कार्य स्टैक में है। मैं यह मान रहा हूं कि इसे नष्ट करना चाहिए Taskऔर एक नई शुरुआत करनी चाहिए , जिससे मेरी समस्या बढ़ जाएगी, जो कि मुझसे पूछने पर एक बहुत ही मुश्किल स्थिति है!

इसलिए, यदि मेरे सभी दमन सही हैं:

  • Launcherकेवल शुरू में बनाई गई टास्क शुरू
  • FLAG_ACTIVITY_CLEAR_TOPइच्छा है, अगर यह केवल शेष को पुनरारंभ करता है, तो Activityएक नया भी बनाएगाTask

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

2
मुझे लगता है कि इसका मतलब नहीं है - लेकिन परीक्षण और त्रुटि के माध्यम से मेरे उदाहरण में ऐसा होता है। इन झंडों को हटाने से समस्या ठीक हो जाती है।
ग्रीम

यह सभी परिस्थितियों में सभी उपकरणों पर एक सही फिर से शुरू नहीं बनाता है।
danny117

झंडे को हटाना मेरे लिए मुद्दा तय कर दिया। धन्यवाद
Sealer_05

मेरे पास छप स्क्रीन / मुख्य स्क्रीन परिदृश्य है, लेकिन मैं छप से मुख्य में संक्रमण के लिए किसी भी झंडे का उपयोग नहीं कर रहा हूं, फिर भी मुद्दा मेरे लिए प्रतिलिपि प्रस्तुत करने योग्य है - यह समाधान मेरे लिए काम नहीं कर रहा है।
रोर

12

सैमसंग उपकरणों पर मेरा भी यही मुद्दा था। बहुत खोज करने के बाद, इनमें से किसी भी उत्तर ने मेरे लिए काम नहीं किया। मैंने पाया कि AndroidManifest.xml फ़ाइल में, ( ) पर launchModeसेट है । विशेषता को हटाने से मेरा मुद्दा ठीक हो गया।singleInstanceandroid:launchMode="singleInstance"launchMode


वास्तव में, इसने मेरे लिए भी चाल चली। मुझे यह उत्तर एक और SO प्रश्न से सहायक होने के लिए मिला: stackoverflow.com/a/21622266/293280 । और यह विभिन्न प्रकार के launchModeमूल्यों को लिखता है
जोशुआ पिंटर

इस फिक्स ने मेरे लिए काम किया! इसे अभिव्यक्ति में नहीं बल्कि मुख्य गतिविधि वर्ग में गतिविधि विशेषता में जोड़ा गया।
कलिन वाल्सिन

@CalinVlasin क्या आप मुझे बता सकते हैं कि आपने लॉन्च का उपयोग कैसे किया? आपने इसे कहाँ रखा था? वर्तमान में मेरे पास यह ऐसा है लेकिन इसका मुद्दा है: <गतिविधि android: name = "। UI.landing.MyActivity" android: configChanges = "locale | layoutDirection" Android: launchMode = "singleTop" Android: windowSoftInputMode = "stateAlwaysHidden। समायोजन करें। ">
j2emanue

मेरी भी यही समस्या थी। मुझे लगता है कि यह स्वीकार किए जाते हैं जवाब के साथ संयोजन में इस्तेमाल किया जाना चाहिए (isTaskRoot ...
behelit

1

मेरी बिल्ली s60 पर, मैंने डेवलपर विकल्पों में "गतिविधियों को न रखें" को सक्षम किया था, इसको अक्षम करते हुए मुझे फिर से ऐप्स को खोए बिना ऐप्स को स्विच करने की अनुमति दी ...


पता नहीं कैसे, लेकिन यह मेरे डिवाइस पर चालू था।
रियलप्रो

0

इस समाधान ने मेरे लिए काम किया:

    @Override
    public boolean onKeyUp(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent startMain = new Intent(Intent.ACTION_MAIN);
            startMain.addCategory(Intent.CATEGORY_HOME);
            startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(startMain);
            return false;
        }
        else
            return super.onKeyUp(keyCode, event);
    }

क्रेडिट: मुझे बैक बटन क्लिक पर एंड्रॉइड एप्लिकेशन को छोटा करना होगा

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


दिलचस्प चाल लेकिन समस्या के रूप में हल नहीं करता है। हालांकि अन्य समस्याओं / प्रश्नों के लिए बहुत उपयोगी है।
ग्रीम

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

-1

मेरे पास एक ही समस्या थी, इसका कारण था:

(कोटलिन कोड, मेनएक्टिविटी में)

override fun onBackPressed() {
    finish()
}

इसलिए जब मैं अपने LoginActivity से अपने MainActivity में नेविगेट करता हूं तो मैं इसका उपयोग करता हूं:

    val intent = Intent(this, MainActivity::class.java)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(intent)

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


-2

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

कैसे हल करें

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

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


-8

अपने उपयोगकर्ताओं के लिए अनमोल। हाल ही में उपयोग किए गए ऐप सूची में हफ्तों बैठने के बाद भी एकदम सही फिर से शुरू।

यह उपयोगकर्ता के लिए एक फिर से शुरू की तरह दिखता है लेकिन वास्तव में एक पूर्ण विकसित शुरुआत है।

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

उदाहरण: onSaveInstanceState में वर्तमान कैमरा स्थिति को सहेजें बस एप को अनलोड किया गया है और हाल के ऐप्स की सूची से हफ्तों बाद फिर से चालू किया जाना है।

@Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        // save the current camera position;
        if (mMap != null) {
            savedInstanceState.putParcelable(CAMERA_POSITION,
                    mMap.getCameraPosition());
        }
    }



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

        // get the exact camera position if the app was unloaded.
        if (savedInstanceState != null) {
            // get the current camera position;
            currentCameraPosition = savedInstanceState
                    .getParcelable(CAMERA_POSITION);
        }

नोट: आप onRestoreInstanceStateविधि का उपयोग भी कर सकते हैं, लेकिन मुझे उदाहरण को पुनर्स्थापित करना आसान लगता है onCreate

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

शुभ लाभ


यह आम स्मृति चिंताओं या डिफ़ॉल्ट "पॉज़ राज्य" स्थितियों के कारण नहीं है। मैंने कई उपकरणों में अपना ऐप आज़माया है (कुछ बड़ी मेमोरी के साथ तो कुछ कम मेमोरी के साथ)।
ग्रीम

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

@ danny117 मुझे नहीं लगता कि आपको उस मुद्दे को समझने में कोई
दिक्कत

मैं ग्रीम का मुद्दा समझता हूं। ऐप को फिर से शुरू करने वाले कुछ उपकरणों पर ऑनक्रिएट करें। बिल्कुल मेरे HTC EVO (जिंजरब्रेड) की तरह लगता है जो स्क्रीन को घुमाने के लिए ऐप को मार देगा। दस्तावेज़ों को देखें, ऐसा लगता है कि एप्लिकेशन को
onCreate

@ danny117 यह सही है, लेकिन वह जो समस्या है, वह ऐप के फिर से शुरू होने पर (जो अपेक्षित है) फिर से शुरू होने वाली एकल गतिविधि से संबंधित नहीं है, लेकिन गलत गतिविधि शुरू हो रही है
starkej2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.