我做了一些编码来测试Thread.UncaughtExceptionHandler以获取特定用例(如下所述)。
首先,我有BaseActivity
这样实现。
public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.e("CRASH_REPORT", "Activity crashed!");
System.exit(0);
}
});
}
}
通过扩展BaseActivity
,任何未捕获的异常最终都会被处理程序捕获。 System.exit(0)
将终止属于该应用的 VM 。
现在,我使用此层次结构创建了2个活动(均扩展BaseActivity
)。
ParentActivity - >子活动
在ParentActivity
中,我只有一个按钮,点击后会启动SubActivity
(代码省略)。
在SubActivity.onCreate(...)
中,我故意注入一个例外来触发uncaughtException(...)
。
public class SubActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int crash = 1 / 0;
}
}
执行SubActivity
时,uncaughtException(...)
已触发且应用已停止(显然没有众所周知的应用停止对话框)。
我想知道的是,是否可以终止触发的Activity(在这种情况下为SubActivity
),app是否会回滚(排序)到之前的状态(ParentActivity
)?
任何建议表示赞赏。谢谢。
答案 0 :(得分:0)
经过一些研究,我认为当Activity
触发uncaughtException(...)
时, NO WAY 将返回上一个Activity
,因为主线程已经停止。
在这里,我将列出我的想法"对策"这个问题。
android:process=dedicated_process_name
(不推荐)在清单文件中,在每个activity
标记下添加Activity
。这样做会使每个<activity
android:name=".ParentActivity"
android:process="::parent_process" />
在自己的进程中运行,从而确保1个进程的崩溃不会影响另一个进程。但不建议这样做。
System.exit(code)
Activity
)并提供回调,其中每个BaseActivity
可以定义自己的处理。使用onCrashed(...)
回调创建public class BaseActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
@Override
public void uncaughtException(Thread paramThread, Throwable paramThrowable) {
Log.e("CRASH_REPORT", "Activity crashed!");
onCrashed(thread, throwable);
System.exit(0);
}
});
}
protected void onCrashed(Thread thread, Throwable throwable) {
// space for rent
}
}
。
Activity
从BaseActivity
延伸的所有public class SubActivity extends BaseActivity
@Override
protected void onCrashed(Thread thread, Throwable throwable) {
Intent i = new Intent(this, ParentActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, i, 0);
AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC, System.currentTimeMillis() + 100, pi);
}
可以决定他们在崩溃时想要做什么。一个例子是安排再次启动应用程序。
Application
或者,我们可以选择在Application
级别实施uncaughtException(...),Activity
将决定下一步该做什么。 (例如,重启当前{{1}})