UncaughtExceptionHandler 无法启动活动

UncaughtExceptionHandler can't start activities

提问人:na29 提问时间:7/18/2023 更新时间:7/18/2023 访问量:97

问:

我找不到这个问题的解决方案。我创建了一个 Application 类,我在其中设置了默认的未捕获的异常处理程序,并且我想在发生异常时从那里启动一个活动:

public final class Application extends android.app.Application {
    public Application() {
        Thread.setDefaultUncaughtExceptionHandler(new Application.UncaughtExceptionHandler());
    }
    static Context context;

    static final class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
        @Override
        public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
            context.startActivity(new Intent()
                            .setClass(context, RuntimeException.class)
                            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                            /*.putExtra("u", true).putExtra("e", e)*/);
            //System.exit(0);
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        context = getApplicationContext();
    }
}

这是 RuntimeException 类,它也在清单中定义:

public class RuntimeException extends Activity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.a_exception);

        Bundle extras = getIntent().getExtras();
        boolean uncaught = extras.getBoolean("u", false);
        Throwable exception = (Throwable) extras.get("e");

        String exceptionType;
        if (uncaught) exceptionType = "Uncaught exception:\n"; else exceptionType = "Exception:\n";

        TextView msg = findViewById(R.id.ex_msg);
        msg.setText(exceptionType + exception.getLocalizedMessage());
    }
}

这是清单:

<application
        android:name=".application.Application"
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.MyTheme"
        tools:targetApi="31">
        <activity
            android:name=".activity.Launcher"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".activity.FileList"/>
        <activity android:name=".activity.RuntimeException"/>
    </application>
java android uncaughtexceptionhandler

评论

0赞 Shark 7/18/2023
RuntimeException extends Activity你真的不想这样做,因为这很可能会在一周而不是几个月内用自己的脚开枪。请注意,你不会改变围绕代码抛出的 s 的性质。它们仍然不会是 Activity 的子类。RuntimeExceptionActivityRuntimeException

答:

1赞 Watermelon 7/18/2023 #1
  1. 您需要使用有效的 Activity 类在 Intent 上调用 setClass 才能实际启动 Activity,而不是 Exception.class

  2. 当主线程的未捕获异常发生时,主事件循环将终止,因此当主线程的异常处理程序返回时,主线程退出,程序终止。

细节 2. android main Thread uncaught 异常处理程序在主线程的事件循环退出后调用。这意味着主线程最终会返回,操作系统将终止该进程。

评论

0赞 na29 7/18/2023
RuntimeException 扩展了 Activity,而不是 Exception,因此它应该是一个有效的 Activity。我必须检查我是否在 setClass 调用中使用了错误的类。感谢您的回复,我会检查并告知您。
0赞 na29 7/18/2023
我使用的是正确的 RuntimeException 类,所以这不是问题。
1赞 viethoang 7/18/2023 #2

调用后应终止进程startActivity

static final class UncaughtExceptionHandler implements Thread.UncaughtExceptionHandler {
        @Override
        public void uncaughtException(@NonNull Thread t, @NonNull Throwable e) {
            context.startActivity(new Intent()
                            .setClass(context, RuntimeException.class)
                            .setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                            /*.putExtra("u", true).putExtra("e", e)*/);
             android.os.Process.killProcess(android.os.Process.myPid());
             System.exit(0);
        }
    }