关于android:识别应用启动Java 30天后

Identify 30 days after the app has launched Java

如何在用户首次启动应用程序 30 天后弹出警告对话框。

我想在使用该应用程序 30 天后显示一个警报对话框,访问日历的方法有效,但是当用户使用设置更改手机日期时,该方法失败。

这个工作的空闲方式是什么?这可以使用 Sessions、Handlers 或 Runnable 方法来实现吗?

相关讨论

  • 不。使用处理程序不是一个好主意。只需获取 Epoch 并将其保存在共享首选项之类的位置,然后每次检查它,如果是一个月后。

在首次启动应用程序时,获取当前纪元时间并将其保存在共享首选项中,例如 FIRST_LAUNCH_SECONDS。在每次后续启动时,检查当前纪元时间是否比 FIRST_LAUNCH_SECONDS 大 2592000 秒。 (30 天 = 2592000 秒)

在主Activity onCreate中,调用如下方法:

void showAlertAfterOneMonth(){
    long currentTime = System.currentTimeMillis() / 1000;      //in seconds

    SharedPreferences prefs = getSharedPreferences("SHARED_PREF", MODE_PRIVATE);
    long firstLaunchTime = pref.getLong("FIRST_LAUNCH_SECONDS", currentTime)
    long isAlertShown = pref.getBoolean("ALERT_SHOWN", false)

    if (isAlertShown){
        // alert has already been shown once after one month. so do nothing.
        return
    }
    else if (currentTime - firstLaunchTime == 0){
        // this is first launch, set the time in shared preference
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putString("FIRST_LAUNCH_SECONDS", currentTime);
        editor.commit();
    }
    else if(currentTime - firstLaunchTime >= 2592000){
        // one month has completed after first launch, show alert.

        // Save a flag in shared preference so that alert will be shown
        // only ONCE after one month is completed.
        SharedPreferences.Editor editor = sharedPreferences.edit();
        editor.putBoolean("ALERT_SHOWN", true);
        editor.commit();
    }
}

但是,如果重新安装应用程序或清除应用程序缓存,共享首选项将被清除。

更新:显然,如果用户更改系统时间,currentTimeMillis 会发生变化。如果您想要更简单的解决方案,可以使用 System.nanoTime() 而不是 System.currentTimeMillis()。

相关讨论

  • 这并不能解决时间更改技巧。用户可以稍后设置时间。然后它不会在所需的时间开始。
  • 哦,可以。我只是把它写成了我的程序。我获得了 System.currentTimeMillis() 并记录了它。一个月后我第二次设置时间,我在Logcat中的号码改变了一个月。去尝试一下!
  • 你是对的 System.nanoTime() 不会因为改变挂钟而改变。但我计算了它的起源,它只是在 4.5 小时前。

为了避免用户修改日期,您必须从时间服务器获取时间。

这篇文章会帮助你:

如何在android中从互联网上获取当前时间

因此,对于其余部分,您可以将从时间服务器获取的时间保存在您的共享首选项或此处??提到的任何其他方法中:

如何在 Android 应用中本地存储数据

然后您可以在启动应用程序时运行检查,或者,如果应用程序连续运行 30 天,您可以设置一个带睡眠的后台线程/异步任务,以便定期检查它。

可能使用 asynctask 和 while 循环不是一个好习惯,所以我会在线检查最佳解决方案。

关于user9828889的回答的评论,除了在线查看当前时间,您似乎没有其他解决办法。

相关讨论

  • 你对此有何看法:我曾经安装过 Photoshop,然后当它开始我的免费试用计数时,我将时间设置得稍晚一点,因此我的免费试用期更长,但即使我没有连接到互联网,它也不起作用.

我猜您将第一天的日期保存在文件或数据库中的某个位置。为什么您不从在线时钟而不是设备中获取日期。这是一个例子:
如何让我的 java 应用程序从一些在线时钟获取全球时间

您只需将日期保存在文件中,并在用户每次打开应用程序时将其与当前时间(来自服务器)进行比较。

相关讨论

  • 那么它应该是在线的。难道没有办法离线做到这一点???

以上是关于android:识别应用启动Java 30天后的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>