gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:05:16 24 4
gpt4 key购买 nike

我正在编写一个扩展 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com