首页 > 系统 > Android > 正文

定时任务——Android之Alarm机制讲解

2019-11-09 18:25:44
字体:
来源:转载
供稿:网友

概述

android 中实现定时人物有两种方式

java API里提供的Timer类

Android中的Alarm机制

优缺点介绍:

这两种方式在多说情况下能实现同样的效果,但Timer有一个明显的缺陷,timer不适用需要长时间在后台运行的定时任务。android手机在长时间步操作的情况下会自动让cpu进入睡眠状态,这就会导致Timer的定时任务无法正常运行。Alarm具有唤醒cpu的功能,它可以保证在大多数情况下需要执行定时任务的时候cpu能正常工作。

注意:这里的唤醒cpu和唤醒屏幕完全不是一个概念


Alarm机制

这里设置的是点击一个按钮开启这个服务

A. 获取AlarmManager实例

AlarmManager alarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

B.设置需要延迟的时间

/** * elapsedRealtime():获取到系统开机至今所经历时间的毫秒数 * currentThreadTimeMillis():获取到1970年1月1日0点至今所经历时间的毫秒数 * */ long time = SystemClock.elapsedRealtime() + 60 * 60 * 1000;

C.触发定时任务

alarmManager.setExact(AlarmManager.ELAPSED_REALTIME,time, PendingIntent.getService(this,0,mIntent,0));

setExact()方法API最低要求19 setExact的三个参数:

第一个参数:有4种值可选: ELAPSED_REALTIME 表示让定时任务的触发时间从系统开机开始算起,但不会唤醒cpu ELAPSED_REALTIME_WAKEUP 表示让定时任务的触发时间从系统开机开始算起,但会唤醒cpu RTC 表示让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒cpu RTC_WAKEUP 表示让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒cpu

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

第三个参数:一般会调用getService()或getBroadcast()来获取一个能执行的服务或广播的PendingIntent,这样服务的onStartCommand()方法或广播接收器的onReceive()方法就可以得到执行

public class LongRunningTime extends Service { PRivate AlarmManager alarmManager; @Override public void onCreate() { super.onCreate(); Log.e("Alarm机制","Alarm机制----------------"); } @Override public void onDestroy() { super.onDestroy(); } @Nullable @Override public IBinder onBind(Intent intent) { return null; } @Override public int onStartCommand(final Intent intent, int flags, int startId) { Log.e("Alarm机制","Alarm机制---------2-------"); //获取AlarmManager实例 alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); /** * elapsedRealtime():获取到系统开机至今所经历时间的毫秒数 * currentThreadTimeMillis():获取到1970年1月1日0点至今所经历时间的毫秒数 * */ long time = SystemClock.elapsedRealtime() + 3* 1000; Intent mIntent=new Intent(this,LongRunningTime.class); /** * setExact()方法API最低要求19 * setExact的三个参数: * 第一个参数:有4种值可选: * ELAPSED_REALTIME 表示让定时任务的触发时间从系统开机开始算起,但不会唤醒cpu * ELAPSED_REALTIME_WAKEUP 表示让定时任务的触发时间从系统开机开始算起,但会唤醒cpu * RTC 表示让定时任务的触发时间从1970年1月1日0点开始算起,但不会唤醒cpu * RTC_WAKEUP 表示让定时任务的触发时间从1970年1月1日0点开始算起,但会唤醒cpu * 第二个参数:定时任务触发的时间,以毫秒为单位 * 注:这里传入 ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,意思:就是传入开机至今的时间加上延迟执行的时间 * 这里传入RTC或 RTC_WAKEUP,意思:就是传入1970年1月1日0点至今的时间加上延迟执行的时间 * * 第三个参数:一般会调用getService()或getBroadcast()来获取一个能执行的服务或广播的PendingIntent, * 这样服务的onStartCommand()方法或广播接收器的onReceive()方法就可以得到执行 * * */ alarmManager.setExact(AlarmManager.ELAPSED_REALTIME,time, PendingIntent.getService(this,0,mIntent,0)); Log.e("Alarm机制Service","Alarm机制-------2-------"); return super.onStartCommand(intent, flags, startId); }}

效果图: 这里写图片描述

这样一个定时任务就完成了!

代码下载:http://download.csdn.net/detail/QQ_34501274/9747492


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表