在Android上每次启动后运行一次代码

Dav*_*sey 13 android

我需要一些初始化代码才能在每次重启后尽快运行一次,然后在设备运行时再也不会再运行一次.

  • 存储指示代码已运行的SharedPreference不合适,因为它可以在重新启动后继续存在.
  • 依赖于ACTION_SHUTDOWN清除SharedPreference值是不够好的,因为有时候不会发送它(例如电池被移除).
  • 使用静态字段来指示代码已运行是不合适的,因为如果我的应用程序被杀死,它将被重置.
  • 在我的Application类中使用一些初始化代码是不合适的,因为如果我的应用程序被杀死,这将再次运行.
  • 接收ACTION_BOOT_COMPLETED几乎已经足够好了,但这可以在我的应用响应的其他广播之前(例如ACTION_TIME_CHANGED),并且可以在我已经从启动器启动我的应用程序之后被解雇.我需要这个一次性设置代码才能运行.
  • 我不能依靠System.currentTimeMillis计算启动时间,因为时钟更改会改变明显的启动时间.

一种选择是获取设备的最后启动时间,看看是否已经改变(System.elapsedTime()不够好).我尝试过执行类似的命令who -b,last reboot但两者都拒绝了权限.

另一种选择是在某个地方存储设置/首选项,只有在设备重新启动时它才会被重置,但如果我的应用程序被杀死则不会.

是否有其他选择,或实施上述方法之一?

Har*_*han 7

所以你想在任何其他应用程序执行开始之前在系统启动时运行代码吗?

如果是,那么就是这个想法,为ACTION_BOOT_COMPLETED创建一个接收器,并将优先级设置为999,这是最高的,所以这将在设备启动时始终触发.


Dav*_*sey 6

我找到了一个似乎可靠并符合我要求的解决方案.我读取了文件的内容,/proc/sys/kernel/random/boot_id每次重启设备时都会重置唯一的引导标识符.

通过阅读这个文件并比较值,以一个存储在SharedPreferences,我能够可靠地确定设备是否已自从上次我跑我的初始化代码被重新启动,而不依赖于设备的时钟.这适用于所有用户配置文件,因为它们都有自己的SharedPreferences.

这种方法的优点是,每当我收到任何广播和我的应用程序启动时,我都可以检查更改,因此无论先发生什么,我都可以运行初始化,即使ACTION_BOOT_COMPLETED广播被延迟或丢失(在慢速设备上常见) ).

遗憾的是没有其他的答案提供了可靠的方法来做到这一点,但Hardik肖汉的意图过滤优先尖是有益的,因为我收到ACTION_BOOT_COMPLETED与集要早得多.