参考:https://blog.csdn.net/wangxingwu_314/article/details/8060312
//Android 4.4- 使用 AlarmManager
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent i = new Intent(DaemonEnv.sApp, DaemonEnv.sServiceClass);
PendingIntent sPendingIntent = PendingIntent.getService(DaemonEnv.sApp,
HASH_CODE, i,
PendingIntent.FLAG_UPDATE_CURRENT);
if (am != null) {
am.setRepeating(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis() + DaemonEnv.getWakeUpInterval(),
DaemonEnv.getWakeUpInterval(),
sPendingIntent);
}
//该方法用于设置一次性闹钟,第一个参数表示闹钟类型,
第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。
public void set(@AlarmType int type, long triggerAtMillis, PendingIntent operation) {}
//该方法用于设置重复闹钟,
//第一个参数表示闹钟类型,
//第二个参数表示闹钟首次执行时间,
//第三个参数表示闹钟两次执行的间隔时间,单位ms,
//第四个参数表示闹钟响应动作。
public void setRepeating(@AlarmType int type, long triggerAtMillis,
long intervalMillis, PendingIntent operation) {}
//该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。
public void setInexactRepeating(@AlarmType int type, long triggerAtMillis,
long intervalMillis, PendingIntent operation) {}
闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。
需要注意的是,本属性与第一个属性(type)密切相关,
如果第一个参数对 应的闹钟使用的是相对时间(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),
那么本属性就得使用相对时间(相对于系统启动时间来说),
比如当前时间就表示为:SystemClock.elapsedRealtime();
如果第一个参数对应的闹钟使用的是绝对时间 (RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),
那么本属性就得使用绝对时间,比如当前时间就表示 为:System.currentTimeMillis()。
/**
* 闹钟在睡眠状态下会【唤醒】系统并执行提示功能,
* 该状态下闹钟使用【绝对时间】
*/
//System.currentTimeMillis()
public static final int RTC_WAKEUP = 0;
/**
* 闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间
*/
//System.currentTimeMillis()
public static final int RTC = 1;
/**
* 闹钟在睡眠状态下会【唤醒】系统并执行提示功能,
* 该状态下闹钟也使用【相对时间】
*/
//SystemClock.elapsedRealtime()
public static final int ELAPSED_REALTIME_WAKEUP = 2;
/**
* 闹钟在手机睡眠状态下不可用,
* 该状态下闹钟使用相对时间(相对于系统启动开始)
*/
//SystemClock.elapsedRealtime()
public static final int ELAPSED_REALTIME = 3;
如果是相对时间(ELAPSED_REALTIME_WAKEUP 或 ELAPSED_REALTIME),
那么计算triggerAtMillis就需要使用SystemClock.elapsedRealtime();
如果是绝对时间(RTC_WAKEUP 或 RTC),
那么计算triggerAtMillis时使用System.currentTimeMillis()或者calendar.getTimeInMillis()。
elapsed 英[ɪ’læpst] 美[ɪ’læpst]
v. (时间)消逝,过去( elapse的过去式和过去分词 )
public final class System {
/**
* Returns the current time in milliseconds. Note that
* while the unit of time of the return value is a millisecond,
* the granularity of the value depends on the underlying
* operating system and may be larger. For example, many
* operating systems measure time in units of tens of
* milliseconds.
*
* See the description of the class Date
for
* a discussion of slight discrepancies that may arise between
* "computer time" and coordinated universal time (UTC).
*
* @return the difference, measured in milliseconds, between
* the current time and midnight, January 1, 1970 UTC.
* @see java.util.Date
*/
//返回自1970年1月1号到现在的毫秒数
public static native long currentTimeMillis();
}
public final class SystemClock {
/**
* Returns milliseconds since boot, including time spent in sleep.
*
* @return elapsed milliseconds since boot.
*/
@CriticalNative
//返回自启动以来的毫秒数,包括睡眠时间。
native public static long elapsedRealtime();
}