Android 每天只更新一次
我的Android应用程序中有些东西需要每天更新一次 我认为这很简单,但我不知道我需要什么格式来设置日期和时间(如果需要时间)以及如何检查今天是否完成了更新(今天是用户当地时间的00:01到23:59之间)。如果今天已完成更新,则不应进行更新 以下是我所知道的方法:Android 每天只更新一次,android,date,Android,Date,我的Android应用程序中有些东西需要每天更新一次 我认为这很简单,但我不知道我需要什么格式来设置日期和时间(如果需要时间)以及如何检查今天是否完成了更新(今天是用户当地时间的00:01到23:59之间)。如果今天已完成更新,则不应进行更新 以下是我所知道的方法: 将上次更新日期保存在SharedReferences中(但是如何获取更新日期 一串,我不知道) 从SharedReferences获取内容(但我 不知道如何比较字符串格式的日期) 如果以20121122(YYYYmmdd)格式存储
- 将上次更新日期保存在SharedReferences中(但是如何获取更新日期 一串,我不知道)
- 从SharedReferences获取内容(但我 不知道如何比较字符串格式的日期)
1000*60*60*24
等于一天(24小时)。因此,如果storedMillis
大于NOW-1000*60*60*24
,(并且NOW
就是System.currentTimeMillis()
),那么现在进行检查还为时过早。如果storedMillis
较小,则立即保存时间戳并进行检查:
long now = System.currentTimeMillis();
long diffMillis = now - lastCheckedMillis;
if( diffMillis >= (3600000 * 24) ) {
// store now (i.e. in shared prefs)
// do the check
} else {
// too early
}
编辑
我很有兴趣在应用程序第一次打开时做这件事
当前日期,即使上次更新是在10分钟前完成的
问题在于如何获得合适的毫度来进行比较。替换long now=System.currentTimeMillis()代码>来自上述代码,代码块如下:
Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.HOUR_OF_DAY);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
long now = cal.getTimeInMillis();
你选择什么格式无关紧要。这只是重新计算的问题
我建议使用epoch之后的毫秒,因为所有系统调用都使用它,所以使用相同的时间会更容易
由于1000毫秒是1秒,很容易计算出1000*60*60*24
等于一天(24小时)。因此,如果storedMillis
大于NOW-1000*60*60*24
,(并且NOW
就是System.currentTimeMillis()
),那么现在进行检查还为时过早。如果storedMillis
较小,则立即保存时间戳并进行检查:
long now = System.currentTimeMillis();
long diffMillis = now - lastCheckedMillis;
if( diffMillis >= (3600000 * 24) ) {
// store now (i.e. in shared prefs)
// do the check
} else {
// too early
}
编辑
我很有兴趣在应用程序第一次打开时做这件事
当前日期,即使上次更新是在10分钟前完成的
问题在于如何获得合适的毫度来进行比较。替换long now=System.currentTimeMillis()代码>来自上述代码,代码块如下:
Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.HOUR_OF_DAY);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
long now = cal.getTimeInMillis();
这就足够了。用AlarmManager设置一个每24小时执行一次的警报,然后做一些事情
检查此问题:
这是一种比其他方法更复杂的方法,但要确保事情完成,而使用其他选项时,必须执行应用程序,以检查是否需要更新任何内容。使用AlarmManager设置一个每24小时执行一次的警报,然后执行其他操作
检查此问题:
这是一种比其他方法更复杂的方法,但要确保事情都完成了,而使用其他选项时,必须执行应用程序,以检查是否需要更新任何内容。以下是方法
public boolean runOnceADay() {
SharedPreferences shp= c.getSharedPreferences(Constants.GENERAL_SHP, MODE_PRIVATE);
SharedPreferences.Editor editor= shp.edit();
long lastCheckedMillis = shp.getLong(Constants.ONCE_A_DAY, 0); // "KEY" you may change yhe value
long now = System.currentTimeMillis();
long diffMillis = now - lastCheckedMillis;
if (diffMillis >= (3600000 * 24)) { // set up your time circulation
editor.putLong(Constants.ONCE_A_DAY, now);
editor.commit();
Util.showMessage(c, "Once a Day Test");
return false;
} else {
Util.showMessage(c, "Too Early");
return true;
}
}
这里是方法
public boolean runOnceADay() {
SharedPreferences shp= c.getSharedPreferences(Constants.GENERAL_SHP, MODE_PRIVATE);
SharedPreferences.Editor editor= shp.edit();
long lastCheckedMillis = shp.getLong(Constants.ONCE_A_DAY, 0); // "KEY" you may change yhe value
long now = System.currentTimeMillis();
long diffMillis = now - lastCheckedMillis;
if (diffMillis >= (3600000 * 24)) { // set up your time circulation
editor.putLong(Constants.ONCE_A_DAY, now);
editor.commit();
Util.showMessage(c, "Once a Day Test");
return false;
} else {
Util.showMessage(c, "Too Early");
return true;
}
}
虽然这是一个很好的答案,但我认为你把我的问题搞错了。如果最后一次更新时间超过24小时,我对更新不感兴趣。我感兴趣的是在应用程序当天第一次打开时进行更新,即使最后一次更新是在10分钟前完成的。想象一下:最后一次更新是在1月4日23:55完成的。我在1月5日00:05再次打开应用程序。使用您的代码,更新不会在应该运行时运行。我将不得不再等待23个多小时,然后重新打开应用程序以激活更新,结果是一天没有更新。虽然这是一个很好的答案,但我认为你误解了我的问题。如果最后一次更新时间超过24小时,我对更新不感兴趣。我感兴趣的是在应用程序当天第一次打开时进行更新,即使最后一次更新是在10分钟前完成的。想象一下:最后一次更新是在1月4日23:55完成的。我在1月5日00:05再次打开应用程序。使用您的代码,更新不会在应该运行时运行。我将不得不再等待23个多小时,然后重新打开应用程序以激活更新,这将导致一天没有更新。我已经对@WebnetMobile.com的回答发表了评论,解释了为什么这种方法不适合我的情况。然后接受他的答案并搜索偏好示例,工作在以下线程中完成:)我已经对@WebnetMobile.com的答案发表了评论,解释了为什么这种方法不适合我的情况。然后接受他的答案并搜索一个偏好设置示例,该任务在以下线程中完成:)请参阅我对@WebnetMobile.com答案的评论。这种方法不合适,因为如果应用程序在前一天23:59左右更新,那么我就有几天没有更新。请参阅我对@WebnetMobile.com答案的评论。这种方法不合适,因为如果应用程序在前一天23:59左右更新,那么我就有几天没有更新。你的答案回答了这个问题。如果其他人不来,我一定会来接你