确定手机是否已重新启动

时间:2014-12-19 08:26:38

标签: android boot reboot android-reboot

我正在尝试检测自上次设置偏好设置值以来Android设备是否已重新启动。理想情况下,我希望在没有android.permission.RECEIVE_BOOT_COMPLETED权限的情况下执行此操作。

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

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

2 个答案:

答案 0 :(得分:0)

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

  1. Android设备启动
  2. 您的应用程序在“强制关闭”之后启动。
  3. 当收到ACTION_SHUTDOWN时,使用您的应用程序Shared-preferences或数据库来保存boolean shutdown = true 当应用程序类启动时检查此布尔值。如果是,那么设备正在启动,否则用户强制您的应用停止。

    要获得更多信息,您可以阅读我撰写的以下post并尝试代码example,其中,我添加了

    1. 申请类
    2. 启动广播接收器(显示差异并且两者都启动)
    3. 关闭在应用程序calss中注册的广播接收器

答案 1 :(得分:0)

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

只需将时间保存到永久内存中,例如共享首选项。这可以在您需要的任何参考时间执行。对我来说,它是在启动计时器时,以便即使在重新启动后它也可以持续存在。计时器仅与 SystemClock.elapsedRealtime() 相关,这是自上次启动以来的时间,因此您不能使用 System.currentTimeMillis(),这是自 Unix 纪元(UTC 时间 1970 年 1 月 1 日 00:00:00)以来的总时间).

如果您想检查手机是否仅在应用程序启动时重新启动,请将其添加到您的 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

delta 的 Delta:1490-900=590

重新启动后,最后一个数字将始终更高。重新启动后已经过了多久并不重要。差异只会变得更大,因为一个数字(Unix 时间)不断向前移动,另一个在重新启动时不断重置为零。我的示例使用非常小的数字以使其易于理解,但请记住,实数以毫秒为单位,并且自 1970 年以来已经过去了相当多的数字。这就是为什么我的代码在 if 语句的末尾显示 <100。这为应用程序提供了 100 毫秒的时间来运行数学运算。实际上,它需要更多的时间 1 毫秒,但手机不可能在 100 秒内重启,因此这是一个安全值。