AlarmManager的正确使用姿势
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的正确使用姿势相关推荐
- 论机器学习的正确学习姿势
论机器学习的正确学习姿势 策划 | 刘燕作者 | Caleb Kaiser翻译 | Sambodhi编辑 | Linda很多开发人员并没有机器学习领域的背景,在机器学习如火如荼的今天,没学过机器学习的 ...
- 什么叫取反_转载:CodeReview正确的姿势是什么?
作者:微博是阿里孤尽 链接:https://www.zhihu.com/question/383079175/answer/1109655276 来源:知乎 著作权归作者所有.商业转载请联系作者获得授 ...
- class ts 扩展方法_ts类型声明文件的正确使用姿势
ts类型声明文件的正确使用姿势 ts声明文件类型 npm install @types/jquery --save-dev 与npm一同发布 解释: package.json 中有 types 字段, ...
- java同步锁如何使用_java 同步锁(synchronized)的正确使用姿势
关于线程安全,线程锁我们经常会用到,但你的使用姿势正确不,反正我用错了好长一段时间而不自知.所以有了这篇博客总结下线程锁的正确打开姿势 废话不说看例子 一,对整个方法进行加锁 1,对整个方法进行加锁, ...
- 直播预告|中台基石腾讯云TStack的正确使用姿势
各位亲爱的小伙伴们,你们好啊~~ 他二哥技术直播又和大家见面了! 还记得在第一期的节目中,Sandy小姐姐和两位技术哥哥带我们见识了腾讯自研交换机的强大实力. (赶紧戳链接复习☝) 这次直播,他二哥邀 ...
- MongoDB系列:五、MongoDB Driver使用正确的姿势连接复制集
MongoDB复制集(Replica Set)通过存储多份数据副本来保证数据的高可靠,通过自动的主备切换机制来保证服务的高可用.但需要注意的时,连接副本集的姿势如果不对,服务高可用将不复存在. 使用复 ...
- java 日志使用_Java日志正确使用姿势
前言 关于日志,在大家的印象中都是比较简单的,只须引入了相关依赖包,剩下的事情就是在项目中"尽情"的打印我们需要的信息了.但是往往越简单的东西越容易让我们忽视,从而导致一些不该有的 ...
- Python re 库的正确使用姿势
前提假设: 已经充分掌握 PCRE 风格正则表达式 熟读 re 库文档 Why 正则表达式的强大已不用我赘述,Python 对此的支持也是十分强大,只不过: re.search(pattern, st ...
- 索引的正确“打开姿势”
本文分享自华为云社区<DWS 索引的正确"打开姿势">,原文作者:hoholy . 索引能干什么呢,一言以蔽之:查询加速.常见的索引有下面几种: 1. 常用索引介绍 1 ...
最新文章
- LDP传输地址配置——Vecloud
- STOP:c0000218 {Registry File Failure}
- 菜鸟学Java(六)——简单验证码生成(Java版)
- Django的models操作
- php接口 含义,php晋级必备:一文读懂php接口特点和使用!
- ATM系统之问题描述与词汇表
- 高费率基金是投资者的毒药
- 微擎不现实数组_Java这个类,大概就和现实中吃饭一样常见
- 1067 Sort with Swap(0, i) (25 分) 好,容易出错
- iphone pop服务器没有响应,iPhone 6 Plus跳屏或者触摸失灵的解决办法
- Msfvenom木马使用及TheFatRat工具
- win10怎么弄c语言,win10系统下搭建C语言开发环境方法步骤
- 矩阵最简行阶梯型计算器_商人懂技术,谁也挡不住——首位将机械计算器推向全世界的人...
- 39 个奇葩代码注释,看完笑哭了。。。
- OpenJ_Bailian 2748
- 悲伤时唱首歌:《暗恋桃花源》剧评
- SAP库存--历史库存相关数据,以及库存变化对应表的数据变化,可以用于库龄分析报表逻辑设计。
- 安卓无法下载excel文件
- MOSFET的基本知识
- 中国最低调的河,长约1000公里,却养育了上亿人口