alarmManager关机再苹果6s开机后自动关机还有效吗

关于使用AlarmManager的注意事项 - 简书
关于使用AlarmManager的注意事项
博文出处:,欢迎大家关注我的博客,谢谢!
快过年了,更新春节前的最后一篇博客。
最近在做一个需求:客户端按照规定的时间间隔向服务端发送定位。一看到这个需求就想到了使用 AlarmManager 来实现。 AlarmManager 经常被用来执行定时任务,比如设置闹铃、发送心跳包等。也许有人会有疑问:为什么不能使用相同具有定时效果的 Timer 和 Handler 呢?
其实答案非常简单,相对于 Handler 来说,使用 sendEmptyMessageDelayed 方法是依赖于 Handler 所在的线程的,如果线程结束,就起不到定时任务的效果;而 AlarmManager 依赖的是 Android 系统的服务,具备唤醒机制。比起 Handler 也就更合适了。
而至于 Timer 可以精确地做到定时操作,但是相比于 AlarmManager 而言还是差了一截。同理,如果手机关屏后长时间不使用, CPU 就会进入休眠模式。这个使用如果使用 Timer 来执行定时任务就会失败,因为 Timer 无法唤醒 CPU 。
所以,综上所述,AlarmManager 就成为了最佳选择。
SDK API & 19
一般情况下,使用 AlarmManager 来执行重复定时任务的代码如下所示:
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), TIME_INTERVAL, pendingIntent);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), TIME_INTERVAL, pendingIntent);
setRepeating 该方法用于设置重复定时任务。
第一个参数表示闹钟类型:一般为 AlarmManager.ELAPSED_REALTIME_WAKEUP 或者 AlarmManager.RTC_WAKEUP 。它们之间的区别就是前者是从手机开机后的时间,包含了手机睡眠时间;而后者使用的就是手机系统设置中的时间。所以如果设置为 AlarmManager.RTC_WAKEUP ,那么可以通过修改手机系统的时间来提前触发定时事件。另外,对于相似的 AlarmManager.ELAPSED_REALTIME 和 AlarmManager.RTC 来说,它们不会唤醒 CPU 。所以使用的频率较少;
第二个参数表示任务首次执行时间:与第一个参数密切相关。第一个参数若为 AlarmManager.ELAPSED_REALTIME_WAKEUP ,那么当前时间就为 SystemClock.elapsedRealtime() ;若为 AlarmManager.RTC_WAKEUP ,那么当前时间就为 System.currentTimeMillis() ;
第三个参数表示两次执行的间隔时间:这个参数没什么好讲的,一般为常量;
第四个参数表示对应的响应动作:一般都是去发送广播,然后在广播接收 onReceive(Context context, Intent intent) 中做相关操作。
至此,一切顺利,畅通无阻。
SDK API &= 19 && SDK API & 23
当你写好代码、满心欢喜地将程序跑在手机上的时候,傻眼了!你会发现在 Android 4.4 及以上版本的定时任务不是按照规定时间间隔来执行的。比如你设置了每隔 3 分钟发出一个 HTTP 请求,结果你一看莫名其妙地变成了隔 5 分钟发一次。
What the fuck?
what the fuck
然后你查阅 Android 官网中关于
会看到如下几句话:
Android 4.4 API
恍然大悟!原来是 Google 为了追求系统省电,所以“偷偷加工”了一下唤醒的时间间隔。但也正如上面官网中所说的那样,如果在 Android 4.4 及以上的设备还要追求精准的闹钟定时任务,要使用 setExact() 方法。
所以,相应的代码就变成了这样:
// pendingIntent 为发送广播
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), TIME_INTERVAL, pendingIntent);
private BroadcastReceiver alarmReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
// 重复定时任务
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME_INTERVAL, pendingIntent);
// to do something
doSomething();
当你写好了“加强版”的 AlarmManager 之后,内心肯定无比小激动。这下总应该行了吧?运行一下,果然没错!在 Android 4.4 上的确按照规定的时间间隔在执行任务。哈哈,这下大功告成了!!!
SDK API &= 23
在 Android 4.4 上品尝到胜利的甜头后,你顺便在 Android 6.0 的设备上测试了一下。结果。。。。。。你又 TMD 傻眼了!
What the fuck
发现在设备关屏静止一段时间后, AlarmManager 又又又不能正常工作了。相必此时你连日狗的心都有了吧!强忍着泪水,再次打开 Android 官网中关于
,发现在 Android 6.0 中引入了低电耗模式和应用待机模式。然后接着往下看
,发现会有下面一段话:
Android 6.0 API
啊啊啊啊啊啊!之前在 Android 4.4 上能用的 setExact() 方法在 Android 6.0 上因为低电耗模式又不能正常使用了。但是,Google 又又又提供了新的方法 setExactAndAllowWhileIdle() 来解决在低电耗模式下的闹钟触发。
所以,Attention!相关的代码又被改写为这样:
// pendingIntent 为发送广播
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
} else if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), pendingIntent);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), TIME_INTERVAL, pendingIntent);
private BroadcastReceiver alarmReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
// 重复定时任务
if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME_INTERVAL, pendingIntent);
} else if (Build.VERSION.SDK_INT &= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime() + TIME_INTERVAL, pendingIntent);
// to do something
doSomething();
到了这里,总算是把因 Android 版本差异导致 AlarmManager 的“坑”填完了。这份代码已经可以满足日常的重复定时任务了。
好了,该讲的都讲完了,上床睡觉。仓促地结尾,预祝大家新年快乐!
Goodbye !
References
向前跑 迎着冷眼和嘲笑
与 http://yuqirong.me 保持同步更新
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
13.5 创建定时任务 Android中的定时任务一般有两种实现方式,一种是使用Java API里提供的Timer类,一种是使用Android的Alarm机制。这两种方式在多数情况下都能实现类似的效果,但Timer有一个明显的短板,它并不太适用于那些需要长期在后台运行的定时...
一、Timer TimerTask 参考Java中的Timer和TimerTask在Android中的用法 在开发中我们有时会有这样的需求,即在固定的每隔一段时间执行某一个任务。比如UI上的控件需要随着时间改变,我们可以使用Java为我们提供的计时器的工具类,即Timer和...
在Android中经常需要定时循环执行某一段代码,大家首先想到的是Timer,在一般的场合下,Timer和TimerTask可以完全胜任,但是在有些情况下,Timer就不能很好的完成定时循环任务,如与服务器保持长连接,使用轮询方式。当应用程序关闭掉后Timer也将会...
——Give me all or I prefer nothing This guy is a completest who says no when the answer is yes and frowns while he should have smiled. Thi...
当我选择放弃我的一切 我的朋友 我的家人 去到国外的时候 心情很复杂 我想在一个优秀的环境下继续学习 但又不舍家里
准备走的前几天 每天都是强忍的微笑 因为我知道家里人的任何一个小动作 都有可能触到我的泪腺
你会因为两个女儿必须生个儿子吗? 你会因为二胎必须生三胎吗? 你会认为只有儿子才是老有所依吗? ...... 今天接小不点放学,遇到一朋友的父亲。顺便问下朋友近况如何,是否到家,因为前几天在医院生完三胎,老爷子说已经到家,就想什么时间去看望一下。 其实从心里来说很佩服她的勇...
(文字来自于网络)
周五晚上和朋友相约去电影院观看了《爱丽丝梦游仙境·镜中奇遇记》,这部电影主要讲的是爱丽丝与时间发生的故事。爱丽丝穿越回过去,想救回疯帽子的父母亲人,然而穿越回去并没有改变历史,而是通过不同的方式使历史重现。但最终爱丽丝还是在最后一秒拯救了大家,让时光能量球归于原位,使一切规...为什么关机再开机后,运行的程序还在呢?
为什么关机再开机后,运行的程序还在呢?
袒胸露背迎万箭
我们此时看到的后台程序,仅相当于游戏存档或者浏览记录而已,当内存资源不足时,系统会自动关闭长时间没有运行的软件来释放内存。对于苹果手机用户来讲,虽然不会像安卓那样产生很多缓存文件,仍然也会面临此问题,也可用以下方法应对。应对手机卡顿的其它方法:软件清理:除了手机自带的清理软件,还有用第3方软件进行清理,现在基本所有的APP,都会进行推送,有点还会关联启动其它APP,你可对不需要的APP进行设定关掉信息的推送开关。关闭开机自启软件:可防止在开机时大最的自启软件自动启动进驻到内存,造成手机卡顿,因此将自启开关关掉,可让手机更顺畅。软件搬家:当手机的存储空间小于10%时,系统速度开始与剩余的空间成正比,剩余越小越慢,将非重要的文件搬迁到外存储卡中,给系统运行有更大的空间。
本文仅代表作者观点,不代表百度立场。系作者授权百家号发表,未经许可不得转载。
袒胸露背迎万箭
百家号 最近更新:
简介: 默默看你。爱的越深,就爱的越胆怯。
作者最新文章2014年6月 移动开发大版内专家分月排行榜第二
2014年8月 移动开发大版内专家分月排行榜第三
2014年8月 移动开发大版内专家分月排行榜第三
2014年6月 移动开发大版内专家分月排行榜第一2014年3月 移动开发大版内专家分月排行榜第一
2014年11月 移动开发大版内专家分月排行榜第二2014年4月 移动开发大版内专家分月排行榜第二2014年2月 移动开发大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。& & 转自http://blog.csdn.net/wangjia55/article/details/
最近用到了AlarmManager,遇到了问题,当我设置多个定时器时,发现只有一个起作用,百思不得其解,后来在网上找到了原因,把人家的解决办法贴上:
AlarmManager的常用方法有三个:
(1)set(int type,long startTime,PendingIntent pi);
&&&&&&& 该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。
(2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
&&&&&&& 该方法用于设置重复闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。
(3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi);
&&&&&&& 该方法也用于设置重复闹钟,与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。
三个方法各个参数:
(1)int type:闹钟的类型,常用的有5个值:&
& & & &&AlarmManager.ELAPSED_REALTIME表示闹钟在手机睡眠状态下不可用,该状态下闹钟使用相对时间(相对于系统启动开始),状态值为3;
&&&&&&&&AlarmManager.ELAPSED_REALTIME_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟也使用相对时间,状态值为2;
&&&&&&&&AlarmManager.RTC表示闹钟在睡眠状态下不可用,该状态下闹钟使用绝对时间,即当前系统时间,状态值为1;
&&&&&&&&AlarmManager.RTC_WAKEUP表示闹钟在睡眠状态下会唤醒系统并执行提示功能,该状态下闹钟使用绝对时间,状态值为0;
&&&&&&&&AlarmManager.POWER_OFF_WAKEUP表示闹钟在手机关机状态下也能正常进行提示功能,所以是5个状态中用的最多的状态之一,该状态下闹钟也是用绝对时间,状态值为4;不过本状态好像受SDK版本影响,某些版本并不支持;
(2)long startTime:
&&&&&&& 闹钟的第一次执行时间,以毫秒为单位,可以自定义时间,不过一般使用当前时间。需要注意的是,本属性与第一个属性(type)密切相关,
&&&&&&& 如果第一个参数对应的闹钟使用的是相对时间(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本属性就得使用相对时间(相对于系统启动时间来说),比如当前时间就表示为:SystemClock.elapsedRealtime();
&&&&&&& 如果第一个参数对应的闹钟使用的是绝对时间(RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那么本属性就得使用绝对时间,比如当前时间就表示为:System.currentTimeMillis()。
(3)long intervalTime:
&&&&&&& 对于后两个方法来说,存在本属性,表示两次闹钟执行的间隔时间,也是以毫秒为单位。
(4)PendingIntent pi:
&&&&&&& 是闹钟的执行动作,比如发送一个广播、给出提示等等。PendingIntent是Intent的封装类。需要注意的是,如果是通过启动服务来实现闹钟提示的话,PendingIntent对象的获取就应该采用Pending.getService(Context c,int i,Intent intent,int j)方法;如果是通过广播来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getBroadcast(Context c,int i,Intent intent,int
j)方法;如果是采用Activity的方式来实现闹钟提示的话,PendingIntent对象的获取就应该采用PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。
定时器AlarmManager就说这么多
参见下面的代码:
采用这种做法后面的定时器会将前面的定时器&覆盖&掉,只会启动最后一个定时器
PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags);
第二个参数requestCode一定要是唯一的,比如不同的ID之类的,(如果系统需要多个定时器的话)。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:834次
排名:千里之外
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'ul').hide()" onmouseenter="jQuery('.sitegroup>ul').show()">
绔嬪嵆鍏呭

我要回帖

更多关于 空调开机后自动关机 的文章

 

随机推荐