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

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 应用程序从一些在线时钟获取全球时间

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