在尝试使用unCaughtExceptionHandler进行未捕获的异常后,我尝试使用隐式intent启动活动。意图应该在崩溃的同一个应用程序中启动一个Activity作为对话框。这对应于此主题中列出的示例:
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);
}
}
结果是,在Exception之后显示标准对话框,其中显示类似"不幸的是App xxx已关闭"。在对话框的后面,在后台,我可以看到我的Dialog应该以这个意图启动" PROCESS_LOG"。显然已经开始,但问题是,在标准Dialog关闭后,我的自定义对话框也会关闭。如果我添加
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>
这是Dialog Activity类:
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);
}
}
答案 0 :(得分:0)
要发布完整的消息(评论太短),这里是完整的类和配置:
我尝试将ACRA与内置的对话功能结合使用,但我无法使用它。但是内置的功能可以显示出一个&#34; Toast&#34;作品!这就是为什么我问自己问题在哪里显示对话框。我使用以下@ReportCrashed Annotation进行测试:
@ReportsCrashes(
formUri = "http://yourserver.com/yourscript",
mode = ReportingInteractionMode.NOTIFICATION,
resDialogText = R.string.app_name,
resNotifTickerText = R.string.app_name,
resNotifTitle = R.string.app_name,
resNotifText = R.string.app_name
)
在我自己的Application-Class中,我使用以下初始化:
public class ThisApplication extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
final ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(this);
configurationBuilder.setBuildConfigClass(BuildConfig.class);
final ACRAConfiguration config;
try {
config = configurationBuilder.build();
ACRA.init(this, config);
} catch (ACRAConfigurationException e) {
e.printStackTrace();
}
}
}
我的应用程序使用两种不同的Build风格和两种构建类型&#34; Debug&#34;和&#34;发布&#34;。
当我抛出一个未处理的异常时,应用程序关闭,有时只会在整个应用程序关闭之前的一小段时间内(不到半秒钟)显示一个对话框而没有任何对话框。
任何想法?...
编辑:上面的注释是带有通知的尝试,但也不起作用。通知也仅在很短的时间内显示,然后立即消失。对话框注释是:
@ReportsCrashes(
formUri = "http://yourserver.com/yourscript",
mode = ReportingInteractionMode.DIALOG,
resDialogText = R.string.app_name
)
这具有上述效果。
答案 1 :(得分:0)
问题是 - 至少在ACRA-Dialog的情况下 - 它不起作用,因为应用程序是使用android studio的内置功能调试的。因此,您必须在Android测试系统(在调试设备上)启动应用程序,而无需android studio IDE的支持。当您这样做并抛出异常时,ACRA-Dialog就会出现。