Обнаружение изменения часов пользователя после приложения Force Stop

Я могу определить время изменения часов, когда приложение находится на переднем плане, в фоновом режиме или убивает из Recent App, используя android.intent.action.TIME_SET, следуя здесь.
Однако, если я Force Stop приложение в Настройки->Приложения Я больше не могу получать эту трансляцию.
В настоящее время я хочу, чтобы время смены пользователя возвращалось в мое приложение после ForceStop, поэтому я делаю

long deltaTimeBeetweenCurrentTimeAndTimeSinceReboot = System.currentTimeMillis() - SystemClock.elapsedRealtime();
long oldDelta = mSharedPreference.getDeltaTimeBeetweenCurrentTimeAndTimeSinceReboot();
if(deltaTimeBeetweenCurrentTimeAndRebootTime - oldDelta > 5000){
    // clock time change
}

Идея в том, что я сохранил дельту между текущим временем (System.currentTimeMillis()) и временем после перезагрузки (SystemClock.elapsedRealtime()). Каждый раз, когда я открываю приложение, я сравниваю oldDelta и newDelta (кроме первой установки). Это хорошо работает в случае: Пользователь Fore Stop приложение-> Изменить время-> вернуться в приложение.

Тем не менее, все еще есть 1 случай: пользовательское приложение Fore Stop -> изменить время на часах -> перезагрузить устройство -> открыть мое приложение. В настоящее время я не могу использовать вышеуказанный метод, чтобы проверить, изменилось ли время часов, потому что после перезагрузки SystemClock.elapsedRealtime() будет сброшен. Как я могу определить, что время на часах изменилось в этом случае?
Любая помощь или предложение будут очень признательны.


person Linh    schedule 07.11.2017    source источник
comment
Таким образом, вы утверждаете, что если пользователь принудительно остановит ваше приложение, то приемник вещания, который был зарегистрирован через плитку манифеста, не будет запущен?   -  person azizbekian    schedule 09.11.2017
comment
Возможно ли это при использовании удаленного сервера времени?   -  person Son Tieu    schedule 15.11.2017
comment
@SonTieu, к сожалению, мое приложение может работать без подключения к Интернету, поэтому использование удаленного сервера не является оптимальным способом.   -  person Linh    schedule 15.11.2017
comment
сделать другое сервисное приложение и установить его в фоновом режиме   -  person parik dhakan    schedule 15.11.2017
comment
предложить использовать сервер для проверки настройки времени устройства, например worldclockapi.com/api/json/utc/now (или вы можете предоставить свой собственный API). ваша логика станет намного проще и надежнее. недостаток: нужна сеть   -  person Josh Lin    schedule 16.11.2017


Ответы (2)


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

Что я сделал в своем случае, я ответил себе на вопросы:

«Действительно ли я хочу знать, что пользователь изменил время, потому что я неявно сообщаю/представляю этот факт пользователю?»

OR

«Хочу ли я знать, что пользователь изменил время, потому что мне нужно, чтобы оно вызывало какие-то действия или вычисления в фоновом режиме приложения?»

В моем случае у меня были ответы НЕТ-ДА. Итак, для проблемного случая принудительной остановки + перезагрузки я предположил, что время могло быть изменено, и я сбросил конфигурацию времени моего приложения, как и при первом запуске приложения.

Дайте мне знать, если это поможет вам в любом случае.

person mariachi    schedule 15.11.2017
comment
Спасибо за лучшее предложение. К сожалению, в моем случае мне нужно точно знать, когда пользователь меняет время (это ходячая игра с небольшой реальной базой наград за время, поэтому мы не хотим, чтобы пользователь менял время, чтобы обмануть). В настоящее время мы разрешаем пользователям играть в фоновую игру без Интернета, если мы не сможем найти решение для проверки того, изменил ли пользователь время определенно, возможно, мы прекратим позволять пользователям играть в фоновую игру. - person Linh; 16.11.2017

Было бы сложно реализовать без внешнего эталона (бэкенд — лучший вариант). Вы можете сэкономить время, заставив пользователя остановить приложение и, когда приложение снова заработает, сравнить с некоторой предопределенной дельтой (временным окном). Если вы получаете «большую» разницу, считайте, что пользователь обманывает.

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

person Maxim G    schedule 16.11.2017