android 中实现定时人物有两种方式
java API里提供的Timer类
Android中的Alarm机制
优缺点介绍:
这两种方式在多说情况下能实现同样的效果,但Timer有一个明显的缺陷,timer不适用需要长时间在后台运行的定时任务。android手机在长时间步操作的情况下会自动让cpu进入睡眠状态,这就会导致Timer的定时任务无法正常运行。Alarm具有唤醒cpu的功能,它可以保证在大多数情况下需要执行定时任务的时候cpu能正常工作。
注意:这里的唤醒cpu和唤醒屏幕完全不是一个概念
这里设置的是点击一个按钮开启这个服务
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
新闻热点
疑难解答