我正在尝试检测自上次设置首选项值后 Android 设备是否已重新启动。理想情况下,我希望在没有 android.permission.RECEIVE_BOOT_COMPLETED
权限的情况下执行此操作。
我考虑的一种方法是存储另一个包含某种 session ID 的首选项值。当我更新相关首选项值时,我也会更新 session 值。当我检查 session 值首选项中的值时,如果它等于当前 session 值,则尚未重新启动。如果当前 session 值与保存的值不同,则表示已重新启动。不幸的是,我已经研究文档很长一段时间了,试图找到 session 值,但我找不到任何东西。
我需要以下两件事中的一件事的帮助。如果您可以提供我在哪里可以找到类似于 session ID 或启动 ID 的值,那么我将使用我的算法。或者,我愿意接受另一种算法来解决问题。非常感谢!
最佳答案
这太老了,但我认为我有一个很好的解决方案,不需要运行任何服务或任何特殊的后台进程。
只需将时间保存到持久内存中,例如共享首选项。这可以在您需要的任何引用时间执行。对我来说,这是在启动计时器时,这样即使在重新启动后它也能持续存在。天文计时器仅与 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 语句末尾显示 <100。这给了应用程序 100 毫秒的时间来运行数学。实际上,它需要大约 1 毫秒,但手机不可能在少于 100 秒的时间内重新启动,因此这是一个安全值。
关于android - 判断手机是否重启过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27562179/