AlarmManager 这个类在 Android 开发中非常实用,它是系统及服务,可以进行定时操作而不依赖于 Acitivity 或 Service,但是 Android 在不同的 API 级别中有一定的差异性,往往给开发带来一定的困难,这里将举例说明 AlarmManager 在不同 API 级别中的基本使用方法。

在 Android 4.4 之前,一般都是使用 alarmManager 的 set 方法和 setRepeating 来实现定时操作,从这两个方法的名字就可以看出两者的区别,set 方法一般用来实现在指定的时间执行一次性的操作,而 setRepeating 方法用来实现每隔一段时间执行一次的操作。

但是从 Android 4.4 开始,set 方法和 setRepeating 方法存在一些问题,无法实现准确定时,可能会有些延迟,官方也提供了准确定时的替代方法,即 setExact 和 setWindow,但是这两个方法都只是执行一次性操作的,那么如何才能实现每隔一段时间执行一次的操作呢?

其实很简单,只要在时间到了执行操作的时候再重新设置一下 AlarmManager 就好了,为了方便版本的统一,我们这里在 Android 4.4 之前和之后都使用这样的方法来实现每隔一段时间执行一次的操作。

这里我们以一个 TextView 实现数字时钟为例,代码如下:

public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);final TextView tv = (TextView) findViewById(R.id.text_view);IntentFilter intentFilter = new IntentFilter();intentFilter.addAction("update_time_action");registerReceiver(new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().equals("update_time_action")) {
//                  接收到广播之后先设置tv,然后重新设置AlarmManagertv.setText(getText());AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);long nextTime = getNextTime();if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {am.setExact(AlarmManager.RTC_WAKEUP, nextTime, pi);} else {am.set(AlarmManager.RTC_WAKEUP, nextTime, pi);}}}}, intentFilter);sendBroadcast(new Intent("update_time_action"));}//    获取当前时间的样式private String getText() {Date date = new Date(System.currentTimeMillis());SimpleDateFormat format = new SimpleDateFormat("HH:mm");return format.format(date);}//    获取下次更新TextView的时间private long getNextTime() {long now = System.currentTimeMillis();return now + 60 * 1000 - now % (60 * 1000);}
}

这里没有显示当前的秒数,因为 AlarmManager 最少只能每5秒执行一次操作,所以不能每秒钟都更新一次,如果需要显示秒数,可以使用 handle 的 postDelay 方法来实现,实现的方法非常简单,这里不再叙述

AlarmManager的正确使用姿势相关推荐

  1. 论机器学习的正确学习姿势

    论机器学习的正确学习姿势 策划 | 刘燕作者 | Caleb Kaiser翻译 | Sambodhi编辑 | Linda很多开发人员并没有机器学习领域的背景,在机器学习如火如荼的今天,没学过机器学习的 ...

  2. 什么叫取反_转载:CodeReview正确的姿势是什么?

    作者:微博是阿里孤尽 链接:https://www.zhihu.com/question/383079175/answer/1109655276 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...

  3. class ts 扩展方法_ts类型声明文件的正确使用姿势

    ts类型声明文件的正确使用姿势 ts声明文件类型 npm install @types/jquery --save-dev 与npm一同发布 解释: package.json 中有 types 字段, ...

  4. java同步锁如何使用_java 同步锁(synchronized)的正确使用姿势

    关于线程安全,线程锁我们经常会用到,但你的使用姿势正确不,反正我用错了好长一段时间而不自知.所以有了这篇博客总结下线程锁的正确打开姿势 废话不说看例子 一,对整个方法进行加锁 1,对整个方法进行加锁, ...

  5. 直播预告|中台基石腾讯云TStack的正确使用姿势

    各位亲爱的小伙伴们,你们好啊~~ 他二哥技术直播又和大家见面了! 还记得在第一期的节目中,Sandy小姐姐和两位技术哥哥带我们见识了腾讯自研交换机的强大实力. (赶紧戳链接复习☝) 这次直播,他二哥邀 ...

  6. MongoDB系列:五、MongoDB Driver使用正确的姿势连接复制集

    MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复 ...

  7. java 日志使用_Java日志正确使用姿势

    前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中"尽情"的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的 ...

  8. Python re 库的正确使用姿势

    前提假设: 已经充分掌握 PCRE 风格正则表达式 熟读 re 库文档 Why 正则表达式的强大已不用我赘述,Python 对此的支持也是十分强大,只不过: re.search(pattern, st ...

  9. 索引的正确“打开姿势”

    本文分享自华为云社区<DWS 索引的正确"打开姿势">,原文作者:hoholy . 索引能干什么呢,一言以蔽之:查询加速.常见的索引有下面几种: 1. 常用索引介绍 1 ...

最新文章

  1. LDP传输地址配置——Vecloud
  2. STOP:c0000218 {Registry File Failure}
  3. 菜鸟学Java(六)——简单验证码生成(Java版)
  4. Django的models操作
  5. php接口 含义,php晋级必备:一文读懂php接口特点和使用!
  6. ATM系统之问题描述与词汇表
  7. 高费率基金是投资者的毒药
  8. 微擎不现实数组_Java这个类,大概就和现实中吃饭一样常见
  9. 1067 Sort with Swap(0, i) (25 分) 好,容易出错
  10. iphone pop服务器没有响应,iPhone 6 Plus跳屏或者触摸失灵的解决办法
  11. Msfvenom木马使用及TheFatRat工具
  12. win10怎么弄c语言,win10系统下搭建C语言开发环境方法步骤
  13. 矩阵最简行阶梯型计算器_商人懂技术,谁也挡不住——首位将机械计算器推向全世界的人...
  14. 39 个奇葩代码注释,看完笑哭了。。。
  15. OpenJ_Bailian 2748
  16. 悲伤时唱首歌:《暗恋桃花源》剧评
  17. SAP库存--历史库存相关数据,以及库存变化对应表的数据变化,可以用于库龄分析报表逻辑设计。
  18. 安卓无法下载excel文件
  19. MOSFET的基本知识
  20. 中国最低调的河,长约1000公里,却养育了上亿人口

热门文章

  1. 深度解读:云网融合的多云网络
  2. 5G无线网节能关键技术
  3. 2023免费电脑录视频软件Camtasia
  4. 疯狂的大柚柚带你玩转MSP-ESP430G2(基础篇)-----(八)低功耗模式补充
  5. 数据库身份证号用什么类型_这10种情况,看看你适合用什么类型的造口袋
  6. 软件SCCB协议学习笔记
  7. 点分治 【BZOJ3784】树上路径
  8. PDF Expert for mac(专业的PDF编辑器) 中文版
  9. 基于QT的界面框架qcanpool使用教程(废弃)
  10. Anaconda下安装opencv