1. Timer不推荐使用,本质上调用了Handler,而且耦合比较高
2. Handler
- 安卓的Doze模式,尽可能的节约用电。使用Handler定时,在程序后台运行且手机锁屏的情况下,handler定时可能会失效,但是AlarmManager就不一样,在程序后台运行且手机手机锁屏的情况下,定时也是基本上准确的。
3. Alarm[用得也比较少了]
1. 定义
- 若是单纯的定时,Alarm比Timer更好。 Timer类是使用Java API里提供的, Alarm机制是Android提供的。 Timer并不太适用于那些需要长期在后台运行的定时任务。而Alarm则具有唤醒CPU的功能(非唤醒屏幕), 它可以保证在大多数情况下需要执行定时任务的时候CPU都能正常工
2.Coding
- 借助了AlarmManager
类来实现的。 这个类和NotificationManager 有点类似, 都是通过调用Context的getSystemService() 方法来获取实例的, 只是这里需要传入的参数是Context.ALARM_SERVICE
- 传入参数
1)参数一:整型参数,指定AlarmManager工作模式
a.ELAPSED_REALTIME:让定时任务的触发时间从系统开机开始算起,
但不会唤醒CPU。
b.ELAPSED_REALTIME_WAKEUP:让定时任务的触发时间从系统开机
开始算起, 但会唤醒CPU。
c.RTC:让定时任务的触发时间从1970年1月1日0点开始算起, 但不会唤醒CPU。
d.RTC_WAKEUP:让定时任务的触发时间从1970年1月1日0点开始算起, 但会唤醒CPU。
3. 长时间在后台定时运行的服务
- 新建一个普通的服务, 比如把它起名叫LongRunningService , 然后将触发定时任务的代码写到onStartCommand() 方法中。
4. 对比
- 比较
- 样例
Android中常见的几种刷新方式有 Timer,Alarm和handler。在widgetapp更新中,alarm用的比较多,有人讲用alarm比较省电。bai
但笔者使用后发现用alarm有时候反而会使系统反应变慢了。更好的方法推荐使用handler。
第一种:Timer
Timer这种方式最为常见,起个定时刷新的任务,不用的时候cancel掉,置为空即可。
示例代码:
Timer timer = new Timer( );
TimerTask task = new TimerTask( ) {
public void run ( ) {
Message message = new Message( );
message.what = 1;
handler.sendMessage(message);
}
};
final Handler handler = new Handler( ) {
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
log.e(“Timer”,“Timer”);
update( );
break;
}
第二种:Alarm
示例代码:
开始计时
Intent intent = new Intent(widgetUpdate);
refreshIntent = PendingIntent.getBroadcast(pContext, 0, intent, 0);
alarm = (AlarmManager)pContext.getSystemService(Context.ALARM_SERVICE);
alarm.setRepeating(AlarmManager.RTC, 0, 1000, refreshIntent);//每秒刷新1次
停止计时
if (alarm!=null) {
alarm.cancel(refreshIntent);
refreshIntent.cancel();
refreshIntent = null;
alarm = null;
}
第三种:handler
private Handler handler = new Handler();
private Runnable runnable = new Runnable() {
public void run () {
update();
handler.postDelayed(this,1000);
}
};
开始计时
handler.removeCallbacks(runnable);
handler.postDelayed(runnable,1000);
停止计时
handler.removeCallbacks(runnable);
第三种代码看起来也非常的简洁,推荐使用。