लॉन्चर में आइकन प्रेस द्वारा लॉन्च किए जाने पर ऐप पूरी तरह से पुनरारंभ होता है


80

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

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

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


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

क्या आप स्टैकट्रेस या लॉग प्रदान कर सकते हैं?
TryTryAgain

2
नहीं, यह केवल तब होता है जब मैं ऐप के रिलीज़ संस्करण का उपयोग करता हूं, इसलिए मेरे पास स्टैकट्रेस या लॉग नहीं है।
LayfieldK

3
मेरे पास एक ही मुद्दा है, क्या आपने कभी ठीक किया? या कारण? या यहां तक ​​कि डिवाइस को पुनरारंभ करने के बाद व्यवहार को फिर से बनाने में सक्षम होने के लिए? - btw मैं भी बल रोक दिया है एप्लिकेशन को रोकने के व्यवहार को साफ करता है
कासिम

2
इस मुद्दे के लिए एक मान्य उत्तर यहां पाया जा सकता है: stackoverflow.com/questions/19545889/…
Mythul

जवाबों:


59

मुझे एक आवेदन के साथ एक ही समस्या थी और मैंने आपके AndroidManifest.xml फ़ाइल की घोषणा के "android:launchMode="singleTop""बजाय ध्वज जोड़ने के इस व्यवहार को हल किया । आशा है कि यह किसी की मदद करेगा।"android:launchMode="singleTask""<activity>


3
यह दृष्टिकोण खतरनाक है अगर हम अलग-अलग डेटा के साथ एक ही गतिविधि को दो बार खोलना चाहते हैं।
हकरोग्लू

6
यदि आप एक ही गतिविधि को विभिन्न डेटा के साथ खोलना चाहते हैं, तो आप इसे onNewIntent () में संभाल सकते हैं।
टैस

मैंने यह भी पाया कि अगर मैं अभी android:launchModeपूरी तरह से हटाए गए विशेषता को काम करता हूं । सुनिश्चित नहीं है कि यह "मानक" के लिए चूक है, लेकिन कोई भी विचार सहायक होगा। मुझे यह बहुत अच्छा लगा लेकिन मुझे देर हो गई इसलिए यह मेरे लिए अभी एक विदेशी भाषा की तरह लग रहा है: inthecheesefactory.com/blog/…
जोशुआ पिंटर

नमस्ते, क्या मुझे अपनी सभी गतिविधियों के लिए android: launchMode = "singleTop" जोड़ना चाहिए?
jmarkstar

यह मेरे मामले में काम नहीं किया। मेरे ऐप में किसी चीज़ का लिंक बनाने और साझा करने के लिए मेरी कार्यक्षमता है। यदि ऐप पृष्ठभूमि में है और यदि उपयोगकर्ता साझा लिंक पर क्लिक करता है, तो यह ऐप का एक नया उदाहरण खोलता है यदि मेरा लॉन्चमोड 'सिंगलटॉप' या 'सिंगलइंस्टेंस' पर सेट है।
Tech_human

33

अब तक मुझे पता चला है कि यह एक मुद्दा है कि आप इसे अपने वास्तविक उपकरण में कैसे स्थापित करते हैं, विशेष रूप से:

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

यदि आप इसे निम्न विकल्पों में से एक का उपयोग करके स्थापित करते हैं, तो यह समस्या प्रकट नहीं होती है:

  1. Sdk / tools / टर्मिनल या कमांड प्रॉम्प्ट का उपयोग करके फिर टाइप करें

    adb install <FILE PATH OF .APK FILE>
    

    लिनक्स में, टाइप करें:

    ./adb install <FILE PATH OF .APK FILE>
    
  2. बस ग्रहण से अपनी परियोजना चलाएं।

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

अपडेट करें:

मुझे एक उपाय सूझा। इन दो चरणों का पालन करें:

  1. गतिविधि टैग के अंदर AndroidMainifest.xmlandroid:launchMode="singleTask" = true में अपने एप्लिकेशन की सभी गतिविधियों के लिए सेट करें ।
  2. इस कोड को अपने लॉन्चर एक्टिविटी में डालें onCreate()

    if (!isTaskRoot())
    {
        final Intent intent = getIntent();
        final String intentAction = intent.getAction(); 
        if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN)) {
            finish();
            return;       
        }
    }
    

यह व्यवहार Android में एक बग है। कोई विशेष मामला नहीं।


2
मुझे इसकी सिफारिश नहीं करनी है। लॉन्चमोड को केवल सेट नहीं किया जाना चाहिए। इसका एक उद्देश्य होना चाहिए क्योंकि यह अजीब व्यवहार (अनुभवों से बाहर बात करना;) का कारण बन सकता है
लड़के

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

10

एक और अजीब कारण, पुनरारंभ केवल तब होता है जब एप्लिकेशन को कॉपी-टू-डिवाइस - & - इंस्टॉल करने के बाद "ओपेन" पर क्लिक करके लॉन्च किया गया था।

OS8.1 पर परीक्षण करें, कोई लॉन्च नहीं है गतिविधि में।

यहाँ छवि विवरण दर्ज करें


कोई उपाय है?
अभय कोरडिय़ा

7

आप AndroidMifestest.xml में लॉन्चर गतिविधि के लिए सिंगलटॉप के रूप में लॉन्चमोड का उपयोग कर सकते हैं

       <activity
        android:name="<YOUR_ACTIVITY>"
        android:label="@string/app_name"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

5
 // To prevent launching another instance of app on clicking app icon 
        if (!isTaskRoot()
                && getIntent().hasCategory(Intent.CATEGORY_LAUNCHER)
                && getIntent().getAction() != null
                && getIntent().getAction().equals(Intent.ACTION_MAIN)) {

            finish();
            return;
        }

setContentView को कॉल करने से पहले अपनी लॉन्चर गतिविधि में उपरोक्त कोड लिखें। इससे समस्या का समाधान हो जाएगा


3

यह एंड्रॉइड में डिफ़ॉल्ट व्यवहार है। डिबग बिल्ड के लिए यह किसी कारण से अलग तरीके से काम करता है। इसे android:launchMode="singleInstance"गतिविधि से जोड़कर हल किया जा सकता है , आप आइकन से लॉन्च करने के बाद पुनः आरंभ करना चाहते हैं।


3

इसे अपनी पहली गतिविधि में जोड़ें:

if (!isTaskRoot()) {
        finish();
        return;
}     
super.onCreate(savedInstanceState);

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

2

android:alwaysRetainTaskStateनिम्न उदाहरण में दिखाए अनुसार उपयोग करने का प्रयास करें :

<activity
    android:name="com.jsnider.timelineplanner.MainActivity"
    android:alwaysRetainTaskState="true"
    android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

2

मेरे लिए, मैंने पाया कि मैंने गलती NoHistory = trueसे अपनी गतिविधि विशेषता में पोस्ट किया था

[Activity(NoHistory = true, ScreenOrientation = ScreenOrientation.Landscape)]

इस एप को इस गतिविधि में फिर से शुरू करने और फिर से शुरू करने से रोका गया


1

आप android:alwaysRetainTaskState="true"Androidmanifest.xml में अपनी लॉन्चर गतिविधि के लिए सेट करने का प्रयास कर सकते हैं ।

    <activity
        android:name=".YourMainActivity"
        android:alwaysRetainTaskState="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

विवरण के लिए आप https://developer.android.com/guide/topics/manifest/activity-element.html##ways देख सकते हैं


1

मैं 2019 में एंड्रॉइड टीवी पर इस मुद्दे को देखता हूं। क्या इसके लिए एक बेहतर निर्धारण है? के अलावा अन्य

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

यह काम करता है लेकिन वास्तविक समाधान की तुलना में हैक की तरह दिखता है।


0

उपरोक्त सभी समाधान मेरे सभी उपकरणों पर लगातार काम नहीं करते थे। इसने कुछ सैमसंग पर काम किया लेकिन सभी नहीं।

मेरे लिए समस्या का कारण मैन्युअल रूप से एपीके स्थापित करना था।


0

मेरे लिए फिक्स LaunchMode = LaunchMode.SingleTopमुख्य गतिविधि पर मेरी गतिविधि विशेषता को जोड़ रहा था :

/// <summary>
    /// The main activity of the application.
    /// </summary>
    [Activity(Label = "SilhuettePhone",
        Icon = "@drawable/icon",
        Theme = "@style/MainTheme",
        MainLauncher = true,
        ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation,
        ScreenOrientation = ScreenOrientation.Portrait,
        LaunchMode = LaunchMode.SingleTop,
        WindowSoftInputMode = SoftInput.AdjustResize)]

-1

जब आप एंड्रॉइड में बैक बटन दबाते हैं, तो onDestroyविधि को लागू किया जाता है (जैसा कि होम बटन दबाने का विरोध किया जाता है, जहां केवल onPause()विधि लागू होती है)।

यदि आपको अपने ऐप को जारी रखने की आवश्यकता है, जहां इसे छोड़ दिया गया है, तो अपनी onDestroy()विधि में ऐप की स्थिति को सहेजें और उस स्थिति को onCreate()विधि में लोड करें ।


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