2

我正在尝试检测自上次设置首选项值以来 Android 设备是否已重新启动。理想情况下,我想在android.permission.RECEIVE_BOOT_COMPLETED未经许可的情况下这样做。

我正在考虑这样做的一种方法是存储另一个包含某种会话 ID 的首选项值。当我更新有问题的偏好值时,我也会更新会话值。当我检查会话值的首选项中的值时,如果它等于当前会话值,则没有重新启动。如果当前会话值与保存的值不同,则表示已重新启动。不幸的是,我一直在研究文档很长一段时间,试图找到一个会话值,但我什么也找不到。

我想要两件事之一的帮助。如果您可以提供我可以找到类似于会话 ID 或引导 ID 的值的位置,那么我将使用我的算法。或者,我愿意接受另一种算法来解决问题。太感谢了!

4

2 回答 2

4

这太老了,但我认为我有一个很好的解决方案,不需要运行任何服务或任何特殊的后台进程。

只需将时间保存到持久内存中,例如共享首选项。这可以在您需要的任何参考时间执行。对我来说,这是在启动计时器时,这样即使在重新启动后它也能持续存在。计时表仅与 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 秒内重启,所以这是一个安全的值。

于 2021-03-04T02:16:06.677 回答
1

是的,您可以使用应用程序类和非静态广播接收器 ACTION_SHUTDOWN 来做到这一点。Application类启动分两种情况

  1. 安卓设备启动
  2. 您的应用程序在“强制关闭”后启动。

当收到 ACTION_SHUTDOWN 时,使用您的应用程序 Shared-preferences 或数据库保存布尔值 shutdown = true 当应用程序类启动时检查此布尔值。如果为真,则设备正在启动,否则用户强制您的应用停止。

要获取更多信息,您可以阅读我写的以下帖子并尝试我添加的代码示例

  1. 应用类
  2. 引导广播接收器(显示差异并且两者都启动)
  3. 关闭在应用程序类中注册的广播接收器
于 2015-04-12T19:59:41.880 回答