我試圖用unCaughtExceptionHandler在未捕獲的異常之後以隱式意圖啓動一個活動。意圖應該在崩潰的同一個應用程序中啓動一個活動作爲對話框。這相當於在這個線程中列出的例子:未捕獲的異常之後的顯示對話框
Need to handle uncaught exception and send log file
我調用原始的UncaughtExceptionHandler在我自己的處理過程結束,就像這樣:
public class ThisApplication extends Application
{
Thread.UncaughtExceptionHandler originalUncaughtExceptionHandler;
@Override
public void onCreate()
{
originalUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler (new Thread.UncaughtExceptionHandler()
{
@Override
public void uncaughtException (Thread thread, Throwable e)
{
handleUncaughtException (thread, e);
}
});
super.onCreate();
}
public void handleUncaughtException (Thread thread, Throwable e)
{
e.printStackTrace();
Intent intent = new Intent();
intent.setAction ("de.mydomain.myapp.action.PROCESS_LOG");
intent.setFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
if (intent.resolveActivity(getPackageManager()) == null) {
Log.d("ThisApplication","No receiver");
} else {
Log.d("ThisApplication", "Intent start");
startActivity(intent);
}
originalUncaughtExceptionHandler.uncaughtException(thread, e);
}
}
結果是,後例外情況是顯示標準對話框,其中顯示諸如「不幸的應用xxx被關閉」之類的東西。在該對話框後面,在後臺,我可以看到我的對話框應該以這個意圖「PROCESS_LOG」開始。所以顯然是開始了,但問題是,標準對話框關閉後,我的自定義對話框也會關閉。如果我在對話活動的清單中添加
android:launchMode="singleInstance"
,對話是隱藏的,太,但它可以當再次應用從最近的應用程序菜單中選擇激活。這在我看來好像對話不是從以前的應用程序/任務完全獨立開始的。
有人可以說我做錯了什麼嗎?
這是對話活動的清單部分:
<activity
android:name=".ProcessLogActivity"
android:windowSoftInputMode="stateHidden"
android:theme="@style/ProcessLogActivity"
android:process=":report_process"
>
<intent-filter>
<action android:name="de.mydomain.myapp.action.PROCESS_LOG" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
相應的樣式:
<style name="ProcessLogActivity" parent="@style/Theme.AppCompat.Light.Dialog">
</style>
這是對話活動類:
public class ProcessLogActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature (Window.FEATURE_NO_TITLE);
setFinishOnTouchOutside (false);
Log.d("ThisApplication", "Intent received");
setContentView(R.layout.activity_process_log);
}
}
只需插入ACRA即可更好地服務。如果沒有別的,看看ACRA的實施,並確定他們如何處理它。在未處理的異常期間做這樣的事情是非常棘手的,因爲環境可能相當混亂(例如,'OutOfMemoryError'是觸發崩潰的原因)。 – CommonsWare
謝謝你的提示。我會看看ACRA。不過,我真的很感興趣,爲什麼它不起作用,因爲在另一個線程中,每個人似乎都運行它。但是,我使用自己引發的異常對它進行了測試,因此只需一個簡單的「空」RuntimeException即可首先測試此場景。 – Harry500
您是否知道是否可以使用ACRA顯示自定義對話框(Fregment)或顯示爲對話框的活動以顯示報告數據並提供其他幾項功能,例如保存報告?也許使用實現自己的報告發送者的集成功能?或者在這一點上不可能再顯示任何其他自己的片段/對話/活動? – Harry500