这太老了,但我认为我有一个很好的解决方案,不需要运行任何服务或任何特殊的后台进程。
只需将时间保存到持久内存中,例如共享首选项。这可以在您需要的任何参考时间执行。对我来说,这是在启动计时器时,这样即使在重新启动后它也能持续存在。计时表仅与 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 时间和系统时间的增量(差异): (System.currentTimeMillis() - SystemClock.elapsedRealtime())
如果系统重新启动,与重新启动前相比,这些数字将分别更大和更小。
示例:您在系统时间 = 100 和 Unix 时间 = 1000 时保存时间。您在 450 之后重新启动并在另一个 50 之后重新启动应用程序。自从您记录这些值以来,现在已经过去了 500。他们现在是 10 和 1500。
新增量:1500-10=1490
旧三角洲:1000-100=900
增量的增量:1490-900=590
重新启动后,最后一个数字总是更高。重启后多久没关系。差异只会变得更大,因为一个数字(Unix 时间)不断向前移动,而另一个在重新启动时不断被重置为零。我的示例使用非常小的数字以使其易于理解,但请记住实数以毫秒为单位,并且自 1970 年以来已经过去了相当多的数字。这就是为什么我的代码在 if 语句末尾显示 <100 的原因。这使应用程序有 100 毫秒的时间来运行数学。实际上,这大约需要 1 毫秒,但手机不可能在 100 秒内重启,所以这是一个安全的值。