Android闹钟程序周期循环提醒源码(AlarmManager)
来源:互联网 发布:猪八戒考试出题软件 编辑:程序博客网 时间:2024/06/01 15:03
Android系统提供了AlarmManager类来管理闹钟定时提醒任务。通过AlarmManager实现定时提醒及定时循环提醒。那么,AlarmManager类可以应用到以下场景:
1、定时循环启动组件(Component,如Activity、BroadcastReceiver),这样能替代在后台启动Service进行定时提醒任务
2、实现闹钟的按小时、天、周等形式的定时循环提醒功能。
定时启动组件很简单,下面贴出闹钟按天、周形式的定时循环提醒功能的核心代码。此功能核心的是计算出下一次闹钟提醒时间,代码如下:
/* * 闹钟三种设置模式(dateMode): * 1、DATE_MODE_FIX:指定日期,如20120301 , 参数dateValue格式:2012-03-01 * 2、DATE_MODE_WEEK:按星期提醒,如星期一、星期三 , 参数dateValue格式:1,3 * 3、DATE_MODE_MONTH:按月提醒,如3月2、3号,4月2、3号, 参数dateValue格式:3,4|2,3 * * startTime:为当天开始时间,如上午9点, 参数格式为09:00 */public static long getNextAlarmTime(int dateMode, String dateValue, String startTime) { final SimpleDateFormat fmt = new SimpleDateFormat(); final Calendar c = Calendar.getInstance(); final long now = System.currentTimeMillis(); // 设置开始时间 try { if(Task.DATE_MODE_FIX == dateMode) { fmt.applyPattern("yyyy-MM-dd"); Date d = fmt.parse(dateValue); c.setTimeInMillis(d.getTime()); } fmt.applyPattern("HH:mm"); Date d = fmt.parse(startTime); c.set(Calendar.HOUR_OF_DAY, d.getHours()); c.set(Calendar.MINUTE, d.getMinutes()); c.set(Calendar.SECOND, 0); c.set(Calendar.MILLISECOND, 0); } catch (Exception e) { e.printStackTrace(); } long nextTime = 0; if (Task.DATE_MODE_FIX == dateMode) { // 按指定日期 nextTime = c.getTimeInMillis(); // 指定日期已过 if (now >= nextTime) nextTime = 0; } else if (Task.DATE_MODE_WEEK == dateMode) { // 按周 final long[] checkedWeeks = parseDateWeeks(dateValue); if (null != checkedWeeks) { for (long week : checkedWeeks) { c.set(Calendar.DAY_OF_WEEK, (int) (week + 1)); long triggerAtTime = c.getTimeInMillis(); if (triggerAtTime <= now) { // 下周 triggerAtTime += AlarmManager.INTERVAL_DAY * 7; } // 保存最近闹钟时间 if (0 == nextTime) { nextTime = triggerAtTime; } else { nextTime = Math.min(triggerAtTime, nextTime); } } } } else if (Task.DATE_MODE_MONTH == dateMode) { // 按月 final long[][] items = parseDateMonthsAndDays(dateValue); final long[] checkedMonths = items[0]; final long[] checkedDays = items[1]; if (null != checkedDays && null != checkedMonths) { boolean isAdd = false; for (long month : checkedMonths) { c.set(Calendar.MONTH, (int) (month - 1)); for (long day : checkedDays) { c.set(Calendar.DAY_OF_MONTH, (int) day); long triggerAtTime = c.getTimeInMillis(); if (triggerAtTime <= now) { // 下一年 c.add(Calendar.YEAR, 1); triggerAtTime = c.getTimeInMillis(); isAdd = true; } else { isAdd = false; } if (isAdd) { c.add(Calendar.YEAR, -1); } // 保存最近闹钟时间 if (0 == nextTime) { nextTime = triggerAtTime; } else { nextTime = Math.min(triggerAtTime, nextTime); } } } } } return nextTime;}public static long[] parseDateWeeks(String value) { long[] weeks = null; try { final String[] items = value.split(","); weeks = new long[items.length]; int i = 0; for (String s : items) { weeks[i++] = Long.valueOf(s); } } catch (Exception e) { e.printStackTrace(); } return weeks;}public static long[][] parseDateMonthsAndDays(String value) { long[][] values = new long[2][]; try { final String[] items = value.split("\\|"); final String[] monthStrs = items[0].split(","); final String[] dayStrs = items[1].split(","); values[0] = new long[monthStrs.length]; values[1] = new long[dayStrs.length]; int i = 0; for (String s : monthStrs) { values[0][i++] = Long.valueOf(s); } i = 0; for (String s : dayStrs) { values[1][i++] = Long.valueOf(s); } } catch (Exception e) { e.printStackTrace(); } return values;
http://orgcent.com/android-alarmmanager-source/
0 0
- Android闹钟程序周期循环提醒源码(AlarmManager)
- Android闹钟程序周期循环提醒源码(AlarmManager)
- Android闹钟程序周期循环提醒源码(AlarmManager)
- Android闹钟程序周期循环提醒源码(AlarmManager)
- Android 通过AlarmManager实现单次闹钟和周期闹钟
- Android--闹钟AlarmManager详解
- Android闹钟-AlarmManager
- Android AlarmManager闹钟实现
- Android闹钟 AlarmManager基础
- Android---AlarmManager闹钟设置
- Android - AlarmManager设置闹钟
- android(闹钟AlarmManager)
- Android闹钟(AlarmManager)
- AlarmManager的使用-----闹钟/定时提醒功能
- Android---AlarmManager(全局定时器/闹钟)指定时长或以周期形式
- Android AlarmManager加入与取消闹钟提醒, Notification不显示的问题
- android service实现循环定时提醒(仿闹钟)
- android 闹钟提醒
- 我也遇到INSTALL_FAILED_CONTAINER_ERROR
- IE 8以下兼容模式问题
- js中addEventListener中第3个参数 更多的情况研究
- jsp页面调用打印功能
- 关于winform的地址联级编程
- Android闹钟程序周期循环提醒源码(AlarmManager)
- java.io.FileNotFoundException: Template /template/ajax/head.ftl not found.
- Android 线程和Timer的销毁
- Android中ViewFlipper详解
- Sentinel-Redis高可用方案(一):主从复制
- Java Integer与int,栈与堆
- oracle 查看锁表情况并处理锁表
- 在Android中通过Intent使用Bundle传递对象
- 求图像的信息熵和条件熵