android定时器,手机定时器

http://www.itjxue.com  2023-01-15 00:25  来源:未知  点击次数: 

Android开发——定时器处理

??开发中经常遇到用计时器的时候,例如:每秒输出一次log,这时候就要用到延时操作,这里总结了几种常用的方法。

?? AlarmManager 是Android的全局定时器,可以在指定时间执行定时任务。定时任务通过PendingIntent 的 getActivity()、getService()或 getBroadcast() 来执行。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent出来,在接收到设定的Intent时执行定时任务。

(2) setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

该方法用于设置重复闹钟,其中参数说明如下:

type:闹钟类型

startTime:首次执行闹钟的时间

intervalTime:两次执行闹钟的时间间隔

pi:闹钟响应动作

(3) setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);

该方法也用于设置重复闹钟,与第二个方法相似,区别在于其两次闹钟执行的间隔时间不是固定的。

?? AlarmManager实现定时的方法,我还没有用到过,以上内容是在网上查找资料后自己在一个小demo中小小试验了的,有错误或描述不清的地方请见谅。下面是我参考的介绍AlarmManager的三篇文章。

android定时器的使用

??目前在项目中使用过的定时器主要是两种方式:1.handler的延时任务 2.timer的定时器

??下面主要来介绍这两种方式 定时器的用法,和遇到的坑 :

??1.handler的延时任务

??写了一个demo,是关于hanlder发送延时消息和 取消延时消息的

??但是在实际运用的过程中,常常会出现无法移除延时消息的问题,这个问题主要是因为两个runnable的对象不是同一个,

??当Activity进入后台运行后再转入前台运行,removeCallbacks无法将updateThread从message queue中移除。这是为什么呢?

??在Activity由前台转后台过程中,线程是一直在运行的,但是当Activity转入前台时会重新定义Runnable runnable;也就是说此时从message queue移除的runnable与原先加入message queue中的runnable并非是同一个对象。??解决方式1:如果把runnable定义为静态的则removeCallbacks不会失效,对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,我们做如下修改就能解决上面的这个问题.

??解决方式2:将所有的runnable任务放到一个集合中,根据runnable的id移除相应的任务,即可以解决这个问题

2.timer的延时任务

同样用上面的demo来说明使用方法:

要注意的是:

TimerTask运行在一个单独的线程里,而不是UI线程。所以使用 Android timer时,注意android的单线程原则,确保线程安全。不要在TimerTask的run方法中做UI相关的操作,如:TextView.setText()等,这样可能会导致UI线程阻塞。如果需要可以使用handler向UI线程发消息,具体处理由UI线程自己完成。在使用完Timer之后,要使用Timer的cancel方法取消Timer,否则Timer一直在运行。

??这里需要注意的是,timer的cancel方法只能执行一次,不能在调用了cancel之后再进行timer的任务执行。

参考文章:

Android 定时器实现的几种方式和removeCallbacks失效问题详解

Android 中Timer和TimeTask完成定时任务

Android定时器AlarmManager

AlarmManager是Android的全局定时器。就是在指定时间做一个事情(封装在PendingIntent)。通过PendingIntent的getActivity()、getService()或getBroadcast()来执行。

听起来AlarmManager和Timer很类似,但是Timer有可能因为手机休眠而被杀掉服务,但是AlarmManager可以做到唤醒手机。

注:ALARM_SERVIC是context的一个常量。

以上绝对时间就是手机的时间,相对时间是相对于当前开机时间来说。例如如果是绝对时间,那么你测试可以通过修改系统时间来提前触发。而相对时间的使用场景是强调多久之后触发,例如2小时后,这个时候把时间修改到2小时后也是没用的。

注:以前还有一个POWER_OFF_WAKEUP,即使在关机后还能提醒,但是Android4.0以后就没有了。

该方法用于设置一次性闹钟。第一个参数是闹钟类型,第二个参数是触发时间,第三个参数是动作。

和set一样,但是时间更精准。

重复闹钟,第1、2、4个参数同上,第3个参数是两次闹钟的时间间隔。

和setInexactRepeating一样,但是时间更精准。

以上四个方法时间精不精准的原因还没有深入研究,大概是是否允许系统同时发出多个提醒,意义在于系统唤醒cpu后会把时间接近的alarm同时发出,避免重复唤醒cpu,减少电量。

取消闹钟。

目的:在指定时间从一个发送个广播,收到广播后打印log。界面如下面这样。

布局:

广播接收器:

MainActivity

AndroidManifest要注册一下receiver

经过测试,以上的时间间隔intervalMillis即使设置5秒也是没用的,因为误差(几十秒呢)无法避免,即使是setRepeating。所以精确是相对的。

(责任编辑:IT教学网)

更多