两种实现方式
- 一种是Java API中的Timer类
- 另一种是Alarm机制
- 两者大多数情况下都有类似的效果,手机在不运行时,会进入睡眠状态,
- 这样可能导致Timer的定时任务无法正常运行。
Alarm机制则不存在这种情况,它具有唤醒CUP的功能。即可以保证每次需要执行定时任务的时候,CPU都能正常的工作。
Alarm机制的用法
借助AlarmManager类来实现,通过调用Contenxt的getSystemService()方法来获取实例,这里传递的参数为 Context.ALARM_SERVICE,获取AlarmManage的实例如下
AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
- 接下来调用AlarmManage的set方法就可以设置一个定时任务了。如下设置一个10s 后执行的任务
AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
//SystemClock.elapsedRealtime() 开机至今 + 要等待的时间
long triggerAtTime = SystemClock.elapsedRealtime() + 10 * 1000;
Intent intent = new Intent(this,AlarmBroadcast.class);
PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pi);
AlarmManager manager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
// 从 1970.0.0到现在的时间 + 要等待的时间
long triggerAtTime = SystemClock.currentThreadTimeMillis() + 10 * 1000;
Intent intent = new Intent(this,AlarmBroadcast.class);
PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
manager.set(AlarmManager.RTC_WAKEUP,triggerAtTime,pi);
- manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pi);
- 参数1 AlarmManager.ELAPSED_REALTIME_WAKEUP 表示让任务触发的时间从1970。0.0算起,可以唤醒CPU
- AlarmManager.ELAPSED_REALTIME 表示让任务触发的时间从1970。0.0算起,不可以唤醒CPU
- AlarmManager.RTC_WAKEUP 表示让任务触发的时间从 开机算起 ,可以唤醒CPU
- AlarmManager.RTC 不可以唤醒CPU