android - 判断手机是否重启过

标签 android boot reboot android-reboot

我正在尝试检测自上次设置首选项值后 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/

相关文章:

linux - 如何自动登录 tty 并执行脚本

linux - 在 Linux 中重新启动处理

linux - NodeJS 永远无法在启动时工作

android - 为什么需要检查 OnCreate 内部的 savedInstanceState?

android - 如何在 Android 上使用 breakpad 将 dmp 文件上传到服务器?

mysql - 重启后无法连接到MySQL服务器: ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

boot - 启动后寄存器的状态

android - 使用 RecyclerView 进行双向滚动

java - Android Studio 启动卡在 gradle 运行中

android - 为什么我的应用会抛出 `android.permission.REBOOT SecurityException` ?