Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/219.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
Android 报警管理器意外广播_Android_Alarmmanager_Unix Timestamp_Milliseconds - Fatal编程技术网

Android 报警管理器意外广播

Android 报警管理器意外广播,android,alarmmanager,unix-timestamp,milliseconds,Android,Alarmmanager,Unix Timestamp,Milliseconds,我有一个应用程序,它应该在数据库中存储的指定时间触发警报。 时间以(HH:mm)格式存储,24小时格式 这是代码 SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); String temp = h+":"+m; Date date = sdf.parse(temp); alarmMgr = (AlarmManager)_c.getSystemService(Context.ALARM_SERVICE); Intent intent = ne

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

这是代码

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:我倾向于使用报警,因为应用程序需要根据数据库查询在动态时间重复报警

    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));
当我今天运行这个时,输出是

1522882800000
2018-04-04T23:00:00Z
为了检查1 522 882 800 000的毫秒值是否正确,我将其转换为一个
即时
。瞬间始终以UTC打印,因此打印的时间与亚洲/加尔各答时区的凌晨4:30一致(偏移量+05:30)。您可能需要添加一个检查,以查看时间是否已过,如果已过,请添加一天,以便在明天的指定时间发出警报
LocalDate
和其他一些类有一个
plusDays
方法

如果从数据库中以字符串形式获取报警时间,如
04:30
,请按如下方式解析:

    String alarmTimeString = "04:30";
    LocalTime alarmTime = LocalTime.parse(alarmTimeString);
其余的都一样

我正在使用并推荐
java.time
,这是一种现代的java日期和时间API。因为
SimpleDateFormat
是出了名的麻烦,它的朋友
Date
Calendar
也早已过时。现代的API非常好用

你的代码出了什么问题? 计算报警时间时有两个错误:

  • 虽然您的解析生成一个
    日期
    ,该日期打印为例如
    Thu Jan 01 04:30:00 IST 1970
    ,因此看起来是正确的,但这是欺骗。04:30:00在您当地的时区。当您使用
    date.getTime()
    时,您将获得自历元以来的毫秒数,历元是以UTC定义的,而不是在时区中定义的。例如,我使用亚洲/加尔各答时区,得到的毫秒数为-360000,等于-1小时
  • Calendar.getInstance().getTimeInMillis()
    给出现在的时间。将毫秒数添加到此时间中时,指定一个从现在开始的毫秒数的报警时间-在我的示例中是1小时前的报警时间
  • 问题:我可以在Android上使用java.time吗? 是的,
    java.time
    在较旧和较新的Android设备上运行良好。它至少需要Java6

    • 在Java8和更高版本以及更新的Android设备上,内置了现代API
    • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
    • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
      org.threeten.bp
      导入日期和时间类
    链接
    • 解释如何使用
      java.time
    • ,其中首先描述了
      java.time
    • ,java.time的后端口
    到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻
  • 当我今天运行这个时,输出是

    1522882800000
    2018-04-04T23:00:00Z
    
    为了检查1 522 882 800 000的毫秒值是否正确,我将其转换为一个
    即时
    。瞬间始终以UTC打印,因此打印的时间与亚洲/加尔各答时区的凌晨4:30一致(偏移量+05:30)。您可能需要添加一个检查,以查看时间是否已过,如果已过,请添加一天,以便在明天的指定时间发出警报
    LocalDate
    和其他一些类有一个
    plusday
    方法

    如果从数据库中以字符串形式获取报警时间,如
    04:30
    ,请按如下方式解析:

        String alarmTimeString = "04:30";
        LocalTime alarmTime = LocalTime.parse(alarmTimeString);
    
    其余的都一样

    我正在使用并推荐
    java.time
    ,这是一种现代的java日期和时间API。因为
    SimpleDateFormat
    是出了名的麻烦,它的朋友
    Date
    Calendar
    也早已过时。现代的API非常好用

    你的代码出了什么问题? 计算报警时间时有两个错误:

  • 虽然您的解析生成一个
    日期
    ,该日期打印为例如
    Thu Jan 01 04:30:00 IST 1970
    ,因此看起来是正确的,但这是欺骗。04:30:00在您当地的时区。当您使用
    date.getTime()
    时,您将获得自历元以来的毫秒数,历元是以UTC定义的,而不是在时区中定义的。例如,我使用了亚洲/加尔各答时区,得到的毫秒数为-360000,等于-1小时
  • Calendar.getInstance().getTimeInMillis()
    给出现在的时间。将毫秒数添加到此时间中时,指定一个从现在开始的毫秒数的报警时间-在我的示例中是1小时前的报警时间
  • 问题:我可以在Android上使用java.time吗? 是的,
    java.time
    在较旧和较新的Android设备上运行良好。它至少需要Java6

    • 在Java8和更高版本以及更新的Android设备上,内置了现代API
    • 在Java6和Java7中,获取三个后端口,即新类的后端口(三个用于JSR310;请参阅底部的链接)
    • 在(较旧的)Android上使用Android版本的ThreeTen Backport。它叫ThreeTenABP。并确保从带有子包的
      org.threeten.bp
      导入日期和时间类
    链接
    • 解释如何使用
      java.time
    • ,其中首先描述了
      java.time
    • ,java.time的后端口
    到Java6和Java7(JSR-310为三十)
  • ,Android版Three Ten Backport
  • ,解释得非常透彻
  • 这部分是时间地带