我可以从Android中的Thread.UncaughtExceptionHandler类开始活动吗?

时间:2019-02-13 16:34:59

标签: android android-intent android-activity

我正在编写扩展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();
        }
}

虽然此代码正在编译,但它没有启动新活动。这是为什么?如何做到这一点?

1 个答案:

答案 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());
    }
}