应用安全关闭

来源:互联网 发布:sql select语句返回值 编辑:程序博客网 时间:2024/05/17 22:00

#
针对项目中的一些代码,这些代码在编码时没有明确的要求try catch.容易被开发者忽略。
可能产生比较严重的问题。例:主界面打不开。
可以使用安卓提供的一个捕获全局异常的接口,可以把程序抛出来未处理的异常都捕获到然后再处理。
UncaughtExceptionHandler必须注册在Application中

1.创建一个类继承Application,重写onCreate(),并且在清单文件中配置,2.在类中创建一个全局的成员变量:存放activity的集合,提供get方法3.实现这个接口:UncaughtExceptionHandler;并且用代码注册4.如果捕获到异常,在接口的重写方法内,释放所有的activity,清空集合5.创建一个BaseActivity继承Activity,创建全局的Application对象,调用get()方法,获得当前的activity,并且添加到存放activity的集合中 ,当销毁时,将集合的元素清空6.自己的activity就继承BaseActivity类.eg:一个继承Application 的MyApp类: 需要去功能清单里面进行配置<applicationf android:name="com.example.application.MyApp"/*在这个类的所有的成员变量都是唯一的,并且是全局的,无论在哪个页面拿到,都是一样的,相当于单例模式创建*///提供一个获取应用的所有activity集合的方法;public List<Activity> activities = new ArrayList<Activity>();  //保存应用的activity一个集合public List<Activity> getActivities() {    return activities;}@Overridepublic void onCreate() {    super.onCreate();    //全局异常捕获    UncaughtExceptionHandler ucHandler = new UncaughtExceptionHandler() {        @Override        public void uncaughtException(Thread thread, Throwable ex) {            /*             * 在开发中可以将错误信息保存起来上传到服务器,方便程序的维护 保存log日志用打印流完成(假设保存到应用目录下)             */            File file = new File("data/data/" + getPackageName()                    + "/log.txt");            try {                if (!file.exists()) {                    file.createNewFile();                }                PrintWriter pw = new PrintWriter(file);                //注意打印的方法                ex.printStackTrace(pw);                //上传到服务器的操作.....            } catch (Exception e) {                e.printStackTrace();            }            //关闭应用            for (Activity ac : activities) {                ac.finish(); // 安全关闭            }            activities.clear(); //释放集合        }    };    //必须要注册 ---用当前的线程来完成    Thread.currentThread().setUncaughtExceptionHandler(ucHandler); }}

继承Activity的BaseActivity类

` public class BaseActivity extends Activity {private MyApp app;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    app = (MyApp) getApplication();  //拿到一个全局上下文    app.getActivities().add(this);  //将这个activity放入集合中}@Overrideprotected void onDestroy() {    // TODO Auto-generated method stub    super.onDestroy();    app.activities.clear();  //清空}}`
0 0
原创粉丝点击