Identify 30 days after the app has launched Java
如何在用户首次启动应用程序 30 天后弹出警告对话框。
我想在使用该应用程序 30 天后显示一个警报对话框,访问日历的方法有效,但是当用户使用设置更改手机日期时,该方法失败。
这个工作的空闲方式是什么?这可以使用 Sessions、Handlers 或 Runnable 方法来实现吗?
在首次启动应用程序时,获取当前纪元时间并将其保存在共享首选项中,例如 FIRST_LAUNCH_SECONDS。在每次后续启动时,检查当前纪元时间是否比 FIRST_LAUNCH_SECONDS 大 2592000 秒。 (30 天 = 2592000 秒)
在主Activity onCreate中,调用如下方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | 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()。
为了避免用户修改日期,您必须从时间服务器获取时间。
这篇文章会帮助你:
如何在android中从互联网上获取当前时间
因此,对于其余部分,您可以将从时间服务器获取的时间保存在您的共享首选项或此处??提到的任何其他方法中:
如何在 Android 应用中本地存储数据
然后您可以在启动应用程序时运行检查,或者,如果应用程序连续运行 30 天,您可以设置一个带睡眠的后台线程/异步任务,以便定期检查它。
可能使用 asynctask 和 while 循环不是一个好习惯,所以我会在线检查最佳解决方案。
关于user9828889的回答的评论,除了在线查看当前时间,您似乎没有其他解决办法。
我猜您将第一天的日期保存在文件或数据库中的某个位置。为什么您不从在线时钟而不是设备中获取日期。这是一个例子:
如何让我的 java 应用程序从一些在线时钟获取全球时间
您只需将日期保存在文件中,并在用户每次打开应用程序时将其与当前时间(来自服务器)进行比较。