2013-04-20 72 views
41

我正在嘗試做我的第一個Android應用程序的發佈版本發送給幾個測試人員。但是,我遇到了一個問題。當您退出應用程序,然後通過圖標啓動應用程序重新輸入它時,它會重新啓動整個應用程序,而不是返回到之前的位置。即使您在退出後立即重新進入,也會發生這種情況。但是,如果我按住Home按鈕並通過最近的應用程序列表啓動它,則不會發生這種情況。應用程序完全重新啓動時啓動圖標按發射器

我在網上搜索了其他人有這個問題,有幾個,但沒有人有過堅實的答案,爲什麼發生在他們身上。在舊的問題中,已經提出將launchmode設置爲清單文件中的singletask或singleinstance,但這對我沒有幫助,而且 - 據我所知,android的默認行爲是返回到任務的前一個狀態在這種情況下,所以我不知道爲什麼我需要特殊的清單選項才能做到這一點。

這個問題最奇怪的是,如果我使用eclipse和調試器將應用程序放在手機上,則不會發生此問題。我甚至不需要連接到調試器,似乎只要我有應用程序的調試版本,問題就不會發生。但是如果我使用發佈版本(我使用Eclipse中的Android工具 - 導出簽名應用程序包菜單選項創建它),問題就會發生。 如果有人對導致這種情況的原因有所瞭解,我很樂意聽到你的想法。

+1

因此,顯然如果我重新啓動安裝該應用程序的設備,則此問題將不復存在。現在,這是很酷的一切,但在我的應用程序的情況下,如果用戶在下載電話之前重新啓動手機,它仍然會非常惱人。 – LayfieldK 2013-04-21 00:06:44

+0

你能提供一個堆棧跟蹤或日誌嗎? – TryTryAgain 2013-04-21 00:16:25

+1

不,它只發生在我使用該應用的發佈版本時,所以我沒有堆棧跟蹤或日誌。 – LayfieldK 2013-04-21 10:34:00

回答

26

我遇到了與應用程序相同的問題,我解決了此行爲,在您的AndroidManifest.xml文件的<activity>聲明中添加標記"android:launchMode="singleTop""而不是"android:launchMode="singleTask""。希望這會有助於某人。

+0

謝謝!它的工作原理 – gayavat 2016-09-05 20:21:00

+1

如果我們想用不同的數據打開兩次相同的活動,這種方法很危險。 – hkaraoglu 2016-11-08 08:10:50

+2

如果你想用不同的數據打開同一個活動,你可以在onNewIntent()中處理。 – Tasneem 2017-03-02 06:03:42

0

在Android中按下後退按鈕時,會調用onDestroy方法(與按下主頁按鈕相反,其中只有onPause()方法被調用)。

如果您需要繼續保留應用程序的位置,請在您的onDestroy()方法中保存應用程序的狀態,並在onCreate()方法中加載該狀態。

+1

我按主頁按鈕退出應用程序。 – LayfieldK 2013-04-21 10:33:24

3

這是Android中的默認行爲。對於調試版本,出於某種原因它的工作方式不同。它可以通過將android:launchMode="singleInstance"添加到活動中解決,您希望在從圖標啓動後重新啓動。

1

使用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> 
18

到目前爲止,我發現這是一個問題,根據您如何在實際的設備安裝,具體包括:

  1. 如果您只需將APK複製並粘貼到設備的本地存儲並從設備進行安裝,無論它是已簽名還是未簽名,或從bin文件夾中取出,都會顯示此行爲,應用程序將從菜單圖標重新開始。

如果安裝使用下列選項之一吧,這個問題不會出現:

  1. 轉到SDK /工具/使用終端或命令提示符,然後鍵入

    adb install <FILE PATH OF .APK FILE> 
    

    在Linux中輸入:

    ./adb install <FILE PATH OF .APK FILE> 
    
  2. 只需從Eclipse運行你的項目。

我很高興知道是否有任何可能的方式分發正確的APK用於beta測試。我已經嘗試導出已簽名的APK,因爲當您複製並粘貼APK並手動安裝時,它會顯示流氓行爲。

更新:

我發現了一個解決方案。按照這兩個步驟:

  1. 套裝android:launchMode="singleTask" = trueAndroidMainifest.xml您的應用程序的活動標籤內的所有活動。
  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的一個bug。不是特例。

+1

我不會推薦這個。 launchMode不應該被設置。它必須有一個目的,因爲它可能會導致奇怪的行爲(說出體驗;)) – Boy 2015-04-23 08:12:59

+0

如果你的應用程序支持Pin鎖等功能,當你想設置android:launchMode =「singleTask」時應該仔細對待它。 – 2015-08-13 03:51:16

+0

謝謝。你讓我今天一整天都感覺很好! – 2016-12-22 21:24:30

4

你可以在使用launchMode爲singleTop的啓動活動的AndroidManifest.xml

0

添加到您的第一項活動:

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

上述所有沒的解決方案」 t在我的所有設備上始終如一地工作。它適用於一些三星,但不是全部。

問題的原因是我手動安裝APK。

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)] 
0

你可以嘗試設置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#always

0
// 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之前。這將解決問題

相關問題