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的返回键处理 代码如下:

返回键处理

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

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

水平有限,欢迎指正!

更多相关文章

  1. 打造Android的中文Siri语音助手(一)——小I机器人的接口
  2. Android使用Thread的interrupt与sleep,重启或暂停线程任务
  3. Android应用程序内部启动Activity过程(startActivity)的源代码分析
  4. Android NDK之接口统一
  5. 让洪水猛兽变成温顺小羊——浅谈Android线程池机制

随机推荐

  1. android animation
  2. Android上的OpenGL ES 使用错误 解决
  3. Android中RatingBar的自定义总结
  4. ubuntu环境下我的第一个android apk (201
  5. android 老是弹出 "Copy" did not comple
  6. ListView.setOnItemClickListener、setOn
  7. Android(安卓)入门到精通 (界面编程#2-Men
  8. android app 添加logo
  9. CCRenderTexture 从后台进入前台变黑的处
  10. android 二级菜单、双ListView 仿美团、