2012-11-22 103 views
0

我的Android应用程序需要每天更新一次。每天更新一次

这是非常简单的我认为,但我不知道格式化日期和时间(如果需要时间)以及如何检查是否今天已完成更新(今天介于00:在用户当地时间01am和23:59 pm)。如果今天已经完成更新,则不应该进行更新。

这里是我知道该怎么做:

  • 保存在SharedPreferences的最后更新日期(但我如何得到一个 串起来,我不知道)
  • 从SharedPreferences得到的东西(但我 不知道如何在字符串格式比较日期)

回答

8

这与您选择的格式无关。这只是重新计算的问题。

我建议使用自纪元以来的毫秒数,因为所有系统调用都使用它,所以使用它会更容易。

由于1000毫秒是1秒,很容易发现1000*60*60*24等于一天(24小时)。因此,如果storedMillis大于NOW - 1000*60*60*24(和NOWSystem.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(); 

其中应胜任。

+1

+1不错的例子 – rekire

+0

虽然这是一个很好的答案,但我认为你的问题不对。如果最近一次更新从现在开始超过24小时,我对更新不感兴趣。我有兴趣在应用程序在当天第一次打开时执行此操作,即使最近一次更新是在10分钟前完成的。想象一下:最后一次更新是在1月4日23:55完成的。我于1月5日00:05再次打开应用程序。使用你的代码时,更新将不会运行。我将不得不等待另外23个小时,然后重新打开应用程序,以便更新被激活,结果是没有更新。 –

+0

检查编辑答案 –

2

如果您存储您的日期格式20121122(年月日),那么你可以比较就像是20121122> 20121123.但必须存储为INT或者当c时转换为int omparing。

+0

你的回答回答了问题。如果其他人没有在代码中提出一个例子,我一定会选择你。 –

+0

我仍然认为我的答案是最简单的,但在一天结束时它是您的选择。 –

1

存储上次执行的时间戳(System.currentTimeMillis()),并将其与当前时间戳进行比较。如果差异超过24小时......你知道吗?

+0

请参阅我对@ WebnetMobile.com的回答的评论。这种方法不适合,因为如果应用程序在前一天的23:59左右更新,那么我可以有几天没有更新。 –

1

设置了AlarmManager执行每24小时报警,然后做的东西

检查这个问题:Alarm Manager Example

它比其他更复杂的方法,但是可以肯定的事情都做了,同时用应用程序必须执行的其他选项才能检查它是否必须更新。

+0

我已经评论@ WebnetMobile.com的答案,为什么这种方法不适合我的情况。 (http://stackoverflow.com/questions/13514907/update-only-once-per-day/13515014#comment18502830_13515090) –

+0

然后接受他的答案并搜索一个首选项的例子,这个工作是在这个线程:) – Maragues