在特定时间停止服务

Posted

技术标签:

【中文标题】在特定时间停止服务【英文标题】:Stop a service at specific time 【发布时间】:2013-05-10 09:44:48 【问题描述】:

我正在重复使用以下代码开始我的服务。我的服务每天早上 8 点开始。并且 AlarmManager 每 1 分钟重复一次。我想在下午 6 点停止这项服务。我该怎么做?

    AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    PendingIntent loggerIntent = PendingIntent.getBroadcast(this, 0,new Intent(this,AlarmReceiver.class), 0);

    Calendar timeOff9 = Calendar.getInstance();
    timeOff9.set(Calendar.HOUR_OF_DAY, 08);
    timeOff9.set(Calendar.MINUTE, 00);
    timeOff9.set(Calendar.SECOND, 00);
    //--------------------------------------------------------------------------------------------------------------------
    long duration = userinterval * 60 * 1000;
    manager.setRepeating(AlarmManager.RTC_WAKEUP,timeOff9.getTimeInMillis(), duration, loggerIntent);

【问题讨论】:

How to cancel this repeating alarm? 的可能重复项 【参考方案1】:

为了在下午 6 点准确取消,我会考虑 2 个选项:

    每次触发警报(即每 1 分钟),检查时间,如果时间在下午 6 点之后,则取消。 在 AlarmManager 中设置一次性警报,以准确在下午 6 点响起。在那个闹钟中,取消。

出于简单性和每个代码块的模块化,我更喜欢选项 2。所以对我来说,我会在我的概念验证代码中使用 (2),同时研究解决方案。

但从资源的角度来看,选项 1 更好,因为 android 系统只需要记住一个警报。我会在我的最终生产代码中使用 (1)。

这种工作方式只是我个人的偏好,大多数人可能会说从一开始就使用 (1)。

关于取消的详情如下...


至于如何取消闹钟,@commonsware 的回答你不会经常被击败......

以下答案复制自How to cancel this repeating alarm?


AlarmManager 上调用cancel(),并使用与setRepeating() 相同的PendingIntent

Intent intent = new Intent(this, AlarmReceive.class);
PendingIntent sender = PendingIntent.getBroadcast(this,
               0, intent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

alarmManager.cancel(sender);

【讨论】:

这段代码应该在我开始 AlarmManagr 的活动中。对吗?但是如何在下午 6 点准确取消。 我已经更新了答案,提供了 2 种常用方法来了解何时取消。 我从来没有想过这两种方法中的任何一种。谢谢!

以上是关于在特定时间停止服务的主要内容,如果未能解决你的问题,请参考以下文章

系统日志显示:wampapache 服务因函数不正确.服务特定错误而停止. 怎么办?求助!

如何远程启动和停止服务

后台服务中的 Task.Run 意外停止工作

为啥当主应用停止时我的小部件广播接收器服务停止

如何使用 UIButton 停止特定功能?

JWT:多客户端身份验证服务器,停止在不同客户端之间使用 jwt?