古人学问无遗力,少壮工夫老始成。这篇文章主要讲述安卓笔记20170118相关的知识,希望能为你提供帮助。
创建定时任务
android的Alarm机制。
定时任务也可以使用java API里提供的Timer类,但它不太适用于那些需要长期在后台运行的定时任务。为了让电池更加耐用,每种手机都会有自己的休眠策略,Android手机就会在长时间不操作的情况下自动让CPU进入到睡眠状态,这就有可能导致Timer中的定时任务无法正常运行。而Alarm则具有唤醒CPU的功能,它可以保证在大多数情况下需要执行定时任务的时候CPU都能正常工作。注意:唤醒CPU和唤醒屏幕不是一个概念。
AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); long triggerAtTime = SystemClock.elapsedRealtime() + 10 * 1000; manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pendingIntent);
set方法接收三个参数
第一个参数是整形参数,用于指定AlarmManager的工作类型,有4种值可选
ELAPSED_REALTIME表示让定时任务的触发时间从系统开机开始算起,但不会唤醒CPU。
ELAPSED_REALTIME_WAKEUP同样表示让定时任务的触发时间从系统开机开始算起,但会唤醒CPU。
【安卓笔记20170118】RTC表示让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒CPU。
RTC_WAKEUP表示让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒CPU。
使用SystemClock.elapsedRealtime()方法可以获取到系统开机至今所经历时间的毫秒数,使用System.currentTimeMillis()方法可以获取到1970年1月1日0点至今所经历时间的毫秒数
第二个参数代表定时任务触发的时间,以毫秒为单位。
如果第一个参数使用的是ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,则这里传入开机至今的时间再加上延迟执行的时间。
如果第一个参数使用的是RTC或RTC_WAKEUP,则这里传入1970年1月1日0点至今的时间再加上延迟执行的时间。
第三个参数是一个PendingIntent,一般会调用getService()方法或者getBroadcast()方法来获取一个能够执行服务或广播的PendingIntent。这样当定时任务被触发的时候,服务的onStartCommand()方法或广播接收器的OnReceive()方法就可以得到执行。
实现一个长时间在后台定时运行的服务
public class LongRunningService extends Service {@Override public IBinder onBind(Intent intent) { return null; }@Override public int onStartCommand(Intent intent, int flags, int startId) { new Thread(new Runnable(){@Override public void run() {}}).start(); AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE); int anHour = 60 * 60 * 1000; long triggerAtTime = SystemClock.elapsedRealtime() + anHour; Intent i = new Intent(this, LongRunningService.class); PendingIntent pi = PendingIntent.getService(this, 0, i, 0); manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi); return super.onStartCommand(intent, flags, startId); }}
在onStartCommand()方法中开启了一个子线程,并在这里执行逻辑操作。因为逻辑操作需要耗时,如果放在主线程里执行可能会对定时任务的准确性造成轻微的影响
最后,只需要在你想启动定时服务的时候调用如下代码即可:
Intent intent = new Intent(context, LongRunningService.class);
context.startService(intent);
注意:从Android4.4系统开始,Alarm任务的触发时间将会变得不准确,有可能会延迟一段时间后任务才能得到执行。这是系统在耗电性能方面进行的优化。系统会自动检测目前有多少Alarm任务存在,然后将触发时间相近的几个任务放在一起执行,这就可以大幅度地减少CPU被唤醒的次数,从而有效延长电池的使用时间。
如果你要求Alarm任务的执行时间必须准确无误,使用AlarmManager的setExact()方法来替代set()方法,就基本上可以保证任务能够准时执行了。
推荐阅读
- Android-Universal-Image-Loader 学习笔记线程池分析
- Android流行界面结构——Fragment通过ViewPager(带指示器)嵌套Fragment结构的创建方法详解
- Android群英传笔记——第五章(Android Scroll分析)
- Android学习——Fragment与Activity通信
- android 好的源码链接
- Android Java使用JavaMail API发送和接收邮件的代码示例
- 移动端UI设计越来越流行的高斯模糊(Gaussian blur)和毛玻璃效果(磨砂效果),如何使用Android RenderScript简单实现()
- android开发学习——day4
- Android开发首选教程Android开发从入门到精通精华教程列表