在使用 unCaughtExceptionHandler 发生未捕获的异常后,我尝试以隐式意图启动活动。Intent 应该在已崩溃的同一应用程序中将 Activity 作为 Dialog 启动。这对应于该线程中列出的示例:
我在自己的处理程序结束时调用原始的 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);
}
}
结果是,在出现异常后,会显示标准对话框,上面写着“不幸的是 App 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);
}
}