Подтвердить что ты не робот

Время с момента первой загрузки

Я разрабатываю приложение для Android и сталкиваюсь с проблемой с определением начальной загрузки системы. Я имею в виду, мне нужно измерить, сколько времени уже прошло с первой загрузки устройства.

Я знаю о решении с прослушиванием ACTION_BOOT_COMPLETED и сохраняю что-либо в SharedPreferences, но мне нужно другое решение, потому что в некоторых случаях это не работает. Может быть, есть системное свойство?

Использовать случай (выдержка из discussion)

  • Имя файла, которое я получаю с сервера, содержит отметку времени взято из System.currentMillis()
  • Я сравниваю эти временные метки, чтобы определить, в каком файле находится самый последний.
  • Теперь пользователь меняет системное время на несколько месяцев вперед.
  • Я все еще могу определить самый текущий файл, загруженный после того, как пользователь изменил системное время.
  • Теперь пользователь меняет время на исходную настройку.
  • Файл, загруженный на шаге 4, всегда выигрывает при сравнении временных меток.

Серебряная пуля для решения этой проблемы будет временной меткой, которая отсчитывает секунды с момента первой загрузки (после factory reset). Также как SystemClock.elapsedRealtime(), но без reset после каждой загрузки. К сожалению, ответы до сих пор говорят нам, что этой серебряной пули не существует.

Однако многие ответы показывают множество вариантов решения этой проблемы. OneWorld123 прокомментировал каждый ответ, как это соответствует его потребностям.

4b9b3361

Ответ 1

Может быть, есть системное свойство?

Не уверен в системном свойстве, но есть класс SystemClock, который предоставляет API для обеспечения бесперебойной работы системы:

SystemClock.uptimeMillis(), который

Возвращает миллисекунды с момента загрузки, не считая времени, проведенного в глубоком сне.

Вы также можете использовать SystemClock.elapsedRealtime(), который

Возвращает миллисекунды с момента загрузки, включая время, проведенное во время сна.

Надеюсь, что это поможет.

Ответ 2

Если вам нужно знать , когда в первый раз загрузилось устройство Android,

Самый простой способ - иметь приложение

  • который установлен в образ factory
  • который настроен на запуск во время загрузки
  • который регистрирует текущую дату и время в sharedPreference при первом запуске

Впоследствии любые другие приложения, которые должны определить первое время загрузки устройства Android, могут найти соответствующий sharedPreference в течение всего срока службы устройства. (или до тех пор, пока устройство не будет factory - reset, после чего предварительно установленное приложение будет записывать новое время даты и времени в общую настройку после перезагрузки.)


Однако, если невозможно предустановить приложение на Android-устройстве, возможно, несколько возможных способов:

1. Как root/superuser

можно было найти временную метку каталога/файла, который, как известно, создается на устройстве Android во время первой загрузки.

2. В качестве обычного приложения

простой метод обхода, использующий стандартные API Android, - это проверить время установки соответствующего системного пакета, который, как известно, устанавливается во время первой загрузки.

/* 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();

Ответ 3

В ANDROID SDK есть 3 метода для: -

public static long  elapsedRealtime ()

Добавлен в уровень API 1

Возвращает миллисекунды с момента загрузки, включая время, проведенное во сне. Возвращает

прошло с миллисекунд с момента загрузки.

public static long elapsedRealtimeNanos ()

Добавлен в уровень API 17

Возвращает наносекунды с момента загрузки, включая время, проведенное во сне. Возвращает

прошедшие наносекунды с момента загрузки.

Для случая @oneWorld:

Вы можете использовать 2 подхода: -

1) При записи проверки, если некоторые данные имеют дату выше текущей даты, измените дату предыдущих данных на нечто меньшее, чем текущие данные и время, поэтому он вернет правильные последние данные.

2) Вы можете сохранить время на сервере и получить время оттуда и установить его.

Ответ 4

Если мы придерживаемся SDK, я не знаю метода, непосредственно предоставляющего эту информацию; но может быть способ получить эту информацию из других ресурсов. Опять же, если мы придерживаемся SDK, один "довольно надежный" вариант заключается в использовании статистики использования приложений, которую ОС Android сохраняет во время жизни устройства. То есть - метка времени для первой "статистики использования" когда-либо была сохранена.

Это, однако, явно не дает точной отметки времени "первой загрузки", поэтому это зависит от того, будет ли в вашем случае какое-то приближение. Как правило, проблема с статистикой использования заключается в том, что Andriod объединяет ее в периоды, отдаленные во времени, поэтому более старое устройство - это менее точная дата. Например, для моего текущего телефона, сначала загруженного 3 декабря 2014 года, агрегированная статистика использования сначала записывается 21 декабря 2014 года (для записи - к февралю 2016 года к моменту написания этой статьи). (Я должен признать, что я не знаю, как Android OS планирует агрегацию, и если она запланирована только 21 декабря каждый год или если она действительно немного близка к первому использованию устройства - я думаю, это легко для проверки с помощью любого другого устройства.)

Ниже приведен пример кода примера, показывающего UsageStatsManager, но, конечно, ему потребуется больше корректировок, чтобы устранить факт большей точности для более поздних периодов:

UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
Calendar year2013 = Calendar.getInstance(); year2013.set(2013, 0, 1);
List<UsageStats> stats = usageStatsManager.queryUsageStats(
    UsageStatsManager.INTERVAL_YEARLY, // or adjust for "younger" devices to get more precision - so, you'll probably need several queries
    year2013.getTimeMillis(),
    Calendar.getInstance().getTimeInMillis());
// now, first element in stats (if it is present at all) will point to the "earliest" statistics saved *for this interval* (yearly in this case)
// use UsageStats.getFirstTimeStamp() to get first known/saved usage

Обратите также внимание на то, что, как описано в SDK, UsageStatsManager требует PACKAGE_USAGE_STATS разрешения на системном уровне, поэтому вам нужно заставить пользователя принять его сначала в настройках:

Intent settingsIntent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(settingsIntent);

Надеюсь, что это поможет!

Ответ 5

Согласно вашему обсуждению: http://chat.stackoverflow.com/rooms/102325/discussion-between-ankitagrawal-and-oneworld, вам нужен монотонный счетчик, чтобы однозначно идентифицировать набор данных.

Для этого вы можете легко установить SharedPreference и увеличить это значение каждый раз, когда вам нужен новый идентификатор. Когда вам нужно знать, какой новый файл, просто сравните идентификаторы. Если проблема связана с тем, что этот счетчик получает reset после удаления приложения, обратитесь к: В андроиде есть способ сохранить SharedPreferences после удаления

Другим подходом, который может быть использован, является запрос метки времени от внешнего сервера.

Надеюсь, что это поможет; -)