2011-11-16 60 views
6

有問題的應用程序已被部署。我已經找到了關於ACRA的信息,並且將會添加這些信息以找出應用程序崩潰的原因。Android應用程序崩潰但不重新啓動 - 從應用程序中的其他位置恢復

然而,我的問題是,應用程序將崩潰(對話框將顯示給你的選項「強制關閉」或「等待」),但不是完全重新啓動應用程序,它從前一個點恢復發生了事故。然而,這會導致問題,只有通過重新啓動應用程序才能解決問題(例如突然丟失數據,無意義的崩潰等)。

那麼,我怎麼能強迫我的應用程序,一旦崩潰,剛剛結束? (不重新啓動)。

編輯:最大的問題是,在應用程序崩潰後,我的首選項文件中的所有數據都會消失,直到應用程序重新啓動時爲止。

+0

我相信您在這裏面對的是'ANR'或活動不是響應,這與應用程序崩潰(強制關閉)不同。應用程序中的某些操作似乎阻止主線程(UI線程)一段時間,這會提示此強制關閉/等待對話框。如果您選擇等待,則該應用程序在該操作完成的範圍內將保持無響應狀態。然後,該應用程序將恢復。但是,一旦你按下「強制關閉」,應用程序將關閉,並在下次訪問時重新啓動。 – Abhijit

+0

這不是ANR的情況,有時會顯示「強制關閉」或「等待」,這是UI線程被阻塞,但有時它只是一個「強制關閉」,所以應用程序實際上已經崩潰。應用程序不會一直關閉 - 在某些平臺上它會關閉,但在其他平臺上,它只是從以前的點開始恢復,並且已經丟失了所有的優先數據。 – digerati32

回答

3

默認情況下,Android將重新啓動上次的活動活動。不要強迫它重新啓動,更好的策略是修復您的應用程序,這樣即使沒有數據可用,活動也不會崩潰或正常退出。如果您絕對依賴某些數據(意圖附加項目)並且沒有默認值,那麼如果它不可用,則可以致電finish()或啓動主/主活動。

另一種方法是在使用ACRA報告崩潰(我相信在ACRA的錯誤跟蹤器中有這個功能請求)後,讓您自己的默認異常處理程序重新啓動主要活動等。

+0

我想修復我的應用程序,但不幸的是它已經被部署了,而且我已經添加了ACRA來捕獲異常現在,但爲了萬一發生任何事情,我想強制退出應用程序。我檢查了ACRA並找不到該功能...我認爲它還沒有實施? – digerati32

+1

僅僅因爲它的部署並不意味着你不能修復它並重新部署它,人們會很樂意更新他們的應用程序來修復崩潰。 –

+0

取決於它是哪個操作系統版本(或者它是如何通過電話實現的),它將在應用程序崩潰時關閉應用程序。即使使用ACRA,我也無法找到強制關閉應用程序的方法。你可以做的最多的事情是與ACRA目前發生的一次「安靜」的碰撞,所以沒有對話出現。 我已經添加了ACRA安裝的更新,所以我希望能夠得到崩潰的原因,然後我可以修復它們。我只是想把你的問題標記爲正確的,因爲它最接近正確的答案......儘管沒有答案。 – digerati32

1

我知道這個問題是有點老了,但對於未來的參考和Google,這裏是從另一個完整的答案,很難找到,計算器問題:Android App Restarts upon Crash/force close


創建用於處理unCaughtException

public class MyExceptionHandler implements 
     java.lang.Thread.UncaughtExceptionHandler { 
    private final Context myContext; 
    private final Class<?> myActivityClass; 

    public MyExceptionHandler(Context context, Class<?> c) { 

     myContext = context; 
     myActivityClass = c; 
    } 

    public void uncaughtException(Thread thread, Throwable exception) { 

     StringWriter stackTrace = new StringWriter(); 
     exception.printStackTrace(new PrintWriter(stackTrace)); 
     System.err.println(stackTrace);// You can use LogCat too 
     Intent intent = new Intent(myContext, myActivityClass); 
     String s = stackTrace.toString(); 
     //you can use this String to know what caused the exception and in which Activity 
     intent.putExtra("uncaughtException", 
       "Exception is: " + stackTrace.toString()); 
     intent.putExtra("stacktrace", s); 
     myContext.startActivity(intent); 
     //for restarting the Activity 
     Process.killProcess(Process.myPid()); 
     System.exit(0); 
    } 
} 

然後在每一個線程(通常你只有一個,除非你開始一個新的線程(異步或...着,當然你知道線程,如果你能做出新的;)),設置這個類作爲DefaultUncaughtExceptionHandler

Thread.setDefaultUncaughtExceptionHandler(new MyExceptionHandler(this, 
      YourCurrentActivity.class)); 

但請記住! 在開發應用程序的最後一步中,您必須至少嘗試處理所有例外情況,然後再將它們留給DefaultUncaughtExceptionHandler

+0

我們需要兩個ACRA以及重新啓動整個應用程序 –