我正在编写扩展Thread.UncaughtExceptionHandler
的自定义异常处理程序类。实现如下:
public class ExceptionHandler implements Thread.UncaughtExceptionHandler {
private final Activity crashedActivity;
public ExceptionHandler(Activity activity) {
this.crashedActivity = activity;
}
public void uncaughtException(Thread thread, Throwable exception) {
Intent intent = new Intent(crashedActivity, SplashActivity.class);
intent.putExtra(CONSTANTS.APP_CRASHED, true);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
| Intent.FLAG_ACTIVITY_CLEAR_TASK
| Intent.FLAG_ACTIVITY_NEW_TASK);
crashedActivity.startActivity(intent);
crashedActivity.finish();
}
}
虽然此代码正在编译,但它没有启动新活动。这是为什么?如何做到这一点?
答案 0 :(得分:0)
首先要澄清的是,您不得尝试从自定义异常处理程序重新启动应用程序,因为该应用程序可能处于不稳定状态。自定义异常处理程序应用于生成某些类型的崩溃日志,您可以将其发送到服务器,和/或向用户显示更友好的错误消息(活动)。
检查您的代码似乎是要传递崩溃的活动,因为它不起作用,因为要使异常处理程序更有效,应在Application类中实例化,此时,否活动已创建。
考虑到这一点,请尝试下一个代码。如前所述,它应该仅在您的Application类中实例化一次。
用Activity替换 YourCrashNotificationActivity.class ,您将使用该通知来通知问题,并确保此类Activity的代码最少,并且100%没有错误,因为如果失败,则崩溃处理程序< strong> uncaughtException 将再次被触发,这意味着您将陷入循环。
public final class CrashHandler implements Thread.UncaughtExceptionHandler
{
@NonNull
private final Context appContext;
@NonNull
private final Thread.UncaughtExceptionHandler defaultHandler;
public CrashHandler(@NonNull final Context appContext)
{
this.appContext = appContext;
this.defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(@NonNull final Thread thread, @NonNull final Throwable sourceException)
{
try
{
final int flags = Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME |
Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS | Intent.FLAG_ACTIVITY_NO_HISTORY;
final Intent activityIntent = new Intent(this.appContext, YourCrashNotificationActivity.class);
activityIntent.setFlags(flags);
this.appContext.startActivity(activityIntent);
}
catch (Throwable th)
{
th.printStackTrace();
this.defaultHandler.uncaughtException(thread, sourceException);
}
}
}
接下来是如何实例化它。它应该在Application.onCreate回调中, (不要忘记使用应用程序类更新AndroidManifest.xml ):
public final class YourApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
new CrashHandler(this.getApplicationContext());
}
}