【发布时间】:2015-11-16 16:37:04
【问题描述】:
我需要一些初始化代码在每次重新启动后尽快运行一次,然后在设备运行时不再运行。
- 存储表示代码已运行的 SharedPreference 并不合适,因为它可以在重新启动后继续存在。
- 依靠
ACTION_SHUTDOWN清除 SharedPreference 值是不够的,因为有时它不会被发送(例如,电池被移除)。 - 使用静态字段来指示代码已运行是不合适的,因为如果我的应用程序被终止,它将被重置。
- 在我的应用程序类中使用一些初始化代码是不合适的,因为如果我的应用程序被终止,这将再次运行。
- 接收
ACTION_BOOT_COMPLETED几乎就足够了,但这可以在我的应用响应的其他广播之前(例如ACTION_TIME_CHANGED),并且可以在我已经从启动器启动我的应用后触发。我需要在此之前运行这个一次性设置代码。 - 我不能依靠
System.currentTimeMillis来计算启动时间,因为时钟变化会改变明显的启动时间。
一种选择是获取设备的最后一次启动时间并查看它是否已更改(System.elapsedTime() 不够好)。我曾尝试执行诸如who -b 和last reboot 之类的命令,但两者的权限都被拒绝。
另一种选择是将设置/首选项存储在某个位置,仅当设备重新启动时才会重置,但如果我的应用程序被终止则不会。
是否有其他选择,或实现上述之一的方法?
【问题讨论】:
-
能否请您转述一下,您为什么不能只使用 ACTION_BOOT_COMPLETED?
-
我认为
ACTION_BOOT_COMPLETED是您最好的选择。如果您的应用在此之前收到任何其他广播,例如ACTION_TIME_CHANGED,您可以在接收到ACTION_BOOT_COMPLETED广播后进行任何初始化之后,将必要的任务排队运行。 -
感谢 Mike,但不幸的是,第一时间运行代码很重要,这通常在发送 ACTION_BOOT_COMPLETED 之前。
-
@DaveMorrissey 您可以在您的应用收到的第一个广播上运行初始化,而不管操作如何,但您又遇到了确定上次启动的问题。但是,在启动过程的早期,唯一会启动您的应用的是系统广播。
-
似乎不能保证。在收到启动完成事件之前,我最多可以在 20 秒内从启动器打开应用程序。我也会为 ACTION_USER_PRESENT 设置一个接收器 - 这会有所帮助。
标签: android