【问题标题】:Detect user change clock time after Force Stop app在强制停止应用程序后检测用户更改时钟时间
【发布时间】:2018-04-19 10:56:15
【问题描述】:

我可以通过使用android.intent.action.TIME_SET关注here来检测应用程序在前台、后台或从Recent App杀死时更改时钟时间。
但是,如果我在 Setting->AppsForce Stop 应用程序,我将无法再收到此广播。
目前,我想检测用户更改时钟时间在 ForceStop 之后回到我的应用程序,所以我这样做了

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

我的想法是我在当前时间 (System.currentTimeMillis()) 和重启后的时间 (SystemClock.elapsedRealtime()) 之间保存了一个增量。每次打开app,我都会比较oldDelta和newDelta(第一次安装除外)。在以下情况下效果很好:用户Fore Stop app->更改时间->返回应用程序。

但是,仍然有1个案例是:用户Fore Stop app -> 更改时钟时间-> 重启设备-> 打开我的应用程序。此时我无法使用上述方法检查时钟时间是否已更改,因为重启后SystemClock.elapsedRealtime() 将重置。在这种情况下,如何检测时钟时间已更改?
任何帮助或建议将不胜感激。

【问题讨论】:

  • 所以基本上你声称,如果用户强制停止你的应用程序,那么通过清单磁贴注册的广播接收器不会被触发?
  • 使用远程时间服务器可以吗?
  • @SonTieu 不幸的是,我的应用可以在没有互联网连接的情况下运行,因此使用远程服务器不是最佳方式
  • 制作不同的服务应用并在后台安装
  • 建议使用服务器检查设备时间设置,如worldclockapi.com/api/json/utc/now,(或者您可以提供自己的api)。您的逻辑将变得更加简单和可靠。缺点:需要网络

标签: java android time broadcastreceiver clock


【解决方案1】:

几个月前,我的情况几乎相同。我没有找到任何直接解决此案的答案,所以我不会帮你。但我可以给你一些建议:
换个角度看。

在我的案例中,我回答了自己的问题:

“我真的想知道用户更改了时间吗?因为我隐含地向用户告知/呈现了这一事实?”

“我是否想知道用户更改了时间 - 因为我需要它在应用程序后台调用一些操作或计算?”

就我而言,我的答案是 NO-YES。因此,对于 Force-Stop + reboot 的问题情况,我假设时间可能已更改,并且我重置了我的应用程序的时间配置,就像第一次启动应用程序一样。

如果它对你有帮助,请告诉我。

【讨论】:

  • 感谢您的最佳建议。不幸的是,在我的情况下,我需要确切地知道用户何时更改时间(这是一个步行游戏,基于时间有一些小的实际奖励,所以我们不希望用户更改时间来欺骗)。目前我们允许用户在没有互联网的情况下在后台玩游戏,如果我们找不到检查用户是否确实更改时间的解决方案,我们可能会停止允许用户在后台玩游戏。
【解决方案2】:

如果没有外部标准具,将很难实现(后端是最佳选择)。您可以节省用户强制停止应用程序的时间,并在应用程序再次运行时与某个预定义的增量(时间窗口)进行比较。如果您得到“大”差异,则认为用户在作弊。

您也可以使用文件系统的时间戳来定义一些不一致。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-31
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 2017-09-05
    • 2015-10-30
    相关资源
    最近更新 更多