可能大神看到我这个问题会觉得很逗比吧!不过我真的遇到了这方面的问题。
直接杀死一个应用:所有的内存都会被回收,重新启动应用程序时,需要重新调用Application的OnCreate方法,会调用onSaveInstanceState方法。
退出键退出程序:退出程序后,一些加载过的静态变量并没有被回收,重新启动也不需要调用Application的OnCreate方法。
分清楚这些有什么用呢?
我要做的事情是这样的:要在程序退出之前将一些数据存到数据库中。很自然的想法是在OnDestroy方法中调用insert不就行了?如果是通过第二种方式退出应用程序的话,确实是可行的。不过如果通过第一种方式,该怎么办呢?在杀死应用程序的时候,存储操作没执行结束,程序就彻底死掉了,必然存不进去,这是就是我逗比的地方,竟然忘记了,这种退出方式属于异常的退出,会调用onSaveInstanceState方法,所以我们可以在这个方法里面再写入。这时可能会有疑问,你就不怕重复插入吗?
其实这就用到了一个数据库操作的小技巧了,无论是在OnDestroy方法,还是在onSaveInstanceState方法,我们均先调用的是update,通过判断update方法返回的行数判断,如果等于0,则表明要更新的数据不存在,则需要再调用insert方法。
代码如下:
/** * 数据库的更新操作 * @param dbHelper DatabaseHelper对象 * @param user UserInfo对象 * @param name 表名 */ public static void update(DatabaseHelper dbHelper,UserInfo user,String name){ SQLiteDatabase db = dbHelper.getWritableDatabase(); ContentValues values = new ContentValues(); if(name.equals("step")){ values.put("datetime",user.getDatatime()); values.put("count",user.getCount()); int i = db.update(name,values,"datetime=?",new String[]{user.getDatatime()}); values.clear(); if(i == 0){ insert(dbHelper,user,name); } db.close(); } }再说一下那个静态变量有没有回收导致的坑,如果你是像这样直接在其声明时就初始化了,你会发现当你的程序通过第二种方式退出后再进入,这个arrayList的size不是为0的,也就是说它还是存在的。如果这时再向其中插入新的数据,会发现显示出的内容不正确。
private static ArrayList<UserInfo> arrayList = new ArrayList<UserInfo>();