android 中处理崩溃异常并重启程序
有时候由于测试不充分或者程序潜在的问题而导致程序异常崩溃,这个是令人无法接受的,在android中怎样捕获程序的异常崩溃,然后进行一些必要的处理或重新启动
应用这个问题困恼了我很久,今天终于解决了该问题,写篇文章记录一下。
首先捕获程序崩溃的异常就必须了解一下java中UncaughtExceptionHandler这个接口,android沿用了此接口,在android API中:
通过实现此接口,能够处理线程被一个无法捕捉的异常所终止的情况。如上所述的情况,handler将会报告线程终止和不明原因异常这个情况,如果没有自定义handler,
线程管理组就被默认为报告异常的handler。
ThreadGroup 这个类就是实现了UncaughtExceptionHandler这个接口,如果想捕获异常我们可以实现这个接口或者继承ThreadGroup,并重载uncaughtException方法。
在java API中对该接口描述的更详细:
注意:
在应用异常时,系统会进入
public void uncaughtException(Thread thread, Throwable ex) {
执行相应的错误处理逻辑。我们在这里将错误捕获写入文件、上传服务器等,然后通过启动入口Activity的方法重新开启一个界面,并且杀掉当前崩溃的程序的进程
在启动Activity的时候,使用新的栈容器方式去启动 FLAG_ACTIVITY_NEW_TASK
android.os.Process.killProcess(android.os.Process.myPid());杀掉进程以后会重启
这时候要注意,如果在新启动的Activity中点back键的话,系统会一直调用finish()方法。调用finish()方法最后会杀死进程,如果这个时候有异常产生或者结束进程后会出现频繁的启动Activity。这时候就会无法退出程序。我们需要处理的策略是
管理Activity并且在出现异常的时候关闭所有的Activity,然后再重启一个入口的Activity,同时,对Activity的返回键处理 代码如下:
返回键处理
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN){
if((System.currentTimeMillis()-exitTime) > 2000){
Toast.makeText(getApplicationContext(), "再按一次退出程序", Toast.LENGTH_SHORT).show();
exitTime = System.currentTimeMillis();
} else {
finish();
}
}
return true;
}
onCreate中将已经打开的Activity管理
app = ((MobileGuardApplication) getApplicationContext());
app.activities.add(this);
在崩溃后关闭所有Activity,并重新打开入口,杀掉线程
if (activities.size() != 0) {
for (Activity activity :
activities) {
activity.finish();
}
}
Intent intent = new Intent(this, CaptureActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
android.os.Process.killProcess(android.os.Process.myPid());
这样我们就实现了崩溃后重启,并且返回键退出的业务需求
水平有限,欢迎指正!