// 获取AlarmManager实例
public static AlarmManager getAlarmManager(Context context) {
return (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
}
String text 为要设置的时间 格式为:13:02
requestCode第二个参数传不同的值,可以设置多个个闹钟
PendingIntent pendingIntent = PendingIntent.getService(context, requestCode, intent, requestCode);//0x102
requestCode 也可以吧这个值传给广播或者Service中判断是那个闹钟响了,需要执行什么操作
getString()保存定时的时间,和传入的参数 以便重复定时使用
//设置闹钟
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
public static void timing(Context context, AlarmManager alarmManager, String text, int requestCode) {
if (text != null && text.length() > 0) {
String[] times = text.split(":");
//发送广播
Intent intent = new Intent(context, My_Service.class);//context,My_Service.class
// intent.setAction("com.example.android_08_alarm.ring_ck");
intent.putExtra("requestCode", requestCode + "");
//将来时态的跳转 第四个参数flags意为标记,初步认为flags是标识各个PendingIntent的
PendingIntent pendingIntent = PendingIntent.getService(context, requestCode, intent, requestCode);//0x102
//选择闹钟启用的时间 此处时间从textview截取
Calendar calendar2 = Calendar.getInstance();
calendar2.set(Calendar.HOUR_OF_DAY, Integer.parseInt(times[0])); //时
calendar2.set(Calendar.MINUTE, Integer.parseInt(times[1])); //分
//获取当前系统时间
Calendar calendar3 = Calendar.getInstance();
//当前系统时间16点>你想设置的时间8点 把日期加一到第二天
if (calendar3.getTimeInMillis() > calendar2.getTimeInMillis()) {
calendar2.set(Calendar.DAY_OF_YEAR, calendar2.get(Calendar.DAY_OF_YEAR) + 1);
}
//AlarmManager.INTERVAL_DAY 间隔一天 24 * 60 * 60 * 1000
// int A=24 * 60 * 60 * 1000;
alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar2.getTimeInMillis(), pendingIntent);
//保存定时的时间,和传入的参数 以便重复定时使用
getString(text, requestCode);
}
}
//重复定时保存需要定时的时间
private static void getString(String text_value, int requestCode_value) {
if (requestCode_value == 1)
SharedPreferencesUtils.putString("time1_CF", text_value);
if (requestCode_value == 2)
SharedPreferencesUtils.putString("time2_CF", text_value);
}
此处是service中的操作
//获取穿入的值
values = intent.getStringExtra("requestCode");
switch (Integer.valueOf(values)) {
//根据传值执行需要的操作
case 1:
week_RQ.send_Serial(context, (byte) 0x01);
//重复定时
getTimer(context, timer1, task1, "time1_CF", 1);
break;
case 2:
week_RQ.send_Serial(context, (byte) 0x02);
//重复定时
getTimer(context, timer2, task2, "time2_CF", 2);
break;
case 3:
week_RQ.send_Serial(context, (byte) 0x04);
//重复定时
getTimer(context, timer3, task3, "time3_CF", 3);
break;
}
//重复定时
private static void getTimer(final Context context, Timer timer, TimerTask task, final String time_CF, final int request) {
if (timer == null)
timer = new Timer();
//此处延迟一分钟 定时是实时的 防止多次重复响铃
task = new TimerTask() {
@RequiresApi(api = Build.VERSION_CODES.KITKAT)
@Override
public void run() {
//重复定时 关闭在定时
String time_CFS = "";
time_CFS = SharedPreferencesUtils.getString(time_CF);
timeutils.timing(context, FragmentYaoXiang.alarmManager, time_CFS, request);
}
};
timer.schedule(task, 60000); //参数2延时时间,周期时间,1分钟取后台数据
}
最后取消定时的时候记得关闭重复定时,重复定时是延时一分钟执行的 如果定时响铃后立马关闭并没有取消重复定时
所以取消定时后需要执行关闭计时任务
public static void getCancel(Timer timer, TimerTask task) {
if (timer != null) {
timer.cancel();
timer = null;
}
if (task != null) {
task.cancel();
task = null;
}
}
取消定时代码
// 取消指定requestCode的定时任务
// 参数:
// context:上下文
// requestCode:请求码,用于区分不同的任务
// cls:广播接收器的class
public static void cancelAlarmBroadcast(Context context, AlarmManager alarmManager, int requestCode) {
Intent intent = new Intent(context, My_Service.class);//context,My_Service.class
// intent.setAction("com.example.android_08_alarm.ring_ck");
PendingIntent pi = PendingIntent.getBroadcast(context, requestCode, intent, requestCode);
alarmManager.cancel(pi);
}
只需要在你取消的点击事件中执行