Android设置多个定时器时只有最后一个定时器有效的问题

android AlarmManager闹钟设置多次只响应一次和响应多次以及传参的实现 在开发中,遇到设置闹钟但是遇到设置多次结果只响应一次,查阅好多资料终于解决了,现在把解决的方法分享一下,其次就是如果传参的问题,也一并贴出来供大家参考 代码如下: import android.app.AlarmManager; import android.app.PendingIntent; import android.content.Context; import android.cont... 阅读详情


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个值:  

[java]  view plain copy print ?
  1. AlarmManager.ELAPSED_REALTIME  
  2. AlarmManager.ELAPSED_REALTIME_WAKEUP  
  3. AlarmManager.RTC  
  4. AlarmManager.RTC_WAKEUP  
  5. 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就说这么多

参见下面的代码:

[java]  view plain copy print ?
  1. AlarmManager am = null;  
  2. am = (AlarmManager) context.getApplicationContext().getSystemService(Context.ALARM_SERVICE);  
  3. for (int i = 0; i < 10; i ++) {  
  4.     ...  
  5.     Intent i = new Intent("xxx");  
  6.     PendingIntent sender = PendingIntent.getBroadcast(context.getApplicationContext(), 0, i, PendingIntent.FLAG_UPDATE_CURRENT);  
  7.     ...  
  8.     am.setRepeating(...);  
  9. }  

采用这种做法后面的定时器会将前面的定时器"覆盖"掉,只会启动最后一个定时器

解决办法

PendingIntent.getBroadcast(Context context, int requestCode, Intent intent, int flags);

第二个参数requestCode一定要是唯一的,比如不同的ID之类的,(如果系统需要多个定时器的话)。


十分感谢论坛的ultrapro大侠

AlarmManager详细的使用参见这位大侠的博客 http://blog.youkuaiyun.com/jeethongfei/article/details/6767826

Android设置多个定时器时只有最后一个有效的问题解决 先看这段API: 我们会用到PendingIntent 来获取一个实例它有四个参数: PendingIntent  pi = PendingIntent.getBroadcast(context, requestCode, intent, flags) content 和 intent 比较熟悉,不必多说 主要是flag,它有以下参数: FLAG_CANCEL_CURRE 阅读详情

相关推荐

Android蓝牙源码分析——GKI定时器

GKI定时器初始化在gki_ulinux.c中的GKI_init中,如下:void GKI_init(void) { ...... struct sigevent sigevent; memset(&sigevent, 0, sizeof(sigevent)); sigevent.sigev_notify = SIGEV_THREAD; sigevent.sig

风语的专栏 2847

Android 定时循环任务实现

AlarmManager实现定时循环后台任务这篇文章使用AlarmManager实现了Android定时后台循环任务。使用场景:项目需要app每隔一段时间就去服务端请求一次接口,从而更新本地保存的信息。AlarmManager简介AlarmManager是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,Al

IT_默 9798

Android Alarm多任务定时

多功能闹钟实现代码

Android 800

android 多个闹钟定时器,Android设置多个定时器时只有最后一个定时器有效的问题...

AlarmManager的常用方法有三个:(1)set(int type,long startTime,PendingIntent pi);该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。(2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi);该...

weixin_33603963的博客 641

RT-Thread 应用笔记 - RTC Alarm组件的使用

背景 调试完rtc,需要实现闹钟的功能,rt-thread已经有了闹钟alarm的组件。 但没找到较详细的使用文档或实现例程。 熟悉MCU平台的rtc alarm功能,把rt-thread alarm组件用起来。 使能 RTC Alarm组件 使用rt-thread ENV工具:menuconfig [RT-Thread Components] -> [Device Drivers] -> [Using RTC device drivers] -> [Using RTC .

坚韧与专注 2726

从SVF文件到高效验证:Formality中set_svf命令的隐藏技巧与实战解析

本文深入解析Formality中set_svf命令的高级应用技巧,涵盖SVF文件生成策略、多文件加载优化及验证效率提升方法。通过-append和-ordered选项的实战应用,帮助工程师解决芯片验证中的常见问题,实现验证通过率与运行效率的双重提升。

mqtt6iot的博客 819

Android AlarmManager设置多个定时事件时只最后一个有效问题解决

最近用到了AlarmManager,遇到了问题,当我设置多个定时器时,发现只有一个起作用,百思不得其解,后来在网上找到了原因,把人家的解决办法贴上: AlarmManager的常用方法有三个: (1)set(int type,long startTime,PendingIntent pi);         该方法用于设置一次性闹钟,第一个参数表示闹钟类型,第二个参数表示闹钟执行时间,第

wangjia55的专栏 1万+

避开这5个坑!用MATLAB做核密度估计时90%人会犯的错误

本文详细解析了使用MATLAB进行核密度估计时常见的5个高频错误,包括三维数据可视化、带宽参数优化、大数据量处理、核函数选择及版本兼容性问题。特别针对核密度估计中的关键参数带宽(bandwidth)提供了数据驱动的优化策略,帮助用户提升分析精度与效率。

jenkins8butler的博客 277

AlarmManager 设置多个提醒只有最后一个有效

先来说一下AlarmManager的使用方法         Intent intent1 = new Intent("ELITOR_CLOCK_STARTUP"); intent1.putExtra("msg", "开机时间到了"); PendingIntent pi = PendingIntent.getService(context, 0, intent1,...

Tdaidai1224696648的博客 1519

Oracle19c SYSAUX表空间爆满?手把手教你清理SM/ADVISOR和AUDSYS占用(附完整SQL)

本文详细解析了Oracle19c中SYSAUX表空间爆满的常见原因及解决方案,重点针对SM/ADVISOR和AUDSYS组件的空间占用问题提供了完整的SQL清理脚本。通过诊断查询、空间清理和预防性维护策略,帮助DBA有效管理SYSAUX表空间,确保数据库稳定运行。

weixin_28338005的博客 238

MOS 管驱动设计细节,波形分析

一般认为MOSFET是电压驱动的,不需要驱动电流。然而,在MOS的G S两级之间有结电容存在,这个电容会让驱动MOS变的不那么简单。 如果不考虑纹波和EMI等要求的话,MOS管开关速度越快越好,因为开关时间越短,开关损耗越小,而在开关电源中开关损耗占总损耗的很大一部分,因此MOS管驱动电路的好坏直接决定了电源的效率。 对于一个MOS管,如果把GS之间的电压从0拉到管子的开启电压所用的时间越短,那么MOS管开启的速度就会越快。与此类似,如果把MOS管的GS电压从开启电压降到0V的时间越短,那么MOS管关断的

m0_50862404的博客 1万+

[踩坑]移动端安卓微信浏览器video.currentTime设置无效

背景介绍: 项目需求是video的src是异步获取的,因此在移动端碰到了currentTime设置无效的问题。 原因大概是currentTime先赋值了,但是视频资源还没有加载完成。 网上搜了一些方法: var myPlayer = $("#player"); var userAgent_m = navigator.userAgent; if(userAgent_m.indexOf("iPhone...

weixin_44945942的博客 4028

【银河麒麟服务器操作系统】安装英伟达4090D显卡驱动操作指南

本文详细介绍了在银河麒麟高级服务器操作系统V10SP3-2403-X86版本上安装NVIDIA RTX4090D显卡驱动的完整流程。主要内容包括:准备工作检查、开源驱动禁用、运行级别切换、依赖包安装以及交互式安装过程中的关键选项选择(32位库选Yes、X配置选No)。通过禁用nouveau驱动、重建内核引导等步骤确保驱动安装成功,最后通过nvidia-smi命令验证驱动安装情况。文档提供了操作检查表和安装流程图,帮助用户在银河麒麟系统上顺利完成显卡驱动部署。

信创运维工程师 · 银河麒麟 & 容器实战 | 金融生产环境迁移·等保加固 | 142篇原创·17万+阅读 3106

【Android开发实践笔记1】解决Android定时器无法关闭/停止问题

引言 公司有一个项目需要Android APP应用实现,原嵌入式开发出身的我,为了完成公司的项目,也参与了Android的研究。由于并没有学习过Java,以及Android,在开发过程中也请教了不少身边专注这方面的同学以及朋友,首先在此表示感谢。 问题引入 在开发过程中,需要改写DEMO代码实现功能,遇到了一个虚拟摇杆代码,其工作思路是这样的: 虚拟摇杆检测到手指按下,并且向前,则开启定时器以30...

RayCongLiang的博客 1797

Codex 100个真实案例 - 用AI批量清洗Excel脏数据(10万行3分钟搞定)

每个做数据分析的人都被"脏数据"折磨过——空值、重复行、日期格式五花八门、手机号多一位少一位……手动清洗几千行就已经让人崩溃,更别提10万行了。本文将展示如何用 Codex 生成一套完整的 Python pandas 数据清洗工具,从读取Excel/CSV、识别脏数据、自动清洗、生成清洗报告,到可视化对比清洗前后的数据质量,全程自然语言驱动,10万行数据3分钟搞定!

yueyeguzhuo的专栏 88

【国密】基于SM2的协同签名与协同解密方案

两方协同签名指客户端与服务端协同完成签名、验签操作,具体实现方案参考了信工所专利[3]。在业务应用中,两方或多方的协同签名一般采用门限签名方案可以用来构造。门限密码算法在多方协作的相关场景中应用十分广泛,可以实现数据联合授权、认证、密钥安全恢复、密钥安全交换等需求,在诸多分布式多方计算协议中均可见其身影。在上述两方协同签名方案中,最巧妙的地方在于签名值s分量的构造,通过一些列数学变换,得以恢复。以下从两方协同签名方案介绍入手,介绍门限密码在协同签名中的应用。解决上述问题的关键在于门限密码算法的巧妙构造。

听雨草堂 8391

android息屏休眠定时器心跳停止运行

分两种情况: 1.当手机连接usb电源时,息屏不会造成定时器暂停运行 2.当手机未连接usb电源时,息屏会造成定时器暂停运行,并在再次点亮屏幕时定时器重新开始工作 测试: 1.service保活,在service中启动定时器,无法解决 2.开启WakeLock无法解决 3.使用AlarmManager、CountDownTimer、Handler、Timer定时器,无法解决 …… 分析: 通过网上的一系列方法都不能很好的解决这个问题,所以归根结底还是回到手机本身系统来看这个问题。随着a..

浪克oo的博客 4987

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

安卓中定时器和线程的使用

安卓中常使用定时器来实现计时的任务,而使用线程来实现耗时的操作,如何通过Handler进行消息处理,这里做一下总结。

高淳小弟的博客 3365

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Android AlarmManager定时器设置

AlarmManager定时器

tq501501的博客 1660

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: Android广播大全
下一篇: location of the android sdk has not been setup in the preferences如何解决
yanjunhui2011
博客等级 码龄15年 14粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值