今天遇到了这个问题,分享一下解决方案。
android没有main 函数,自然也就不存在main里面添加异常处理来实现全局异常捕获的方案。那android程序有全局异常补货的解决方案吗?
答案是有的:
那就是你得继承android工程里面的application,如:
public class ReaderApplication extends Application implements Thread.UncaughtExceptionHandler{......}
并实现线程异常补货接口:Thread.UncaughtExceptionHandler
这样你的程序,只要有没有处理的异常,都会在下面的uncaughtException函数中被捕获了。我的做法是重启应用程序。
@Override public void uncaughtException(Thread thread, Throwable ex) { // TODO Auto-generated method stub //System.exit(0); Intent intent = getBaseContext().getPackageManager() .getLaunchIntentForPackage(getBaseContext().getPackageName()); PendingIntent restartIntent = PendingIntent.getActivity( getApplicationContext(), 0, intent, Intent.FLAG_ACTIVITY_NEW_TASK); //退出程序 AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒钟后重启应用 System.exit(0); }
但不得不说的是,你得在application的oncreate函数中加上异常回调接口的注册:
Thread.setDefaultUncaughtExceptionHandler(this);
最后是,你得在AndroidManifest.xml中,将这句话修改为自己的Application:
<application
android:name="com.founder.reader.ReaderApplication"
好了,有了上面的全局异常处理,也就不用所谓的main函数才能实现的了。同时,程序也不会再提示“xxx软件停止运行”了。
最后:程序重启得用系统时钟来重启,否则程序都退出了,谁来执行重启任务:
AlarmManager mgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE); mgr.set(AlarmManager.RTC, System.currentTimeMillis() + 1000, restartIntent); // 1秒钟后重启应用
最最后,不忘给自己的小网站打个广告:程序员必备软件:www.uhdesk.com