AlarmManager 闹钟简述

韩阳成
2023-12-01

一 AlarmManager概述

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方法

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: 绑定了闹钟的执行动作,比如发送一个广播、给出提示等等

三 AlarmManager使用

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;
				}
			}
		
   }
 类似资料: