今天由于公司需要一周一次的更新机制,所以就来了解了一下AlarmManager定时器,简单说就是我们设置一个时间,或者一段时间间隔给他,
在特定的时间后,会发送一个广播给我们,我们再去做需求.
举个例子来说明一下,每隔4秒弹个窗提醒;
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class);
intent.setAction("repeat_dialog");
PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
final long firstime = System.currentTimeMillis();
am.setRepeating(AlarmManager.RTC_WAKEUP, firstime, 4 * 1000,sender);
public static class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals("repeat_dialog")) {
Toast.makeText(context, "4秒一次哈", Toast.LENGTH_SHORT).show();
}
}
}
当然,不要忘记在AndroidManifest.xml配置:
<receiver android:name="com.meitu.mobile.calendar.event.HolidayAlarmReceiver"></receiver>
(eg:onReceive里面不能做耗时超过10秒的动作,若需要做耗时操作,最好的方法就是启个service来执行,如
Intent mServiceIntent = new Intent(context,HolidayIntentService.class);
context.startService(mServiceIntent);
(public class HolidayIntentService extends IntentService) 我大多是用IntentService,这时在
onHandleIntent()方法里去执行耗时操作;
当然,需要在AndroidManifest.xml配置:
<service android:name="com.meitu.mobile.calendar.event.HolidayIntentService"></service>
)
AlarmManager的常用方法有三个:
(1)set(int type,long startTime,PendingIntent pi);
该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。
(2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。
(3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。
setRepeating的第一个参数是int type,有五种类型可选:
(1)int type:闹钟的类型,常用的有5个值:
AlarmManager.ELAPSED_REALTIME :表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系 统启动开始),状态值为3;
AlarmManager.ELAPSED_REALTIME_WAKEUP :表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟 也使用相对时间,状态值为2;
AlarmManager.RTC :表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1
AlarmManager.RTC_WAKEUP :表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间, 状态值为0;
AlarmManager.POWER_OFF_WAKEUP : 示闹钟在手机关机状态下也能正常进行提示功能,所以是5个状态中用的最多的状态之一(虽然这么说,但我自己没用过~~~)
(2)第二个参数:long triggerAtMillis:
闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。需要注意的是,本属性与第一个属性(type)密切相关,
如果第一个参数对应的闹钟使用的是相对时间(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本属性就得使用相对时间(相对于系统启动时间来说),比如当前时间就表示为:SystemClock.elapsedRealtime();
如果第一个参数对应的闹钟使用的是绝对时间(RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那么本属性就得使用绝对时间,比如当前时间就表示为:System.currentTimeMillis()
(3)long intervalTime:表示两次闹钟执行的间隔时间,也是以毫秒为单位。
(4)PendingIntent pi:
是闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent是Intent的封装类。需要注意的是,如果是通过启动服务来实现闹钟提示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intent intent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。
本文出自 “9628309” 博客,请务必保留此出处http://9638309.blog.51cto.com/9628309/1624105
原文:http://9638309.blog.51cto.com/9628309/1624105