创建定时任务

Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的Timer类,一种是使用Android的Alarm机制。这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显的短板,它并不太适用那些需要长期在后台运行的定时任务。我们都知道,为了能让电池更加耐用,每种手机都会有自己的休眠策略,Android手机就会在长时间不操作的情况下自动让CPU进入到睡眠状态,这就有可能导致Timer中的定时任务无法正常运行。而Alarm则具有唤醒CPU的功能,它可以保证在大多数情况下需要执行定时任务的时候CPU都能正常工作。需要注意,这里唤醒CPU和唤醒屏幕完全不是一个概念,千万不要产生混淆。

Alarm机制
  • 创建一个AlarmManager实例

    AlarmManager manager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
  • 调用AlarmManager的set()方法就可以设置一个定时任务了,比如说想要设定一个任务在10秒钟后执行,就可以写成

    long triggerAtTime=SystemClock.elapsedRealtime()+10*1000;
    manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pendingIntent);

    set()方法中需要传入的3个参数

    第一个参数是一个整型参数,用于指定AlarmManager的工作类型,有4种值可选,分别是ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC和RTC_WAKEUP。其中

    • ELAPSED_REALTIME表示让定时任务的触发时间从系统开机开始算起,但不会唤醒CPU。

    • ELAPSED_READTIME_WAKEUP同样表示让定时任务的触发时间从系统开机开始算起,但会唤醒CPU。

    • RTC表示让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒CPU。

    • RTC_WAKEUP同样表示让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒CPU。

    • SystemClock.elapsedRealTime()方法可以获取到系统开机至今所经历时间的毫秒数。

    • System.currentTimeMills()方法可以获取到1970年1月1日0点至今所经历时间的毫秒数。

    第二个参数就是定时任务触发的时间,以毫秒为单位。如果第一个参数使用的是ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,则这里传入开机至今的时间再加上延迟执行的时间。如果第一个参数使用的是RTC或RTC_WAKEUP,则这里传入1970年1月1日0点至今的时间再加上延迟执行的时间。

    第三个参数是一个PendingIntent,相比于intent,更倾向于在某个合适的时机去执行某个动作,也就是是延迟执行的intent。

猜你喜欢

转载自blog.csdn.net/ting1406525501/article/details/82113207