Измерьте прошедшее время (с перезагрузками) на Android

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

Насколько я понимаю, System.nanoTime() сбрасывается каждый раз при перезагрузке устройства, а System.currentTimeMillis() ненадежен, потому что пользователь может его изменить.

Единственное решение, которое я придумал, это прослушать ACTION_SHUTDOWN и BOOT_COMPLETED, использовать System.currentTimeMillisec() для расчета прошедшего времени (надеюсь, пользователь не может изменить время на часах, когда устройство выключено :)) и добавить его к последним System.nanoTime(), которые у меня были. перед выключением.

Честно говоря, мне не нравится это решение, потому что оно очень дорогое (мне нужно прослушать 2 трансляции) и неточное, но я не мог придумать другого способа сделать это.

Любые идеи? Также нативное решение было бы хорошо для меня.


person dmarcato    schedule 10.12.2013    source источник
comment
Я не думаю, что есть лучший способ. Как минимум вам придется прослушать две системные трансляции: BOOT_COMPLETED и ACTION_SHUTDOWN. Вы можете оптимизировать остальные вещи вокруг этих двух. Но это минимум, что вам нужно сделать, я считаю.   -  person VJ Vélan Solutions    schedule 11.12.2013
comment
stackoverflow.com/questions/3523442 / это должно быть время позади этих двух. Устройства Android будут самостоятельно настраивать System.currentTimeMillisec() на основе внешних источников времени (возможно, NTP, GSM, GPS,?) — вмешательство пользователя не требуется и, возможно, при загрузке (т. е. до BOOT_COMPLETED). Вы также можете использовать внешнюю службу времени, но для этого требуется доступ к сети.   -  person zapl    schedule 11.12.2013
comment
Пользователь, который хочет переопределить часы платформы, чтобы победить вас, вполне вероятно, является пользователем, который может просто перехватить/исправить любые системные вызовы, которые вы используете, чтобы прочитать их в любом случае.   -  person Chris Stratton    schedule 11.12.2013


Ответы (1)


Вы можете обойти изменение времени пользователем, используя сервер времени в Интернете, чтобы получить время, когда вы проверяете. Есть несколько способов сделать это.

Если вы просто сохраните это значение, пользователь ничего не сможет сделать, чтобы испортить ваш расчет.

person David S.    schedule 10.12.2013
comment
Ваша идея, безусловно, верна, но я искал что-то, что не добавляет накладных расходов, поэтому использование NTP для меня не подходит. - person dmarcato; 17.12.2013
comment
Насколько мне известно, нет решения по телефону, которое гарантированно будет правильным временем, если вы не можете каким-то образом получить временную метку от оператора. Насколько я вижу, это не раскрыто. Как вы, наверное, знаете, радио — это, по сути, отдельная операционная система. - person David S.; 17.12.2013