自首次启动以来的时间

2022-09-01 23:30:49

我正在开发一个Android应用程序,并遇到了确定系统首次启动时间的问题。我的意思是我需要测量从设备首次启动已经经过了多少时间

我知道通过监听ACTION_BOOT_COMPLETED并在共享首选项中保存任何内容的解决方案,但我需要另一种解决方案,因为这个解决方案在某些情况下不起作用。也许有任何系统属性?

用例摘自讨论))

  1. 我从服务器收到的每个文件的文件名都包含一个时间戳System.currentMillis()
  2. 我比较这些时间戳,以确定哪个文件是最新的。
  3. 现在,用户提前几个月更改系统时间。
  4. 我仍然能够确定用户更改系统时间后下载的最新文件。
  5. 现在,用户将时间更改回原始设置。
  6. 在比较时间戳时,在步骤 4 上下载的文件始终胜出。

解决此问题的银弹将是自首次启动(恢复出厂设置后)算数秒的时间戳。就像每次启动后没有重置一样。不幸的是,到目前为止的答案告诉我们,这个银弹并不存在。SystemClock.elapsedRealtime()

但是,许多答案显示了如何解决此问题的各种选择。OneWorld123评论了每个答案,以及如何满足他的需求。


答案 1

也许有任何系统属性?

不确定系统属性,但有SystemClock类提供API来获得系统正常运行时间:

SystemClock.uptimeMillis() 其中

返回自启动以来的毫秒数,不计算深度睡眠中花费的时间

您也可以使用 SystemClock.elapsedRealtime(),

返回自启动以来的毫秒数,包括在睡眠状态下花费的时间

希望这有帮助。


答案 2

如果人们需要知道Android设备第一次启动的时间

最简单的方法是有一个应用程序

  • 安装在出厂映像中的
  • 配置为在引导期间运行
  • 在首次运行时将当前日期和时间记录到sharedPreference

随后,需要确定 Android 设备首次启动时间的任何其他应用都可以在设备的生存期内查找相应的 sharedPreference。(或者直到设备恢复出厂设置;此时,预安装的应用程序将在重新启动后将新的日期和时间写入共享首选项。


但是,如果无法在Android设备上预安装应用程序,那么一些潜在的解决方法是:

1. 作为根用户/超级用户

人们会查找已知在首次启动期间在Android设备上创建的目录/文件的时间戳。

2.作为常规应用程序,

使用标准 Android API 的一种简单解决方法是检查已知在首次启动期间安装的相应系统软件包的安装时间。

/* This returns the last time a package was installed */
PackageManager pm = context.getPackageManager();
PackageInfo pInfo = pm.getPackageInfo(<app-package-name>, 0);
return pInfo.firstInstallTime;

3.交替作为常规应用程序,

如果我们可以依赖在首次启动期间(并且永远不会再次)更新一次的特定包,我们可以检查其更新时间,如下所示:

/* This returns the last time a package was updated */
PackageManager pm = context.getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(<app-package-name>, 0);
String appFile = appInfo.sourceDir;
long installed = new File(appFile).lastModified();

推荐