当前位置: 代码迷 >> 综合 >> 【定时任务】Alarm,Timer与Handler
  详细解决方案

【定时任务】Alarm,Timer与Handler

热度:65   发布时间:2023-12-15 11:10:36.0

1. Timer不推荐使用,本质上调用了Handler,而且耦合比较高

2. Handler

  1. 安卓的Doze模式,尽可能的节约用电。使用Handler定时,在程序后台运行且手机锁屏的情况下,handler定时可能会失效,但是AlarmManager就不一样,在程序后台运行且手机手机锁屏的情况下,定时也是基本上准确的。

3. Alarm[用得也比较少了]

1. 定义

  1. 若是单纯的定时,Alarm比Timer更好。 Timer类是使用Java API里提供的, Alarm机制是Android提供的。 Timer并不太适用于那些需要长期在后台运行的定时任务。而Alarm则具有唤醒CPU的功能(非唤醒屏幕), 它可以保证在大多数情况下需要执行定时任务的时候CPU都能正常工

2.Coding

  1. 借助了AlarmManager
    类来实现的。 这个类和NotificationManager 有点类似, 都是通过调用Context的getSystemService() 方法来获取实例的, 只是这里需要传入的参数是Context.ALARM_SERVICE
    在这里插入图片描述
    在这里插入图片描述
  2. 传入参数
    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. 长时间在后台定时运行的服务

  1. 新建一个普通的服务, 比如把它起名叫LongRunningService , 然后将触发定时任务的代码写到onStartCommand() 方法中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 对比

  1. 比较
  2. 样例
    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);
      第三种代码看起来也非常的简洁,推荐使用。