Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何让计时器在后台运行以在特定时间段后执行操作?_Java_Android_Android Studio - Fatal编程技术网

Java 如何让计时器在后台运行以在特定时间段后执行操作?

Java 如何让计时器在后台运行以在特定时间段后执行操作?,java,android,android-studio,Java,Android,Android Studio,我有一个按钮,每天5个,每月30个。每次单击时,它将从每日剩余和每月剩余减少1。单击5次后,每天剩余的单击次数为0,每月剩余的单击次数为25次。如何在后台每24小时将此计数器重置为5,即使应用程序未运行或设备未打开。30天后(一个月)我该怎么做呢。目前,我正在使用SharedReferences在需要时更新这些值。但我希望这种情况定期发生,而不是每次应用程序启动时 sharedPreferences.edit().putInt("dailyRemaining", dailyRemaining).

我有一个按钮,每天5个,每月30个。每次单击时,它将从每日剩余和每月剩余减少1。单击5次后,每天剩余的单击次数为0,每月剩余的单击次数为25次。如何在后台每24小时将此计数器重置为5,即使应用程序未运行或设备未打开。30天后(一个月)我该怎么做呢。目前,我正在使用SharedReferences在需要时更新这些值。但我希望这种情况定期发生,而不是每次应用程序启动时

sharedPreferences.edit().putInt("dailyRemaining", dailyRemaining).apply(); //5
sharedPreferences.edit().putInt("monthlyRemaining", monthlyRemaining).apply(); //30

要在特定时间段后执行任何任务,必须参考android work manager或android job

工作经理[]

Evernote android作业[]


希望它能对你有所帮助。

要想在特定时间段后执行任何任务,你必须咨询安卓工作经理或安卓工作

工作经理[]

Evernote android作业[]


希望它能帮助您。

为了每24小时重置一次值,您可以使用
AlarmManager
。使用它,您可以计划服务的执行,该服务将重置
SharedReferences
中的值。但是
AlarmManager
有问题,一旦手机重新启动,你必须重新安排时间。别担心,这解释了如何处理所有这些事情


您还可以使用新的API+手动使用它

为了每24小时重置一次值,您可以使用
AlarmManager
。使用它,您可以计划服务的执行,该服务将重置
SharedReferences
中的值。但是
AlarmManager
有问题,一旦手机重新启动,你必须重新安排时间。别担心,这解释了如何处理所有这些事情


您还可以使用新的API+如何使用它这是一个相对简单的任务,可以在应用程序启动时在后台完成。实现和维护后台任务本身是一项艰巨的工作,因此,如果您不需要在日期更改时在后台执行任何操作(如发送通知或将该信息发送到后端等),我建议您在UI级别保持简单。

您可以在主
活动中执行类似操作
或覆盖
应用程序
类,然后在其中执行操作):


上面所做的是将一个
设置为今天的日期和当前月份,这对于每一天和每个月都是唯一的。只需在此基础上检查您的剩余限制。

这是一项相对简单的后台任务,只需在应用程序启动时执行即可。实现和维护后台任务本身是一项艰巨的工作,因此,如果您不需要在日期更改时在后台执行任何操作(如发送通知或将该信息发送到后端等),我建议您在UI级别保持简单。

您可以在主
活动中执行类似操作
或覆盖
应用程序
类,然后在其中执行操作):


上面所做的是将一个
设置为今天的日期和当前月份,这对于每一天和每个月都是唯一的。只需在此基础上检查您的剩余限制。

如果用户更改了其本地日期和时间,这将影响一切的工作方式?另外,我如何将其转换为Java,抱歉,有点新DateTimeFormatters还需要最低SDK版本26>,这对我来说是一个问题,无论您选择何种实现,如果您仅在设备上本地存储内容,而未通过后端联机验证日期,则可以,用户将能够更改设备日期,再次使用按钮开始。您需要某种方法在线验证日期,以检查其是否有效或是否已更改。如果您没有后端,我相信还有其他方法可以在线检查。这是一个非常常见的问题,可能已经解决了。其次,请参阅我更新的Java代码答案。第三,我以前的代码只是给出了使用库获取日期作为键的概念,我通常在我的项目中使用库来获取日期。我添加了一个代码片段,它使用了自一开始就存在的
SimpleDateFormat
。使用
SimpleDataFormat
online进行一点搜索,看看如果我提供的代码不起作用,它可以以不同的方式使用,因为它是我从内存中编写的唯一存根代码,希望它能立即起作用。希望有帮助。如果用户更改其本地日期和时间,这将影响一切的工作方式?还有,我如何将其转换为Java,抱歉有点新DateTimeFormatters还需要最低SDK版本26>,这对我来说是一个问题首先,无论您选择什么实现,如果您仅在设备上本地存储内容,而未通过后端联机验证日期,则可以,用户将能够更改设备日期,再次使用按钮开始。您需要某种方法在线验证日期,以检查其是否有效或是否已更改。如果您没有后端,我相信还有其他方法可以在线检查。这是一个非常常见的问题,可能已经解决了。其次,请参阅我更新的Java代码答案。第三,我以前的代码只是给出了使用库获取日期作为键的概念,我通常在我的项目中使用库来获取日期。我添加了一个代码片段,它使用了自一开始就存在的
SimpleDateFormat
。使用
SimpleDataFormat
online进行一点搜索,看看如果我提供的代码不起作用,它可以以不同的方式使用,因为它是我从内存中编写的唯一存根代码,希望它能立即起作用。希望能有帮助。
// Build today date and current month strings which will be used as keys
String todayDate = getDateFromFormat("dd-MM-yyyy");
String currentMonth = getDateFromFormat("MM-yyyy");

// Try to get the remaining limit from sharedpreferences, and give them default
// values if they don't exist yet
int remainingForToday = sharedPreferences.getInt(todayDate, 5);
int remainingThisMonth = sharedPreferences.getInt(currentMonth, 30);

// When the user clicks on the button, decrement and save the remaining 
sharedPreferences.edit().putInt(todayDate, remainingForToday - 1).apply();
sharedPreferences.edit().putInt(currentMonth, remainingThisMonth - 1).apply();

// Utility function to get the date time strings using native Java classes
private String getDateFromFormat(String format) {
    Calendar today = Calendar.getInstance();
    SimpleDateFormat formatter = new SimpleDateFormat(format);
    return formatter.format(today.getTime());
}