包括单次闹铃、按照星期设置循环闹铃及循环闹铃的取消
/**
* 转换成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);
}
//-------------------------------------------------------------