AlarmManager是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用 PendingIntent,PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。在使用Intent的时候,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的话就是将这个动作包含在内了。
定义一个PendingIntent对象 : PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,0);
AlarmManager有如下三种方式提供提示服务:
方法1 : set(int type,long triggerAtTime,PendingIntent operation)
该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。
方法2 : setRepeating(int type,long triggerAtTime,long interval PendingIntent operation)
该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。
方法3 : setInexactRepeating(int type,long triggerAtTime,long interval PendingIntent operation)
该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已
参数:
long startTime: 闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。需要注意的是,本属性与第一个属性(type)密切相关
long intervalTime:对于后两个方法来说,存在本属性,表示两次闹钟执行的间隔时间,也是以毫秒为单位。
PendingIntent pi: 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等
1 获得ALarmManager实例 ALarmManager am=(ALarmManager)getSystemService(ALARM_SERVICE);
2 定义一个PendingIntent发出广播
3 调用ALarmManager方法,设置定时或重复提醒
4 取消提醒:
实现6后秒提醒一次的功能:
AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);//获取AlarmManager实例
int anHour = 6 * 1000 ; // 6秒
long triggerAtTime = SystemClock.elapsedRealtime() + anHour;
Intent intent2 = new Intent(this, AlarmReceiver.class);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent2, 0);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);//开启提醒
用于取消:
aManager= (AlarmManager)getSystemService(ALARM_SERVICE);
Intent intent = new Intent(AlarmTest.this, AlarmActivity.class);
intent.setAction("111111");
PendingIntent pendingIntent = PendingIntent.getActivity( AlarmTest.this, 0, intent, 0); // 创建PendingIntent对象
aManager.cancel(pendingIntent);
Android定时关机示例
public class xxxx extends BroadcastReceiver {
private static String LAST_ALARM_TIME="08:00";
//获得ALarmManager实例
AlarmManager am = (AlarmManager) context.getSystemService(context.ALARM_SERVICE);
String shutdown = null;//关机时间字符串
int[] AlarmOff = {2018,12,14,11,00}; //关机时间数据
int mYear = AlarmOff[0];
int mMonth = AlarmOff[1];
int mDay = AlarmOff[2];
int mHour = AlarmOff[3];
int mMinute = AlarmOff[4];
//将关机时间转换为字符串
StringBuilder date = new StringBuilder().append(mYear).append("/")
.append((mMonth < 10) ? "0" + mMonth : mMonth) .append("/")
.append((mDay < 10) ? "0" + mDay : mDay).append(" ")
.append((mHour < 10) ? "0" + mHour : mHour).append(":")
.append((mMinute < 10) ? "0" + mMinute : mMinute);
shutdown = date.toString();
//格式化关机时间 将关机时间字符串 转换为 yyyy/MM/dd HH:mm 格式的 英文日期时间格式
Date date = null;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
try {
date = sdf.parse(shutdown);
} catch (ParseException e) {
e.printStackTrace();
}
long timeSetup = date.getTime();//获取关机时间距离1970年1月1日(好像是这个时间)的毫秒数
Intent intent = new Intent(context,xxxx.class);//xxxx.class 即定时时间到需要跳转到的目标服务
intent.setAction(shutdown);//设置想要启动能够响应设置的这个 action(关机时间) 的活动 ,其实就是到时间后 和这个关机时间作比较
//将关机时间存储到 AlarmShutdown.xml文件中
SharedPreferences pre = context.getSharedPreferences("AlarmShutdown", context.MODE_PRIVATE);
SharedPreferences.Editor presEditor = pre.edit();
presEditor.putString(LAST_ALARM_TIME,shutdown);
presEditor.commit();
//定义一个PendingIntent对象
PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
//设置闹钟 闹钟类型是RTC_WAKEUP,闹钟时间timeData ,闹钟响应动作是 pi
aManager.set(AlarmManager.RTC_WAKEUP, timeSetup, pi);
//闹钟时间来临,对比 闹钟时间的动作“关机time” 是否等于写入xml文件中的关机时间。比较的是字符串
if(action.equals(getLastAlarmTime(context))){
//关机
Intent shutdownIntent = new Intent(Intent.ACTION_REQUEST_SHUTDOWN);
shutdownIntent.putExtra(Intent.EXTRA_KEY_CONFIRM, false);
shutdownIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mcontext.startActivity(shutdownIntent);
}
public static String getLastAlarmTime(Context context){
SharedPreferences pre = context.getSharedPreferences("AlarmShutdown", context.MODE_PRIVATE);
String ret = pre.getString(LAST_ALARM_TIME,"08:00");
Log.e(TAG,"last time string is:" + ret);
if(ret != null){
return ret;
}else{
return null;
}
}
}