您的位置:首页 > 移动开发 > Android开发

android直接杀死一个应用与通过回退键退出一个应用的区别

2016-05-18 22:36 323 查看
可能大神看到我这个问题会觉得很逗比吧!不过我真的遇到了这方面的问题。

直接杀死一个应用:所有的内存都会被回收,重新启动应用程序时,需要重新调用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>();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: