提问人:na29 提问时间:7/18/2023 更新时间:7/18/2023 访问量:97
UncaughtExceptionHandler 无法启动活动
UncaughtExceptionHandler can't start activities
问:
我找不到这个问题的解决方案。我创建了一个 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>
答:
1赞
Watermelon
7/18/2023
#1
您需要使用有效的 Activity 类在 Intent 上调用 setClass 才能实际启动 Activity,而不是 Exception.class
当主线程的未捕获异常发生时,主事件循环将终止,因此当主线程的异常处理程序返回时,主线程退出,程序终止。
细节 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);
}
}
评论
RuntimeException extends Activity
你真的不想这样做,因为这很可能会在一周而不是几个月内用自己的脚开枪。请注意,你不会改变围绕代码抛出的 s 的性质。它们仍然不会是 Activity 的子类。RuntimeExceptionActivity
RuntimeException