2012-11-30 81 views
3

我正在嘗試設置一個全局異常處理服務,如this answer中所述。這種方法聽起來很合邏輯,因爲崩潰後,我的自定義Thread.UncaughtExceptionHandler中的代碼可能無法成功執行,這可能是因爲應用程序可能不處於穩定狀態,或者因爲可能沒有足夠的時間讓操作系統終止進程。從Thread.UncaughtExceptionHandler啓動服務?

不幸的是,這種方法似乎不起作用,因爲服務在相同的進程中啓動,所以它也被殺死。我如何從處理程序的uncaughtException()開始服務?我可以強制服務在完全獨立的過程中啓動嗎?


我設置我的定製默認(VM級)的異常處理程序在Application這樣的:

public class MyApp extends Application {  
    @Override 
    public void onCreate() { 
     Thread.setDefaultUncaughtExceptionHandler(
      MyExceptionReporter.getInstance(this)); 
     ... 

在我的自定義處理程序,我推出這樣的服務:

final Intent i = new Intent(MyExceptionService.INTENT); 
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); 
i.putExtra(MyExceptionService.EXTRA_STACK_TRACE, 
    Log.getStackTraceString(ex)); 
mContext.startService(i); 

該服務在AndroidMaifest.xml文件中被拒絕,並在應用程序的其他位置啓動罰款。

回答

6

啊,我明白了這一點。關鍵是將android:process添加到清單,這迫使服務在獨立進程中啓動。這可以防止應用程序被終止時服務被終止。

<service 
    android:name="your.package.blah.blah.MyExceptionService" 
    android:process=":exception" > 
    <intent-filter> 
     <action android:name="your.package.blah.blah.REPORT" /> 
    </intent-filter> 
    </service> 
+1

你先生剛剛救了我的命 – javorosas