2011-03-24 53 views
9

我想學習和Android的測試例外,似乎無法 獲取信息過去的try/catch,Thread.currentThread()。setUncaughtExceptionHandler(新MyExceptionHandler())和ACRA。Android上的異常處理和生命週期?

基本上我想知道拋出Exception時會發生什麼,它是否只會殺死當前活動?如果我的應用程序有多個活動並且它在活動堆棧中的第四個活動中被殺死了,它會幹掉它嗎?

我問,主要是因爲我拋出一個錯誤,它不是殺死完整的程序,但在程序的某個中間活動重新啓動它。 (我這樣做的目的是爲了更多地瞭解它)我寧願程序死亡,也不願意在某種不良狀態下重新啓動,但 Android沒有殺死開關(至少我知道)。

感謝

編輯:Android是否重新創建堆棧,我們知道它會走多遠?或者如果它使用創建?或恢復?如果堆棧中以前的活動需要用戶輸入會怎麼樣?

回答

2

我已經從logcat中觀察到的是Android的排序緩存的意圖,並試圖重新構建你的籌碼從這些。我的意思是說,你的活動堆棧包括活動A,B,C,D(頂部D,底部A),並在活動D中拋出異常。然後操作系統嘗試通過觸發A的意圖來重建堆棧,然後B,然後C.但我不知道這件事

+0

由於在傳統的桌面意義上沒有應用程序,這種行爲(如果它是正確的)將是非常合乎邏輯的。如果有一組幾乎獨立的活動,那麼當一個活動爆炸時,整套設備不需要可怕地死亡。這將類似於單個桌面應用程序降低整個系統。 – erichamion 2011-03-24 15:11:13

+0

我的問題是,在重建堆棧的過程中,它丟失了一些東西,並且它錯誤地重新創建了它。 (它不重新加載數據庫) – Totic 2011-03-24 18:00:17

+0

我相信,在重新創建活動時,會調用onCreate方法。是否有可能您的活動創建依賴於某些先前可用的數據,但在崩潰後不存在。我的意思是,早些時候我曾經將一個數據結構作爲靜態變量存儲在單例類中,並用它來創建我的活動。在崩潰之後,我看到有時數據結構不適用於我的活動,並且它被正確渲染 – pankajagarwal 2011-03-25 04:39:32

2

我的印象一直是Android框架打印出從捕獲的異常堆棧跟蹤然後重新啓動虛擬機的一切,但導致異常的活動。例如,在活動和背景粘滯服務運行中,我有一個未捕獲的空指針異常。 Android試圖重新啓動虛擬機並重新啓動粘性服務,但我錯誤地實現了該服務,以便始終查看啓動它的意圖,在重新啓動時爲NULL,從而導致第二個異常。

此外,至少在埃克萊爾以上,Android將嘗試重新啓動某些崩潰之後的服務,諸如在onStartCommand未捕獲的異常()。在這種情況下,將使用標誌START_FLAG_RETRY調用onStartCommand()。

一些洞察到這是在這裏:http://groups.google.com/group/android-developers/msg/0eb714f48d534443

2

Android有沒有殺死開關

你可以嘗試System.exit(INT),從Java SE,它可以殺死虛擬機。

如果android重新創建堆棧,我們知道它是否使用create?或恢復?

的onCreate被調用(見http://developer.android.com/images/activity_lifecycle.png

順便說一句,一個異常並殺死該程序,但ActivityManager重新啓動它。 如果以前的活動需要用戶輸入,前置Activity依賴於它,則應將其放入放入Intent的Bundle中,後者將啓動前置Activity,因爲系統在重新啓動時會保存Bundle並將其再次傳遞給Activity 。