首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Alarm Manager意外广播

Alarm Manager意外广播
EN

Stack Overflow用户
提问于 2018-04-05 06:13:43
回答 1查看 91关注 0票数 0

我有一个应用程序,它应该在数据库中存储的指定时间触发警报。时间以(HH:mm)格式存储,24小时格式。

下面是代码。

代码语言:javascript
复制
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String temp = h+":"+m;
Date date = sdf.parse(temp);
alarmMgr = (AlarmManager)_c.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(_c, AlarmBroadcastReciever.class);
alarmIntent = PendingIntent.getBroadcast(_c, requestCode, intent, 0);
alarmMgr.set(AlarmManager.RTC_WAKEUP,Calendar.getInstance().getTimeInMillis()+  date.getTime(), alarmIntent);

_c:上下文变量h是小时(24小时格式),m是分钟。

我想在凌晨4:30拉响闹钟,但是它在凌晨3:09:35就响了。

如何在特定时间只安排一次警报(不重复)?

PS:我倾向于使用警报,因为应用程序需要在基于数据库查询的动态时间内重复警报。

EN

回答 1

Stack Overflow用户

发布于 2018-04-05 22:36:21

代码语言:javascript
复制
    int h = 4;
    int m = 30;
    LocalTime alarmTime = LocalTime.of(h, m);
    ZoneId zone = ZoneId.of("Asia/Kolkata");
    long alarmTimeMillis = LocalDate.now(zone)
            .atTime(alarmTime)
            .atZone(zone)
            .toInstant()
            .toEpochMilli();
    System.out.println(alarmTimeMillis);
    System.out.println(Instant.ofEpochMilli(alarmTimeMillis));

当我今天运行它的时候,输出是

代码语言:javascript
复制
1522882800000
2018-04-04T23:00:00Z

为了检查1 522 882 800000的毫秒值是否正确,我将其转换为Instant。Instants始终以UTC格式打印,因此打印的时间与亚洲/加尔各答时区的4:30 AM一致(偏移量+05:30)。您可能希望添加一个检查,以查看时间是否已过,如果已过,则添加一天,以便在明天的指定时间发出警报。对于这一点,LocalDate和其他一些类有一个plusDays方法。

如果您从数据库中以类似04:30的字符串形式获得闹钟时间,请按如下方式进行解析:

代码语言:javascript
复制
    String alarmTimeString = "04:30";
    LocalTime alarmTime = LocalTime.parse(alarmTimeString);

其余的都是一样的。

我正在使用并推荐java.time,这是一种现代的Java date and time API。因为SimpleDateFormat是出了名的麻烦,它的朋友DateCalendar也早就过时了。现代的API使用起来要好得多。

你的代码出了什么问题?

您在计算告警时间时有两个错误:

  1. 虽然您的解析生成一个Date,它打印为例如Thu Jan 01 04:30:00 IST 1970,因此看起来是正确的,这是欺骗性的。4:30:00在你当地的时区。当您使用date.getTime()时,您将获取自纪元以来的毫秒数,并且纪元是以协调时制定义的,而不是以您的时区定义的。例如,我使用亚洲/加尔各答时区,得到的毫秒数是-3 600 000,等于-1 hour.
  2. Calendar.getInstance().getTimeInMillis()给出的时间。在将毫秒数添加到此时间时,您可以指定从现在起的毫秒数的警报时间-在我的示例中是1小时前的警报时间。

问:我可以在安卓系统上使用java.time吗?

是的,java.time在旧的和新的安卓设备上都能很好地工作。它只需要至少Java 6即可。

  • 在Java8或更高版本以及更新的安卓设备上内置了现代的应用程序接口。Java6和7中的
  • 获得了ThreeTen后端口,这是新类的后端口(JSR310的ThreeTen;请参阅底部的链接)。(较早的)安卓系统上的
  • 使用的是ThreeTen后端口的安卓版本。它被称为ThreeTenABP。并确保使用subpackages.

org.threeten.bp导入date和time类

链接

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49661237

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档