2014-11-04 157 views
8

我正在開發一個Android應用程序,正如預期的那樣,有些情況下我的代碼崩潰了(bug,空指針等)。當應用程序崩潰時會發生什麼?

當應用程序崩潰時,它會重新啓動自身,即使我沒有編寫任何代碼來執行它(我想這是默認行爲?!),但問題是,應用程序以不正確的狀態打開。

這裏是當應用程序啓動時什麼一般情況:

  • 最初,該應用程序帶有「閃屏」打開。該屏幕嘗試使用共享首選項中的持久性令牌對用戶進行身份驗證,並從服務器加載一些默認值並將其保留在某些服務中。
  • 根據登錄成功,它會轉到主屏幕或登錄屏幕。

當應用程序正常啓動,這一切工作正常,並如預期的那樣執行初始化序列但是當它重新啓動作爲碰撞的結果,將已經填充在啓動畫面片段中的值(例如作爲登錄用戶或從服務器加載默認值)都是無效的,這意味着它們從不執行。

這使我相信,應用程序重新啓動時的事件序列是完全錯誤的,即不是使用正確的活動重新啓動應用程序,而是在清單中指定爲啓動器,它似乎會錯誤地重新啓動事物並從錯誤的活動。

所以,這裏的問題是:什麼決定了我的應用程序應該在發生崩潰時自行重啓,以及決定應該如何啓動?當應用程序從崩潰中啓動時,是否有任何事件可以捕獲,以便我可以覆蓋初始化序列?有沒有辦法強制應用始終從啓動器活動開始?

提前許多感謝,

+1

只是添加一些信息,你可以通過調用:android.os.Process.killProcess(android.os.Process.myPid())來防止再次打開應用程序。 System.exit(0) 在全局Thread.UncaughtExceptionHanlder中。我不知道這是多麼正確(可能不多)。但我真的很想知道應用程序在這些場景中應該如何表現 – JML 2014-11-04 19:32:25

+0

非常感謝JML。這確實有幫助;不過,我應該提及,我並不特別介意重新啓動應用程序,我希望儘可能保持與Android生態系統的「標準方式」接近,這似乎是操作系統自動重新啓動應用程序。然而,我希望它在通過尊重啓動器標誌重新啓動時運行正確,或者至少讓我能夠覆蓋初始化序列。再次,非常感謝您的建議。 – kha 2014-11-04 19:36:09

回答

2

當活動重新啓動時,由於碰撞,如果運行前臺活動的過程中消失了,系統會扔掉的活動,如果沒有一個有效的保存狀態(通常意味着它已暫停,並且已從系統暫停之前將系統onSaveInstanceState的結果)。一旦系統決定是否放棄該活動,它將恢復現在堆疊頂部的任何活動。如果這是你的活動之一,或者因爲你有另一個墜毀的人,或者墜毀的人是某種穩定的暫停狀態,那麼系統會再次啓動你的過程以顯示最高的活動。您可以嘗試在AndroidManifest主要活動(啓動器活動)聲明中設置clearTaskOnLaunch="true",並在除主設備之外的其他活動中設置android:finishOnTaskLaunch ="true",然後查看是否會阻止應用程序在崩潰後的其他狀態下重新啓動。另一種方法是檢查您的活動重新啓動的位置,然後在起點檢查此活動是否具有所有需要的數據。如果它沒有全部所需的數據,則重定向到啓動器活動。希望這可以幫助。

+0

謝謝你的解釋。我嘗試了clearTaskOnLaunch方法,但對我不好。雖然應用程序確實會在發生崩潰時進入啓動器活動,但作爲更改的結果,它也會在恢復時進入啓動器活動(將應用程序最小化 - >轉到應用程序現在將我帶到登錄屏幕,而不是我想要)。第二種方法存在的問題是有超過20種不同的活動,其中一些嵌套深度較深。如果他們有他們所需要的,那麼在起點檢查所有這些將非常麻煩,但如果沒有其他選擇,我必須這樣做。 – kha 2014-11-05 07:58:43

相關問題