java - 确定应用程序启动 Java 后 30 天
问题描述
如何在用户首次启动应用程序 30 天后弹出警报对话框。
我想在使用该应用程序 30 天后显示一个警报对话框,访问日历的方法有效,但是当用户使用设置更改手机日期时,该方法失败。
这个工作的空闲方式是什么?这可以使用 Sessions、Handlers 或 Runnable 方法来实现吗?
解决方案
首次启动应用程序时,获取当前纪元时间并将其保存在共享首选项中,例如 FIRST_LAUNCH_SECONDS。在每次后续启动时,检查当前纪元时间是否比 FIRST_LAUNCH_SECONDS 大 2592000 秒。(30 天 = 2592000 秒)
在主活动 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()。
推荐阅读
- python - 返回“或响应”时会产生什么响应“process_response()”?
- vue.js - Vee-Validate 不使用表单向导
- asp.net-core - ASP.NET Core 3.1 中的 asp-action 不适用于端点路由
- r - 按组计算 dplyr 中具有先前值的字段
- mongodb - 如何计算我的产品在 mongodb 中的平均评分?
- javascript - nodemailer 发送带有特定接收者特定信息的邮件
- python - 用base64替换cid src
- python - 我正在尝试制作一个允许三个输入的程序,然后打印出最大的一个,但代码不起作用
- django - 处理表单中显示的 django ImageField 当前值
- python - 将边界框区域转换为遮罩并将其保存为 PNG 文件