检测用户在强制停止应用程序后更改了时钟时间

4

我可以使用 android.intent.action.TIME_SET 在应用程序在前台、后台或通过 最近使用的应用程序 来检测时钟时间的更改,参考这里
然而,如果我在 设置-> 应用 中强制停止应用程序,则无法再收到此广播。
目前,我希望在 ForceStop 后检测用户更改时钟时间并回到我的应用程序,因此我执行以下操作:

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

我的想法是我保存了当前时间(System.currentTimeMillis())和自上次重启以来的时间差(SystemClock.elapsedRealtime())。每次打开应用程序时,我都会比较旧的时间差和新的时间差(除了第一次安装)。在以下情况下它运行良好: 用户强制停止应用程序->更改时间->返回应用程序。

然而,仍然有一种情况: 用户强制停止应用程序->更改时钟时间->重新启动设备->打开我的应用程序。这时我无法使用上述方法检查时钟时间是否已更改,因为在重新启动后SystemClock.elapsedRealtime()将重置。如何在这种情况下检测时钟时间是否已更改?
任何帮助或建议都将不胜感激。


所以基本上你的说法是,如果用户强制停止了你的应用程序,那么通过清单文件注册的广播接收器将不会被触发? - azizbekian
在使用远程时间服务器时,是否可能? - Son Tieu
很遗憾,@SonTieu,我的应用程序可以在没有互联网连接的情况下工作,因此使用远程服务器并不是最佳方式。 - Linh
制作不同的服务应用程序并将其安装在后台。 - parik dhakan
1
建议使用服务器检查设备时间设置,例如 http://worldclockapi.com/api/json/utc/now(或您可以提供自己的 API)。这样,您的逻辑将变得更简单和可靠。缺点是需要网络连接。 - Josh Lin
2个回答

3
几个月前,我也遇到了类似的情况。我没有找到任何直接解决这个问题的答案,所以我不能帮助你。但是我可以给你一些建议:
用不同的角度看待它。

在我的情况下,我回答了自己的问题:

"我真的想知道用户是否更改了时间 - 因为我会向用户隐含地通知/呈现这个事实吗?"

OR

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

在我的情况下,我的答案是NO-YES。因此,在强制停止 + 重新启动的问题中,我假设时间可能已经被更改,并像第一次启动应用程序时一样重置了我的应用程序时间配置。

如果有帮助,请告诉我。


感谢您的建议。不幸的是,在我的情况下,我需要知道用户何时更改时间(这是一个步行游戏,根据时间进行一些小的真实奖励,因此我们不希望用户更改时间以欺骗)。目前,我们允许用户在没有互联网的情况下玩游戏,如果我们找不到检查用户是否明确更改时间的解决方案,或许我们会停止允许用户在后台播放游戏。 - Linh

1

如果没有外部基准(后端是最佳选择),实现起来会很困难。您可以节省用户停止应用程序的时间,并在应用程序重新启动时与某些预定义的增量(时间窗口)进行比较。如果差异很大,则认为用户正在作弊。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接