我的 Android 应用程序中有一些东西需要每天更新一次。
我认为这很简单,但我不知道我需要什么格式来格式化日期和时间(如果需要时间)以及如何检查今天是否完成了更新(今天是在上午 00:01 到 23 之间:用户当地时间下午 59 点)。如果今天已经完成更新,则不应进行更新。
这就是我知道该怎么做:
- 将上次更新日期保存在 SharedPreferences 中(但我如何获取它的字符串,我不知道)
- 从 SharedPreferences 获取东西(但我不知道如何比较字符串格式的日期)
这与您选择的格式无关。这只是重新计算的问题。
我建议使用自纪元以来的毫秒数,因为所有系统调用都使用它,因此您使用它会更容易。
由于 1000 毫秒是 1 秒,因此很容易算出1000*60*60*24
等于一天(24 小时)。因此,如果storedMillis
大于NOW - 1000*60*60*24
,(并且NOW
是 ie System.currentTimeMillis()
),那么现在进行检查还为时过早。如果storedMillis
较小,则保存您的NOW
时间戳并进行检查:
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();
这应该可以解决问题。
如果您以 20121122 (YYYYmmdd) 格式存储日期,那么您可以比较 20121122 > 20121123。但在比较时必须将其存储为 int 或强制转换为 int。
存储上次执行的时间戳 (System.currentTimeMillis() ) 并将其与当前执行进行比较。如果差值超过 24 小时……你知道吗?
使用每 24 小时执行一次的 AlarmManager 设置警报,然后执行操作
检查这个问题:警报管理器示例
这是一种比其他方法更复杂的方法,但可以确保事情已经完成,而使用其他选项时,必须执行应用程序以检查它是否需要更新任何内容。
这是方法
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;
}
}