首次启动时间

use*_*033 22 java time android clock system-clock

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

我知道有关侦听ACTION_BOOT_COMPLETED的解决方案并在SharedPreferences中保存任何内容,但我需要另一个解决方案,因为这个解决方案在某些情况下不起作用.也许有任何系统属性?

用例(摘自讨论)

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

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

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

ozb*_*bek 13

也许有任何系统属性?

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

SystemClock.uptimeMillis() 哪一个

返回自引导以来的毫秒,不计入深度睡眠所花费的时间.

你也可以用SystemClock.elapsedRealtime()哪个

返回自引导以来的毫秒数,包括在睡眠中花费的时间.

希望这可以帮助.

  • 这些提供自上次启动以来的时间 (4认同)

The*_*ist 8

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

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

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

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


但是,如果无法在Android设备上预安装应用程序,那么可能会有以下几种解决方法:

1.作为root /超级用户

可以在首次启动期间查找已知在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;
Run Code Online (Sandbox Code Playgroud)

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();
Run Code Online (Sandbox Code Playgroud)