Android设置多个定时器时只有最后一个定时器有效的问题
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
- AlarmManager.ELAPSED_REALTIME_WAKEUP
- AlarmManager.RTC
- AlarmManager.RTC_WAKEUP
- AlarmManager.POWER_OFF_WAKEUP
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)方法。如果这三种方法错用了的话,虽然不会报错,但是看不到闹钟提示效果。
Android定时器AlarmManager就说这么多
参见下面的代码:
- AlarmManager am = null;
- am = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE);
- for (int i = 0; i < 10; i ++) {
- ...
- Intent i = new Intent("xxx");
- PendingIntent sender = PendingIntent.getBroadcast(context.getApplicationContext(), 0, i, PendingIntent.FLAG_UPDATE_CURRENT);
- ...
- am.setRepeating(...);
- }
采用这种做法后面的定时器会将前面的定时器"覆盖"掉,只会启动最后一个定时器
解决办法
PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags);
第二个参数requestCode一定要是唯一的,比如不同的ID之类的,(如果系统需要多个定时器的话)。
十分感谢论坛的ultrapro大侠
AlarmManager详细的使用参见这位大侠的博客 http://blog.csdn.net/jeethongfei/article/details/6767826
转载于:https://my.oschina.net/tingzi/blog/171267
Android设置多个定时器时只有最后一个定时器有效的问题相关推荐
- Android设置TextView点击时变换颜色(内有无效果解决方案)
设置TextView的点击时变色 1.写好TextView <TextViewandroid:layout_width="wrap_content"android:layou ...
- 编程android控制休眠时间,Android设置锁屏/休眠时长
这个有两个方式: 一种是直接使用api修改: 另一种是修改系统数据库: 调用api需要添加权限,而修改数据库不用. 1.api设置 Settings.System.putInt(getContentR ...
- Android设置锁屏/休眠时长
这个有两个方式: 一种是直接使用api修改: 另一种是修改系统数据库: 调用api需要添加权限,而修改数据库不用. 1.api设置 Settings.System.putInt(getContentR ...
- android canvas drawrect画图,为什么在android中调用canvas.drawRect时只绘制一个矩形?
我正在尝试使用foreach循环为ArrayList中的每个字符串绘制一个矩形,但它似乎只绘制了最后一个矩形. 我看过类似的问题,但他们遇到的问题包括矩形底部高于顶部并调用drawPaint - 但我 ...
- linux内核定时器 详解,Linux系统内核定时器机制详解(下)
7.6.3.4 把一个定时器插入到链表中 函数add_timer()用来把参数timer指针所指向的定时器插入到一个合适的定时器链表中.它首先调用timer_pending()函数判断所指定的定时器是 ...
- Android AlarmManager设置多个定时事件时只最后一个有效问题解决
最近用到了AlarmManager,遇到了问题,当我设置多个定时器时,发现只有一个起作用,百思不得其解,后来在网上找到了原因,把人家的解决办法贴上: AlarmManager的常用方法有三个: (1) ...
- android 两种实现计时器时分秒的实现,把时间放在你的手中~
可能我们在开发中会时常用到计时器这玩意儿,比如在录像的时候,我们可能需要在右上角显示一个计时器.这个东西其实实现起来非常简单. 只需要用一个控件Chronometer,是的,就这么简单,我都不好意思讲 ...
- android 设置键盘弹出动画,Android实现键盘弹出界面上移的实现思路
1.首先说一下思路: 基本就是结合layout中ScrollView视图和AndroidManifest.xml中activity中的android:windowSoftInputMode属性配置实现 ...
- 从源码角度看Android系统Launcher在开机时的启动过程
Launcher是Android所有应用的入口,用来显示系统中已经安装的应用程序图标. Launcher本身也是一个App,一个提供桌面显示的App,但它与普通App有如下不同: Launcher是所 ...
最新文章
- 菜鸟成长之路05/06/07
- Java学习笔记(九)--数组及Arrays类
- Database之SQL:自定义创建数据库的各种表demo集合(以方便理解和分析sql的各种增删改查语法的具体用法)
- STM32开发 -- Keil使用(2)
- BINDER SECCTX PATCH ANALYSIS
- 如何最大限度提升虚拟内存性能(组图)
- ka3525_如何使用KA Lite投放教育内容
- 焦虑症患者,整天心神不宁,忧心忡忡怎么办?
- Tomcat下使用Log4j 接管 catalina.out 日志文件生成方式
- pycharm中plt.show()不显示图像的解决办法
- vivox6Android版本,vivo x6有几个版本?vivo x6各版本区别对比评测
- flex blazeds java spring_flex+blazeds+java+spring后台消息推送
- IDEA社区版安装与概述
- 实现旋转六面体(含动画的基本介绍)
- Java中notify和notifyAll的区别 - 何时以及如何使用
- 打开计算机无法关闭窗口,电脑中“打开或关闭Windows功能”窗口出错无法显示怎么解决...
- 【停课不停学】CSDN学院奉绵薄之力,为程序员做点公益!
- 设计分享 | STM32F103RCT6定时器定时中断原理
- java 做日历_java编程实现日历
- System.Diagnostics.Debug和System.Diagnostics.Trace
热门文章
- 狂赚 1227 亿!腾讯员工 2020 年人均年薪 81 万;小米员工人均年薪 45 万
- 壕!阿里开工红包惊人,最高 1000 万,有人却只收到一杯白开水
- 开发微信小程序,100 万开发者都离不开它
- 数据结构7.5_有向无环图及其应用
- [译]Selenium Python文档:一、安装
- Android组件化打造知乎日报系列(一)—— 项目架构搭建
- Spark Troubleshooting - Task not serializable问题分析
- 吴恩达Coursera机器学习 - Chapter 4 多变量线性回归
- python项目开发:ftp server开发
- zabbix3.0安装