Android定时任务

Android 2017-10-08

Android中的定时任务一般有两种实现方式, 一种是使用Java API里提供的Timer类, 一种是使用Android的Alarm机制。 这两种方式在多数情况下都能实现类似的效果, 但Timer有一个明显的短板, 它并不太适用于那些需要长期在后台运行的定时任务。 Alarm则具有唤醒CPU的功能, 它可以保证在大多数情况下需要执行定时任务的时候CPU都能正常工作。

Alarm机制主要就是借助了AlarmManager 类来实现的。 这个类和NotificationManager有点类似, 都是通过调用Context的getSystemService() 方法来获取实例的, 只是这里需要传入的参数是Context.ALARM_SERVICE 。 因此, 获取一个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() 方法中第一个参数是一个整型参数, 用于指定AlarmManager 的工作类型, 有4种值可选, 分
别是ELAPSED_REALTIME 、 ELAPSED_REALTIME_WAKEUP 、 RTC 和RTC_WAKEUP 。 其中ELAPSED_REALTIME 表示让定时任务的触发时间从
系统开机开始算起, 但不会唤醒CPU。 ELAPSED_REALTIME_WAKEUP 同样表示让定时任务的触发时间从系统开机开始算起, 但会唤醒CPU。
然后看一下第二个参数, 这个参数就好理解多了, 就是定时任务触发的时间, 以毫秒为单位。 如果第一个参数使用的是ELAPSED_REALTIME
或ELAPSED_REALTIME_WAKEUP , 则这里传入开机至今的时间再加上延迟执行的时间。 如果第一个参数使用的是RTC 或RTC_WAKEUP , 则这里
传入1970年1月1日0点至今的时间再加上延迟执行的时间。第三个参数是一个PendingIntent , 这里我们一般会调用getService() 方法或者getBroadcast() 方法来获取一个能够执行服务或广播的PendingIntent 。 这样当定时任务被触发的时候, 服务的onStartCommand() 方法或广播接收器的onReceive() 方法就可以得到执行。
设定一个任务在10秒钟后执行也可以写成:

long triggerAtTime = System.currentTimeMillis() + 10 * 1000;
manager.set(AlarmManager.RTC_WAKEUP, triggerAtTime, pendingIntent);

实现一个长时间在后台定时运行的服务


本文由 方方無 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论

shijiebei 365bet manbetx 188bet xinshui caipiao 95zz tongbaoyule beplay 88bifa 18luck betway bwin hg0088 aomenjinshayulecheng ca88 shenbotaiyangcheng vwin w88 weide