重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
在Android中大概又两种实现方式:一种是java中的Timer类,一种是Android中的Alerm机制。两者功能差不多。
我们提供的服务有:成都网站设计、网站建设、微信公众号开发、网站优化、网站认证、托克托ssl等。为上1000+企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的托克托网站制作公司
Alerm具有cup运行锁,而Timer不具有cpu锁。
每种手机都具有自己的休眠策略,当长时间不是手机的情况下,cpu就会进入休眠状态。在这种情况下Timer将无法工作。而Alerm具有cpu锁,将会导致cpu无法休眠。
AlarmManager manger=(AlarManger)getSystemService(Context.ALARM_SERVICE);
manger.set(int flag,long time,PendingIntent pendingIntent);
set方法参数说明:
第一个参数flag为工作类型:
AlarmManger .ELAPSED_REALTIME:让定时时间从开机算起时间算起,但不会唤醒cpu。
AlarmManger.ELAPSED_REALTIME_WAKEUP:同样表示让定时时间从开机算起,但会唤醒 CPU。
RTC:表示让定时任务从1970年1月1日算起,但是不唤醒cpu。
RTC_WAKEUP:表示让定时任务从1970年1月1日算起,但是唤醒cpu。
提示:SystemClock.elapsedReadtime()---获取系统开机至今所经历的毫秒数;
System.currentTimeMillis()-------方法获取1970年1月1日至今天的毫秒数;
第二个参数: 延时的时间,单位毫秒;
第三个参数: PendingIntent指定具体动作;
注意:Android4.4版本后set方法触发不准确,有可能会延时一段时间执行(这不是Bug,是电池性能优化,系统会检测目前有多少个Alarm任务存在,然后将触发相近的几个任务一起执行)
如果要精确执行,将 setExact() 方法代替set()方法。
cancel ( PendingIntent operation )
方法将会取消Intent匹配的任何闹钟。
setRepeating(int type,long triggerAtTime,long interval,PendingIntent operation);
参数说明:interval重复时间间隔;(4.4后触发不准时)
AlarmManger的其它功能:
设置系统时间和时区
添加权限:android.permission.SET_TIME;
通过setTime(long millis)方法设置系统时间;
需要添加android.permission.SET_TIME_ZONE权限。
通过setTimeZone(String tz)方法设置时区;
随着信息化时代的到来,网络安全也越来越多的受到了人们的关注。由于人们的各种工作和生活都越来越离不开手机与网络,所以人们的个人信息在这个过程之中能够被有心人所窃取的可能性也会出现大大增加的情况。所以,越来越多的科技公司将保障用户在使用电子产品时的隐私安全放在发展的第1位。例如安卓13推出了定时自动清理剪贴板内容的功能,这一举措对于保障用户的个人隐私就有非常大的好处。
现在是一个大数据的时代,很多的APP为了推出众多适合用户需求的量身定制内容,从而吸引越来越多的用户来使用这个APP,进而从中获取更多的利益,存在着过度窃取用户个人信息的现象。由于用户在使用搜索功能的时候会不可避免地使用的输入法,所以很多APP就会窃取输入法上的相关内容,尤其是在剪贴板上的内容。有些用户甚至会将自己的账号与密码以及手机通讯录等信息放在剪贴板上,这就加大了自己个人信息泄露的可能性。
那么用户将手机系统升级为安卓13之后,能够隔一段时间就自动清理剪贴板上的内容。虽然部分用户可能会觉得这个功能会给自己带来一定程度上的不便,但是却能够很好的保障用户的个人信息的安全,所以小编认为这项升级的功能是非常有意义的,是非常贴合用户的需求的。
小编认为人们在日常使用手机的过程之中,也要建立足够的保障个人信息安全的意识。例如,对于一些个人账号密码的设置要相对的复杂,不要将一些重要账号的密码设置为自己常用的同一个密码,对于各种不确定的链接,也不要随意的点进去。
个推文档要求必须声明一个名为pushservice的后台进程,亲测应用被杀后依然存活,但系统重启无效。
在后台进程中创建一个定时器,我这里使用的是RxJava,创建了一个每隔1分钟就执行一次的定时任务。
需要注意的是,这里创建的是一个后台 进程,进程 ...和当前进程不一样的进程,在这个独立的进程中,不可以使用应用进程中的全局变量,否则会产生空指针异常。比如取Application就是空。当然,你可以使用跨进程通信的方法解决。
我这里是利用这个进程每隔一分钟启动了一个IntentService,以startForegroundService的方式,这也是谷歌的要求。然后在IntentService里可以访问应用app的资源。我这里是在IntentService里检查相关的条件是否满足,如果满足,就弹出一条通知提醒用户。看到这里你肯定要问,startForegroundService的方式必须调用startForeground显式弹出一个通知,如果不满足条件或者我就是不想弹任何通知,只是想偷偷的做一些后台任务呢?原则上谷歌是不允许这么做的,但是奈何任何系统都有bug,而我发现了一个可以避免弹通知的方法....
Android8 避免startForeground方法弹出通知
利用上面所述,你应该可以实现自己的后台任务了。
开发中经常遇到用计时器的时候,例如:每秒输出一次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的三篇文章。