package com.xjf.repository.utils; import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.content.Intent; import android.util.Log; import java.util.Calendar; /** * ----------------------------------------------------------------- * User:xijiufu * Email:xjfsml@163.com * Version:1.0 * Time:2017/4/18--0:43 * Function: 闹钟定时器 * ModifyHistory: * ----------------------------------------------------------------- */ public class AmUtiles { private static AlarmManager am; private static PendingIntent pendingIntent; /** * 设置一次性闹钟 * 简化10分钟之后启动一个intent 600代表10分钟 20代表20秒 */ public static AlarmManager sendUpdateBroadcastRepeat(Context ctx, Intent intent) { pendingIntent = PendingIntent.getBroadcast(ctx, 0, intent, 0); am = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); am.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 600 * 1000, pendingIntent); return am; } /** * 设置周期性的定时任务 * * @param context * @param intent * @return */ public static AlarmManager sendRepeatingBroadcastRepeat(Context context, Intent intent) { pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); /** * 第一个参数表示闹钟类型int type指定定时服务的类型,该参数接受如下值: ELAPSED_REALTIME: 在指定的延时过后,发送广播,但不唤醒设备(闹钟在睡眠状态下不可用)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒。 ELAPSED_REALTIME_WAKEUP: 在指定的延时过后,发送广播,并唤醒设备(即使关机也会执行operation所对应的组件) 。 延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。 RTC: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,但不唤醒设备)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒(闹钟在睡眠状态下不可用)。 RTC_WAKEUP: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,并唤醒设备)。即使系统关机也会执行 operation所对应的组件。 第二个参数表示闹钟首次执行时间 第三个参数表示闹钟两次执行的间隔时间 第四个参数表示闹钟响应动作 */ //首次执行十分钟后 之后10分钟执行一次 am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10 * 60 * 1000, 10 * 60 * 1000, pendingIntent); return am; } /** * 设置省电模式 的定时任务 * * @param context * @param intent * @return */ public static AlarmManager sendInexactRepeating(Context context, Intent intent) { pendingIntent = PendingIntent.getBroadcast(context, 0, intent, 0); am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); /** * 第一个参数表示闹钟类型int type指定定时服务的类型,该参数接受如下值: ELAPSED_REALTIME: 在指定的延时过后,发送广播,但不唤醒设备(闹钟在睡眠状态下不可用)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒。 ELAPSED_REALTIME_WAKEUP: 在指定的延时过后,发送广播,并唤醒设备(即使关机也会执行operation所对应的组件) 。 延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。 RTC: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,但不唤醒设备)。如果在系统休眠时闹钟触发,它将不会被传递,直到下一次设备唤醒(闹钟在睡眠状态下不可用)。 RTC_WAKEUP: 指定当系统调用System.currentTimeMillis()方法返回的值与triggerAtTime相等时启动operation所对应的设备(在指定的时刻,发送广播,并唤醒设备)。即使系统关机也会执行 operation所对应的组件。 第二个参数表示闹钟首次执行时间 第三个参数intervalTime为闹钟间隔 INTERVAL_DAY: 设置闹钟,间隔一天 INTERVAL_HALF_DAY: 设置闹钟,间隔半天 INTERVAL_FIFTEEN_MINUTES:设置闹钟,间隔15分钟 INTERVAL_HALF_HOUR: 设置闹钟,间隔半个小时 INTERVAL_HOUR: 设置闹钟,间隔一个小时 第四个参数表示闹钟响应动作 */ //首次执行当前后十分钟 am.setInexactRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 10 * 60 * 1000, AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent); return am; } /** * 应用退出了就取消闹钟 */ public static void destoryAlarmManger() { if (null != am) { am.cancel(pendingIntent); } } /** * 设置午夜定时器, 午夜12点发送广播, MIDNIGHT_ALARM_FILTER. * 实际测试可能会有一分钟左右的偏差. * * @param context 上下文 */ public static void setMidnightAlarm(Context context, String action) { Context appContext = context.getApplicationContext(); Intent intent = new Intent(action); PendingIntent pi = PendingIntent.getBroadcast(appContext, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager am = (AlarmManager) appContext.getSystemService( Context.ALARM_SERVICE); // 午夜12点的标准计时, 来源于SO, 实际测试可能会有一分钟左右的偏差. Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.HOUR, 0); calendar.set(Calendar.AM_PM, Calendar.AM); calendar.add(Calendar.DAY_OF_MONTH, 1); // 显示剩余时间 long now = Calendar.getInstance().getTimeInMillis(); Log.e("剩余时间(秒): ", ((calendar.getTimeInMillis() - now) / 1000) + ""); // 设置之前先取消前一个PendingIntent am.cancel(pi); // 设置每一天的计时器 am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); } }