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

可能大神看到我这个问题会觉得很逗比吧!不过我真的遇到了这方面的问题。

直接杀死一个应用:所有的内存都会被回收,重新启动应用程序时,需要重新调用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>();

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值