android - 我可以从 Android 中的 Thread.UncaughtExceptionHandler 类开始一个 Activity 吗?

标签 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();
        }
}

虽然这段代码正在编译,但它并没有启动新的 Activity 。这是为什么?如何实现?

最佳答案

首先要澄清的是,您不得尝试从自定义异常处理程序重新启动您的应用,因为该应用可能处于不稳定状态。自定义异常处理程序应该用于生成某种类型的崩溃日志,您可以将其发送到服务器,和/或向用户显示更友好的错误消息( Activity )。

检查你的代码似乎你想传递崩溃的 Activity ,这将不起作用,因为异常处理程序更有效应该在 Application 中实例化class,此时还没有创建 Activity。

考虑到这一点,尝试下一个代码。如前所述,它应该只在您的 Application 中实例化一次类

YourCrashNotificationActivity.class 替换为您将用于通知问题的 Activity,并确保此类 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());
    }
}

关于android - 我可以从 Android 中的 Thread.UncaughtExceptionHandler 类开始一个 Activity 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54675179/

相关文章:

android - 删除或取消 DragShadow

android - 以相同或下一行样式进行控制

android - 使用 Flex 创建 iPhone/Android 应用程序的缺点

android - 如何实时查看Android APP的后台堆栈?

java - 用于MainActivity和广播接收器之间通信的接口(interface)

用于 http 地址的 Android Intent-Filter

android - Kotlin 中 "ClassInstance.[Someclass::class.java]"是什么意思?

java - http post 在 Android 应用程序中不起作用

android - 调用 getOwnerActivity() 方法总是返回 null

java - 开始 Activity 的动态 Intent 参数