这太老了,但我认为我有一个很好的解决方案,不需要运行任何服务或任何特殊的后台进程。
只需将时间保存到持久内存中,例如共享首选项。这可以在您需要的任何参考时间执行。对我来说,这是在启动计时器时,这样即使在重新启动后它也能持续存在。天文计时器仅与 SystemClock.elapsedRealtime() 相关,这是自上次启动以来的时间,因此您不能使用 System.currentTimeMillis(),它是自 Unix 纪元(1970 年 1 月 1 日 00:00:00 UTC)以来的总时间)。
如果您想检查手机是否仅在应用程序启动时重新启动,请将其添加到您的 onCreate.
//Create a SharedPreferences
SharedPreferences savedKeys = getApplicationContext().getSharedPreferences("MyPref", 0);
SharedPreferences.Editor editor = savedKeys.edit();
if (((System.currentTimeMillis() - SystemClock.elapsedRealtime())-(savedKeys.getLong("key_oldDelta", 0)))>100) {
//Run code here or set a boolean to true for system reboot.
}
//Save the new values.
editor.putLong("key_oldDelta", (System.currentTimeMillis() - SystemClock.elapsedRealtime()));
editor.commit();
以下部分代码将获取自上次启动以来当前 Unix 时间和系统时间的 delta(差值):
(System.currentTimeMillis() - SystemClock.elapsedRealtime())
如果系统重新启动,这些数字将分别比重新启动前更大和更小。
示例:您在系统时间 = 100 和 Unix 时间 = 1000 处保存时间。您在 450 后重新启动,并在另一个 50 后重新启动应用程序。自您记录值以来,现在已经过去了 500。他们现在分别是 10 岁和 1500 岁。
新增量:1500-10=1490
旧三角洲:1000-100=900
三角洲的三角洲:1490-900=590
重新启动后,最后一个数字始终会更高。重启后已经过了多久并不重要。这种差异只会变得更大,因为一个数字(Unix 时间)不断向前移动,而另一个数字在重新启动时不断重置为零。我的示例使用非常小的数字来使其易于理解,但请记住实际数字以毫秒为单位,并且自 1970 年以来已经过去了相当多的数字。这就是为什么我的代码在 if 语句末尾显示