android 中处理崩溃异常并重启程序

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()); 

这样我们就实现了崩溃后重启,并且返回键退出的业务需求

水平有限,欢迎指正!

你可能感兴趣的:(android)