定时器,会到指定的时间时执行相应的操作。
获取AlarmManager:
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
ELAPSED_REALTIME:真实时间流逝,当手机休眠时不进行相应的操作。
ELAPSED_REALTIME_WAKEUP:真实时间流逝。当手机休眠时也进行相应的操作。
RTC:手机时间流逝。当手机处于休眠状态时,不进行相应的操作。
RTC_WAKEUP:手机时间流逝。当手机处于休眠状态时,也进行相应的操作。
ELAPSED与RCT的最大区别:后者是根据手机的时间来的,也就是说可以通过更改手机上的时间,影响操作的执行时间;而前者却是真实的时间流逝,即使更改了手机时间,也不会影响操作的执行时间。
以上的四个值都是常用方法中type的取值。
INTERVAL_DAY:一天。
INTERVAL_FIFTEEN_MINUTES:十五分钟。
INTERVAL_HALF_DAY:半天。
INTERVAL_HALF_HOUR:半小时。
INTERVAL_HOUR:一小时。
set(type, triggerAtMillis, operation):设置一个闹钟(这里指的是定时执行的任务),该任务不会重复执行。到时间后会执行operation指向的操作。其中triggerAtMillis指的是操作开始执行的时间,如果该时间小于当前的时间,那么会立即执行operation。
setRepeating(type, triggerAtMillis, intervalMillis, operation);设置一个闹钟,该闹钟会定时、重复执行。其中intervalMillis指的是两次执行之间相隔的时间。其余的同上。
setInexactRepeating(type, triggerAtMillis, intervalMillis, operation);和setRepeating方法类似。区别是:setInexactRepeating不一定会在指定的时间处执行,有可能会有偏差(是为了更节约能量),而setRepeating却是在给定的时刻执行,不会有偏差。
cancel():取消相应的操作。
Intent intent = new Intent(MainActivity.this, MyService.class); final PendingIntent pendingIntent = PendingIntent.getService(this, 100, intent, PendingIntent.FLAG_UPDATE_CURRENT); final AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); manager.setRepeating(AlarmManager.RTC, System.currentTimeMillis() + 24 * 60 * 60 * 1000 + 60 * 1000, 1000, pendingIntent); findViewById(R.id.btn_change).setOnClickListener(new OnClickListener() { public void onClick(View v) { manager.cancel(pendingIntent); } });
System.currentTimeMillis:获取系统时间,该时间是从1970年1月1日开始计时的,一直到系统当前的时间。要注意:由于系统的时间可以人为的进行修改,它得到的值也是从1970年到修改后的时间,并不一定是真正的当前时间。例如:当前4月14日,如果手机的时间被更改为4月15日,那么它得到的值就是到4月15日的,并不是到4月14的。
SystemClock.elapsedRealtime():得到的是系统开机后的时间,即使系统的时间不是真正的时间也可以得到正确的开机时长。并且把系统休眠的时间也计算在内。
SystemClock.uptimeMillis:和上面的一个基本类似,唯一区别是:该方法不把系统休眠的时间计算在内。