AlarmManager

参考: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);
}

AlarmManager的常用方法:

//该方法用于设置一次性闹钟,第一个参数表示闹钟类型,
第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。
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()。

AlarmManager的闹钟type:
/**
 * 闹钟在睡眠状态下会【唤醒】系统并执行提示功能,
 * 该状态下闹钟使用【绝对时间】
 */
//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的过去式和过去分词 )

SystemClock.elapsedRealtime() 与 System.currentTimeMillis() 区别

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(); }

你可能感兴趣的:(Android基础)