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. 代码雨代码源复制_超火!黑客帝国代码雨
  2. Exploring the 7 Different Types of Data Stories
  3. [笔记]画三角函数-涵盖画图基础
  4. 分享一下我的JAVA自学历程,加上我觉得效果还不错的方法
  5. 什么是css sprites,如何使用?
  6. numpy数组与矩阵运算
  7. [转]Kali-linux安装之后的简单设置
  8. 图论--最小生成树总结(PrimKruskal)
  9. zoj 3209(DLX)
  10. c语言高亮字符,C语言语法高亮工具
  11. IE浏览器请求打开谷歌浏览器
  12. 二进制安装MySQL以及密码破解
  13. 奇葩90后引领了哪些互联网潮流?
  14. 5G网络架构(接入网,传输网,核心网)
  15. idea 解决java文件导入java 文件灰色右下角橙色java图标显示
  16. 郑州大学计算机新媒体专业介绍,数字媒体专业介绍
  17. vue官方示例_树形视图总结
  18. linux笔记(基础用法一)
  19. mysql字符集在哪设置_MySQL字符集设置
  20. 【SSH网上商城项目实战22】获取银行图标以及支付页面的显示

热门文章

  1. 如何简单的把png转ico
  2. CAA教程——CATIA二次开发环境搭建
  3. 医学图像CT预处理,分割肺部(不只是肺实质,整个肺)
  4. RS232/RS485/CAN总线
  5. 心蓝android版本,心蓝12306订票助手2018
  6. SQLAlchemy ORM框架
  7. MATLAB读取txt,excel,ASCII文件
  8. 第十届蓝桥杯大赛PythonB组
  9. Net Core DocXCore 实现word模板导出
  10. word中添加Mathtype公式行间距改变问题