闹铃

本文介绍了一个智能闹钟系统,详细阐述了如何设置单次闹铃、按照星期循环闹铃以及如何取消闹铃。文章重点讨论了时间到闹铃的触发机制、闹铃时间的格式化、以及根据不同星期类型、早晚类型和年级类型来设置闹铃的具体步骤。此外,还介绍了如何在不同场景下调整闹铃触发时间和频率,旨在为用户提供高效的时间管理工具。


包括单次闹铃、按照星期设置循环闹铃及循环闹铃的取消

	/**
	 * 转换成hh:mm 的时间格式。
	 * @param hour
	 * @param minute
	 * @return eg:08:30
	 */
	public static String getTimeStr(int hour, int minute) {
		StringBuilder sb = new StringBuilder();
		if (hour < 10) sb.append("0");
		sb.append(hour).append(":");
		if (minute < 10) sb.append("0");
		sb.append(minute);
		return sb.toString();
	}
	
	public static int getAmPmType()
	{
		Calendar mCalendar = Calendar.getInstance();
		int ampm = mCalendar.get(Calendar.AM_PM);
		if(ampm == Calendar.AM)
		{
			return UpdateDef.isAm;
		}
		else
		{
			return UpdateDef.isPm;
		}
	}
	
	public static int getWeekType()
	{
		Calendar mCalendar = Calendar.getInstance();
		int ampm = mCalendar.get(Calendar.AM_PM);
		Log.i("sxy", "ampm="+ampm);
		return DAYS_KEY_MAP.indexOfValue(mCalendar.get(Calendar.DAY_OF_WEEK));
	}
	
	//-------------------------时间到了的闹铃-----------------------------
	//--目前只为小学的古诗词和小学中学的国学乐园发送时间到了的广播
	public static void setupTimeIsOverAlarm(Context con, int mListenDur)
	{
		Intent intent = new Intent(UpdateDef.TIMEISOVER_ACTION);
	    PendingIntent pendingIntent = PendingIntent.getBroadcast(con, UpdateDef.TIMEISOVER_ALARMID, intent, 0);
	    AlarmManager am = (AlarmManager)con.getSystemService(con.ALARM_SERVICE);
		
	    long now = System.currentTimeMillis();
		am.set(AlarmManager.RTC_WAKEUP, now+mListenDur*60*1000, pendingIntent);
		
		Log.i(TAG, "setupTimeIsOverAlarm alarm: alarmId="+UpdateDef.TIMEISOVER_ALARMID+", dur="+mListenDur);
	}
	
	//---------------------------闹铃-------------------------------
	private static final long INTERVAL = AlarmManager.INTERVAL_DAY * 7;// 7天
	private static final SparseIntArray DAYS_KEY_MAP = new SparseIntArray();
	static {
		DAYS_KEY_MAP.append(UpdateDef.week_mon, Calendar.MONDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_tue, Calendar.TUESDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_wed, Calendar.WEDNESDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_thu, Calendar.THURSDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_fri, Calendar.FRIDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_sat, Calendar.SATURDAY);
		DAYS_KEY_MAP.append(UpdateDef.week_sun, Calendar.SUNDAY);
	}
	
	private static int alarmId = 0;//保证闹铃id唯一:Integer.valueOf(""+weekType+ampmType+stagetype)
	
	public final static int getAlarmId(int weektype, int ampmtype, int stagetype)
	{
		return Integer.valueOf(""+weektype+ampmtype+stagetype);//文件名由星期类型加上间隔符再加上早晚类型和年级类型组成
	}
	
	//设置单次闹铃
	public static void setOneAlarm(Context con, SaveDetailInfo mInfo)
	{
		if(mInfo == null || mInfo.isHasSet() == false || mInfo.isOpen() == false)
		{
			Log.i(TAG, "setup alarm error");
			return;
		}

		Calendar mCalendar = Calendar.getInstance();
		int currentHour = mCalendar.get(Calendar.HOUR_OF_DAY);
		int currentMinute = mCalendar.get(Calendar.MINUTE);
		int beginHour = mInfo.getBeginTime_hour();
		int beginMinute = mInfo.getBeginTime_min();
		if (beginHour < 0 
			|| beginMinute < 0
			|| beginHour < currentHour
			|| (beginHour == currentHour && beginMinute < currentMinute)) {
			return;
		}
		mCalendar.set(Calendar.HOUR_OF_DAY, beginHour);
		mCalendar.set(Calendar.MINUTE, beginMinute);
		mCalendar.set(Calendar.SECOND, 0);
		mCalendar.set(Calendar.MILLISECOND, 0);
		
		Intent intent = new Intent(UpdateDef.ACTION_UPDATE_REMIND);
		intent.putExtra(UpdateDef.mAmPm_Flag, mInfo.getAmPmType());
		intent.putExtra(UpdateDef.mWeek_Flag, mInfo.getWeekType());
		intent.putExtra(UpdateDef.mStage_Flag, mInfo.getStageType());
		
		PendingIntent pi = PendingIntent.getActivity(con, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		AlarmManager am = (AlarmManager)con.getSystemService(con.ALARM_SERVICE);
		am.set(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), pi);
	}
	
	//设置闹铃
	public static void setupAlarm(Context con, SaveDetailInfo mInfo) {
		if(mInfo == null || mInfo.isHasSet() == false || mInfo.isOpen() == false)
		{
			Log.i(TAG, "setup alarm error");
			return;
		}
		
		alarmId = getAlarmId(mInfo.getWeekType(), mInfo.getAmPmType(), mInfo.getStageType());
		cancelAlarm(con, mInfo);
		
		Calendar mCalendar = Calendar.getInstance();
		
		int beginHour = mInfo.getBeginTime_hour();
		int beginMinute = mInfo.getBeginTime_min();
		mCalendar.set(Calendar.DAY_OF_WEEK, DAYS_KEY_MAP.get(mInfo.getWeekType()));
		mCalendar.set(Calendar.HOUR_OF_DAY, beginHour);
		mCalendar.set(Calendar.MINUTE, beginMinute);
		mCalendar.set(Calendar.SECOND, 0);
		mCalendar.set(Calendar.MILLISECOND, 0);
		long triggerAtTime = mCalendar.getTimeInMillis();
		
		long now = System.currentTimeMillis();
        if (triggerAtTime/1000/60 < now/1000/60) { // 下周
            triggerAtTime += AlarmManager.INTERVAL_DAY * 7;
        }
		
        Intent intent = new Intent(UpdateDef.ACTION_UPDATE_REMIND);
		intent.putExtra(UpdateDef.mAmPm_Flag, mInfo.getAmPmType());
		intent.putExtra(UpdateDef.mWeek_Flag, mInfo.getWeekType());
		intent.putExtra(UpdateDef.mStage_Flag, mInfo.getStageType());
        
		PendingIntent pi = PendingIntent.getActivity(con, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		AlarmManager am = (AlarmManager)con.getSystemService(con.ALARM_SERVICE);
		
		if(Hardware.getIsSHUTDOWN_WAKEUP())
		{
			am.setRepeating(AlarmManager.RTC_SHUTDOWN_WAKEUP, triggerAtTime, INTERVAL, pi);//深度关机时闹铃启动方式RTC_SHUTDOWN_WAKEUP
		}
		else
		{
			am.setRepeating(AlarmManager.RTC_WAKEUP, triggerAtTime, INTERVAL, pi);
		}
		
		Log.i(TAG, "set alarm: alarmId="+alarmId
				+", time=" + getTimeStr(beginHour, beginMinute)
				+", path="+mInfo.getBookPath()
				);
	}
	
	//取消闹铃
	public static void cancelAlarm(Context con, SaveDetailInfo mInfo) {
		if(mInfo == null || mInfo.isHasSet() == false)
		{
			Log.i(TAG, "cancel alarm error");
			return;
		}
		
		alarmId = getAlarmId(mInfo.getWeekType(), mInfo.getAmPmType(), mInfo.getStageType());
		
		Intent intent = new Intent(UpdateDef.ACTION_UPDATE_REMIND);
		PendingIntent pi = PendingIntent.getActivity(con, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
		AlarmManager am = (AlarmManager)con.getSystemService(con.ALARM_SERVICE);
		am.cancel(pi);
		
		Log.i(TAG, "cancel alarm: alarmId="+alarmId);
	}
	//-------------------------------------------------------------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值