重写Application,监听异常错误,修改异常弹出的强制退出窗口 没有BUG的程序不是好程序,但是当程序因为莫名的错误弹出默认的强制退出窗口的时候会让用户非常不爽,当强制退出无法强制退出整个应用的时候,而且要多次退出才得以退出整个应用的时候,那么这个产品就已经失去了他的市场了。在一个项目里面遇到相似的问题,所以找了各种解决方案。 首先是彻底退出应用,在不同的论坛里面有各种的退出方法, 其中我采用一个: 创建一个单例的,在List里面保存打开过的activity进行保存,在退出的时候进行遍历list 一个一个的退出应用。 其中第二个,人为创建异常,退出应用,这样就面临的一个问题修改默认的强制退出窗口,还有一个就是是否能否能够彻底退出所有activity呢,我实验了一种情况发现没有完全退出,而且郁闷的的是强制退出修改了我的单例数据; 总结了上面两个方法,于是将两个方法彻底融合,在人为的创建异常进行监听,在监听里面调用单例退出整个应用;这样既可以退出整个应用,同时也可以监听应用里面一些莫名的问题导致的异常(还可以进行捕获异常进行异常信息反馈服务器,这样便于客户端BUG的修改,增进客户端的品质); 下面贴上具体代码: 重写Application: public class MyApplication extends Application implements UncaughtExceptionHandler { private Context context; // 系统默认的UncaughtException处理? private Thread.UncaughtExceptionHandler mDefaultHandler; public static final String TAG = "CrashHandler"; public void onCreate() { super.onCreate(); context = getApplicationContext(); // 获取系统默认的UncaughtException处理? mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler(); // 设置重写的uncaughtException为程序的默认处理? Thread.setDefaultUncaughtExceptionHandler(this); } @Override public void uncaughtException(Thread thread, Throwable ex) { if (!handleException(ex) && mDefaultHandler != null) { // 如果用户没有处理则让系统默认的异常处理器来处?? mDefaultHandler.uncaughtException(thread, ex); } else { try { Thread.sleep(3000); } catch (InterruptedException e) { Log.e(TAG, "error : ", e); } // 杀死线程,退出应用。 android.os.Process.killProcess(android.os.Process.myPid()); System.exit(1); } } /** * @param 线程弹出自定义提示 * @param ex * @return true:如果处理了该异常信息;否则返回false. */ private boolean handleException(Throwable ex) { if (ex == null) { return false; } // 使用Toast来显示异常信?? new Thread() { @Override public void run() { Looper.prepare(); Toast.makeText(context, "抱歉,程序异常错误,即将退出应用!", Toast.LENGTH_LONG) .show(); Looper.loop(); } }.start(); return true; } } 具体的使用方法: 在androidmanifest里面进行Application的替换自己的, <application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".MyApplication" > 这样,每个activity都是一个application既可以监听所有的异常处理了,不过有的异常也不是全部都能监听的,比如下载大数据量问题,当然下载大数据必须异步类处理或者进行分段下载等等那就是两一个问题了。 |
|