android AlarmManager 研究

合集下载

android AlarmManager 研究

android AlarmManager 研究

android 4.0目录(?)[-]概述AlarmManagerAlarmManager的成员函数AlarmManagerService逻辑闹钟主要行为设置alarm重复性alarm取消alarm设置系统时间和时区运作细节AlarmThread和Alarm的激发AlarmThread中的runwaitForAlarmtriggerAlarmsLocked进一步处理唤醒闹钟说说AlarmManagerService中的mBroadcastRefCount侯亮1.概述在Android系统中,闹钟和唤醒功能都是由Alarm Manager Service控制并管理的。

我们所熟悉的RTC闹钟以及定时器都和它有莫大的关系。

为了便于称呼,我常常也把这个service简称为ALMS。

另外,ALMS还提供了一个AlarmManager辅助类。

在实际的代码中,应用程序一般都是通过这个辅助类来和ALMS 打交道的。

就代码而言,辅助类只不过是把一些逻辑语义传递给ALMS服务端而已,具体怎么做则完全要看ALMS的实现代码了。

ALMS的实现代码并不算太复杂,主要只是在管理“逻辑闹钟”。

它把逻辑闹钟分成几个大类,分别记录在不同的列表中。

然后ALMS会在一个专门的线程中循环等待闹钟的激发,一旦时机到了,就“回调”逻辑闹钟对应的动作。

以上只是一些概要性的介绍,下面我们来看具体的技术细节。

2.AlarmManager前文我们已经说过,ALMS只是服务端的东西。

它必须向外提供具体的接口,才能被外界使用。

在Android平台中,ALMS 的外部接口为IAlarmManager。

其定义位于frameworks\base\core\java\android\app\IAlarmManager. aidl脚本中,定义截选如下:interface IAlarmManager {void set(int type, long triggerAtTime, in PendingIntent operation);void setRepeating(int type, long triggerAtTime, long interval, in PendingIntent operation);void setInexactRepeating(int type, long triggerAtTime, long interval, in PendingIntent operation);void setTime(long millis);void setTimeZone(String zone);void remove(in PendingIntent operation);}在一般情况下,service的使用者会通过Service Manager Service接口,先拿到它感兴趣的service对应的代理I接口,然后再调用I接口的成员函数向service发出请求。

Android 4.0 Alarm机制浅析

Android 4.0  Alarm机制浅析

Android 4.0 Alarm机制浅析Author: VIC.LUO@最近在做关于Alarm的一些东西,所以就把Android平台上的alarm的源代码给稍微看了看。

我个人其实基本不写文档的,而且即使写,也不过区区数字,这个应该是我工作4年来的第二篇文档(第一篇是写的和我一直以来工作相关的Messaging)所以内容上和排版上大家就不要见怪。

Android系统中alarm机制最大的体现着就是闹钟这个app了。

通过这个应用我们可以设置自己的各种定时闹钟,当然系统中的各种定时相关功能的实现也基本全部依赖Alarm机制。

闹钟的代码在packages\apps\DeskClock\src\com\android\deskclock目录下,可以自行查看,这里主要说的是Alarm机制。

Alarm机制实现的代码主要在./frameworks/base/core/java/android/app/AlarmManager.java./frameworks/base/services/java/com/android/server/AlarmManagerService.java./frameworks/base/services/jni/com_android_server_AlarmManagerService.cpp再往下就是驱动和kernel的代码,个人对驱动和kernel的代码不了解,就不说了。

AlarmManager是framework中提供给用户来使用的API,其实现在AlarmManagerService,为一个server,通过binder机制来提供服务,开机便注册到system_server进程中(所有server实现基本都如此)代码如下(systemserver.java)alarm = new AlarmManagerService(context);ServiceManager.addService(Context.ALARM_SERVICE, alarm);下面就来介绍一下AlarmManagerService,本来想用ams代替,不过一般情况下ams指的是ActivityManagerService,所以也就罢了。

Android中Alarm的机制

Android中Alarm的机制

Android中Alarm的机制本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4。

首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任务上的差别,最后分析Alarm机制的源码。

什么是AlarmAlarm是android提供的用于完成闹钟式定时任务的类,系统通过AlarmManager来管理所有的Alarm,Alarm支持一次性定时任务和循环定时任务,它的使用方式很简单,这里不多做介绍,只给出一个简单的示例:[java]view plaincopyAlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(getApplicationContext(), TestActivity.class); PendingIntent pendIntent =PendingIntent.getActivity(getApplicationContext(),0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //5秒后发送广播,只发送一次int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent); Alarm和Timer以及Handler在定时任务上的区别相同点:三者都可以完成定时任务,都支持一次性定时和循环定时(注:Handler可以间接支持循环定时任务)不同点:Handler和Timer在定时上是类似的,二者在系统休眠的情况下无法正常工作,定时任务不会按时触发。

activity 定时任务原理(一)

activity 定时任务原理(一)

Activity 定时任务原理- 什么是定时任务?- 定时任务是指在预定的时间执行某项任务或操作,可以是一次性的,也可以是周期性的。

- 为什么需要定时任务?- 在很多应用中,需要定期执行一些任务,比如数据清理、数据备份、邮件发送等。

定时任务可以帮助我们自动化这些操作,提高效率。

- Android 中的定时任务- 在 Android 中,可以使用 AlarmManager 来实现定时任务。

AlarmManager 是一个系统级的服务,可以在设备休眠时唤醒设备执行任务。

- AlarmManager 的工作原理- AlarmManager 通过系统的时钟服务来触发预定的任务。

当设置了一个定时任务后,AlarmManager 会在设定的时间唤醒设备并执行相应的操作。

- 注意事项- 定时任务可能会对设备的电量和性能产生影响,因此需要合理使用,避免频繁唤醒设备。

- 在设置定时任务时,需要考虑设备的休眠状态,以免任务无法执行。

- 如何使用 AlarmManager- 首先需要获取 AlarmManager 的实例:```AlarmManager alarmManager = (AlarmManager) getSystemService(_SERVICE);```- 然后创建一个 PendingIntent,用于描述即将执行的操作:```Intent intent = new Intent(this, );PendingIntent pendingIntent = (this, 0, intent, 0);```- 最后,使用 AlarmManager 的 set 方法来设置定时任务:```(_WAKEUP, () + 10000, pendingIntent);```- 其他定时任务的实现方式- 除了 AlarmManager,还可以使用 Handler、Timer 等方式来实现定时任务。

不同的方式适用于不同的场景,需要根据具体情况进行选择。

alarmmanager setexact 方法中的handler参数

alarmmanager setexact 方法中的handler参数

alarmmanager setexact 方法中的handler参数在Android开发中,我们经常会使用到AlarmManager类来实现定时任务的功能。

其中,setExact方法是AlarmManager类中的一个重要方法,它允许我们指定精确的触发时间来执行任务。

在该方法中传递的参数handler,在文档中并未详细解释其含义。

本文将解析AlarmManager类的setExact方法中的handler参数的作用。

AlarmManager是Android提供的一个系统级别的服务,允许我们在指定的时间点触发某些操作。

setExact方法被广泛用于需要精确定时的任务,它会在指定的时间点唤醒设备并执行指定的操作。

其具体用法如下:```javaAlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);Intent intent = new Intent(this, MyBroadcastReceiver.class);PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);alarmManager.setExact(AlarmManager.RTC_WAKEUP,System.currentTimeMillis() + interval, pendingIntent);```在上述代码中,我们通过获取AlarmManager的实例,并创建一个待触发的Intent。

随后,我们使用setExact方法来指定触发的时间点,以及通过PendingIntent来指定触发后需要执行的操作。

在setExact方法中,有一个名为handler的参数。

根据文档,handler 是一个用于处理闹钟触发的事件的Handler对象。

alarmmanager的正确用法

alarmmanager的正确用法

alarmmanager的正确用法AlarmManager是Android中非常重要的一个类,它能够帮助我们实现在特定的时间间隔执行某个任务或在特定的时间点触发某个操作。

正确地使用AlarmManager可以有效地管理后台任务和定时事件。

首先,我们需要在AndroidManifest.xml文件中声明AlarmReceiver,这是一个继承自BroadcastReceiver的类,用于接收AlarmManager发送的广播。

在AlarmReceiver中,我们可以编写我们想要执行的操作。

接下来,我们需要在代码中实例化AlarmManager,并设置一些参数来控制任务的执行时间和间隔。

一般来说,我们可以使用set方法来设置以下几种参数:1. setRepeating(): 这个方法用来设置重复执行某个任务的时间间隔。

它接收四个参数:定时任务的类型,任务的首次执行时间,任务的重复间隔时间,以及用来触发任务的PendingIntent。

2. setExact(): 这个方法用来精确地在某个特定的时间点执行某个任务。

它接收三个参数:定时任务的类型,任务的执行时间,以及用来触发任务的PendingIntent。

这个方法适合需要在精确的时间点执行某个任务的场景。

3. set(): 这个方法用于设置一次性的任务。

它接收三个参数:定时任务的类型,任务的执行时间,以及用来触发任务的PendingIntent。

对于任务的触发操作,我们可以选择使用Activity、Service或BroadcastReceiver来执行。

根据任务的具体需求,选择合适的组件来处理触发事件。

在使用AlarmManager时,需要注意以下几点:1. 注意权限:使用AlarmManager需要声明WAKE_LOCK权限,以便于在设备休眠时唤醒执行任务。

2. 注意内存泄漏:在使用AlarmManager时,需要谨慎管理PendingIntent,确保在不再需要的时候及时取消它们,以避免内存泄漏问题。

android alarmmanager 用法

android alarmmanager 用法

android alarmmanager 用法Android中的AlarmManager是一个用于调度延迟执行或重复执行任务的系统级类。

它可以在指定的时间间隔内执行某个任务或者在特定的日期和时间触发某个任务。

本文将详细介绍AlarmManager的用法,包括如何创建、设置和取消闹钟任务。

一、什么是AlarmManager?Android的AlarmManager是一个系统级别的管理器,用于调度延迟执行或重复执行任务。

它是Android系统中的一个重要部分,可以被应用程序用于一些关键任务,如定时更新数据、触发通知、执行后台操作等。

二、AlarmManager的工作原理AlarmManager使用系统的闹钟服务来调度任务。

当一个任务被设定后,AlarmManager将会启动一个定时器,当定时器到达指定时刻后,系统将会触发相应的操作。

这个操作可以是启动一个服务、发送广播或者唤醒设备等。

三、创建一个闹钟任务要创建一个闹钟任务,首先需要获取AlarmManager的实例。

可以通过如下代码来获取:AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);四、设置一个闹钟任务设置一个闹钟任务需要指定触发时间和任务的触发方式。

Android中提供了三种触发方式:1. ELAPSED_REALTIME:相对时间触发,以系统启动开始计时。

可以使用如下代码来设置:alarmManager.set(AlarmManager.ELAPSED_REALTIME, triggerTime, pendingIntent);其中,triggerTime为触发时间,pendingIntent是一个准备要触发的操作的PendingIntent对象。

2. RTC:绝对时间触发,以1970年1月1日开始计时。

可以使用如下代码来设置:alarmManager.set(AlarmManager.RTC, triggerTime, pendingIntent);3. RTC_WAKEUP:在设备处于休眠状态时,使用绝对时间触发。

利用 AlarmManager 进行系统级闹钟管理

利用 AlarmManager 进行系统级闹钟管理

利用 AlarmManager 进行系统级闹钟管理AlarmManager 是 Android 系统提供的一个用于定时触发特定操作的类。

通过 AlarmManager,我们可以实现在指定时间点或者间隔时间内执行某些任务,比如提醒用户、执行后台操作等。

本文将介绍如何利用 AlarmManager 进行系统级闹钟管理。

一、介绍 AlarmManagerAlarmManager 是 Android 系统的一个系统级别的服务,用于在特定时间点触发指定操作。

它可以在设备休眠的情况下也能正常工作,并且能够持续触发重复性的操作。

使用 AlarmManager 需要以下步骤:1. 获取 AlarmManager 实例:```javaAlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);```2. 创建 PendingIntent 对象:```javaIntent intent = new Intent(this, AlarmReceiver.class);PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);```3. 设置闹钟:```java// 在指定时间触发闹钟alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTimeMillis, pendingIntent);// 在指定时间间隔触发闹钟alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firstAlarmTimeMillis, intervalMillis, pendingIntent);```4. 创建广播接收器 AlarmReceiver:```javapublic class AlarmReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 处理闹钟触发后的操作}}```二、设置系统级闹钟1. 单次闹钟```java// 获取当前时间Calendar currentTime = Calendar.getInstance();// 设置闹钟时间为当前时间的一小时后Calendar alarmTime = Calendar.getInstance();alarmTime.setTimeInMillis(currentTime.getTimeInMillis() + TimeUnit.HOURS.toMillis(1));// 设置闹钟alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), pendingIntent);```2. 重复闹钟```java// 获取当前时间Calendar currentTime = Calendar.getInstance();// 设置闹钟时间为当前时间的第二天早上8点Calendar alarmTime = Calendar.getInstance();alarmTime.set(Calendar.HOUR_OF_DAY, 8);alarmTime.set(Calendar.MINUTE, 0);alarmTime.add(Calendar.DAY_OF_MONTH, 1);// 设置闹钟间隔为一天long intervalMillis = TimeUnit.DAYS.toMillis(1);// 设置闹钟alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), intervalMillis, pendingIntent);```三、取消闹钟如果需要取消闹钟,可以使用 AlarmManager 的 cancel() 方法,并传入之前创建的 PendingIntent 对象。

android 闹钟 原理

android 闹钟 原理

android 闹钟原理
Android闹钟的原理是通过使用系统提供的AlarmManager类
来触发闹钟事件。

当用户设置了闹钟时间并保存后,系统会将该闹钟时间保存在系统的时钟服务里。

AlarmManager会根据
设定的时间来发送一个广播,告知系统该触发闹钟了。

当闹钟时间到达时,系统会向手机发送一个广播,然后通过广播接收者来接收该广播。

闹钟的具体操作由广播接收者来处理,例如发出铃声、震动或者显示闹钟界面。

在闹钟触发后,系统会唤醒设备,即使设备处于休眠状态下也能触发闹钟。

这是因为系统会通过PowerManager类来获取设
备的唤醒锁,确保闹钟能够正常触发。

另外,为了防止闹钟被误触发或被忽略,Android系统提供了
一些权限控制。

用户在设置闹钟时可以选择要求解锁屏幕才能关闭闹钟,这样能确保闹钟能够及时提醒用户。

同时,用户也可以在系统设置中对各个应用的闹钟权限进行管理,防止恶意应用滥用闹钟功能。

总结来说,Android闹钟的原理就是通过AlarmManager类来
设置闹钟时间并触发闹钟事件,由广播接收者处理具体的闹钟操作,并通过PowerManager类唤醒设备,确保闹钟能够正常
触发。

同时,系统还提供权限控制功能,以保证闹钟的可靠性和用户体验。

Android应用保活机制的技术解析

Android应用保活机制的技术解析

Android应用保活机制的技术解析Android应用保活机制是为了延长应用在后台运行的时间,并确保应用能够随时响应用户的操作。

保活机制不仅可以提升用户体验,还可以确保特定的功能在后台持续运行,如消息推送、定位服务等。

本文将对Android应用保活机制进行技术解析,探讨常见的保活方案及其原理。

一、保活方案概述Android应用保活方案主要分为系统级保活和应用级保活两种。

系统级保活通过操作系统提供的机制和接口来启动或维持应用的运行状态,而应用级保活则是在应用内部通过一些技术手段实现的。

1. 系统级保活方案系统级保活方案主要利用Android系统的服务、广播、通知栏等机制来保持应用的后台运行。

常见的系统级保活方案包括:a. 前台服务:将应用以前台服务的形式运行,使其更难被系统杀死;b. AlarmManager定时任务:通过设置定时任务,周期性地唤醒应用,保持其活跃状态;c. JobScheduler调度任务:利用Android 5.0引入的JobScheduler API,实现精细化的任务调度;d. 后台定位:利用定位服务将应用置于后台运行状态,以保持持续的定位更新;e. 多进程保活:通过创建多个进程,将应用的某些关键模块独立出来,提高应用的存活率。

2. 应用级保活方案应用级保活方案属于对系统进行一定程度的定制化,通过改变应用自身的行为来维持后台运行。

常见的应用级保活方案包括:a. 模拟用户操作:通过模拟用户的点击和滑动等动作,保持应用处于前台运行状态;b. 系统广播监听:监听系统广播,识别系统锁屏、解锁等事件,并触发相应的操作以保活应用;c. 双进程守护:通过在应用内创建两个进程,实现相互唤醒和守护,提高应用的存活率;d. Native进程保活:通过创建Native进程,提高应用的存活率;e. 推送管道:建立与服务器的持久连接,通过推送消息来保持应用的活跃状态。

二、保活技术原理解析不同的保活方案背后有不同的技术原理支持,下面将对几种常见的保活技术进行解析。

Android心跳包心跳连接如何实现android和服务器长连接呢?推送消息的原理

Android心跳包心跳连接如何实现android和服务器长连接呢?推送消息的原理

Android⼼跳包⼼跳连接如何实现android和服务器长连接呢?推送消息的原理前⾔:现在的⼤多数移动端应⽤都有实时得到消息的能⼒,简单来说,有发送消息的主动权和接受消息的被动权。

例如:微信,QQ,天⽓预报等等,相信好处和⽤户体验相信⼤家都知道吧。

提出问题:这种功能必须涉及client(客户端)和server(服务器),所以到底client如何和server实现实时连接通讯?分析问题:这种功能实际上就是数据同步,同时要考虑⼿机本⾝、电量、⽹络流量等等限制因素,所以通常在移动端上有⼀下两个解决⽅案:1.⼀种是定时去server查询数据,通常是使⽤HTTP协议来访问web服务器,称Polling(轮询);2.还有⼀种是移动端和服务器建⽴长连接,使⽤XMPP长连接,称Push(推送)。

(按照本⼈理解:客户端的实现时:1while(true) {23 request(timeout);45 request(timeout);67 }客户端发出⼀个“长”请求,如果服务器发送消息或者时间out了,客户端就断开这个请求,再建⽴⼀个长请求)从耗费的电量、流量和数据延迟性各⽅⾯来说,Push有明显的优势。

但是使⽤Push的缺点是:对于客户端:实现和维护相对成本⾼,在移动⽆线⽹络下维护长连接,相对有⼀些技术上的开发难度。

对于服务器:如何实现多核并发,cpu作业调度,数量庞⼤的长连接并发维护等技术,仍存在开发难点。

在讲述Push⽅案的原理前,我们先了解⼀下移动⽆线⽹络的特点。

移动⽆线⽹络的特点:因为 IP v4 的 IP 量有限,运营商分配给⼿机终端的 IP 是运营商内⽹的 IP,⼿机要连接 Internet,就需要通过运营商的⽹关做⼀个⽹络地址转换(Network Address Translation,NAT)。

简单的说运营商的⽹关需要维护⼀个外⽹ IP、端⼝到内⽹ IP、端⼝的对应关系,以确保内⽹的⼿机可以跟 Internet 的服务器通讯原理图如下:GGSN(Gateway GPRS Support Node ⽹关GPRS⽀持结点)模块就实现了NAT功能。

【推荐下载】Android中使用AlarmManager进程被删除的解决办法

【推荐下载】Android中使用AlarmManager进程被删除的解决办法

Android 中使用AlarmManager 进程被删除的解决办法2016/08/16 0 blog.csdn/zhouzhiwengang/article/details/13022325在Android 中,AlarmManager 提供了不受休眠状态的系统定时功能,其一般使用方法如下。

1、创建一个BroadcastReceiver 类的子类,接收定时器事件:publicclassMyReceiverextendsBroadcastReceiver{......}2、在AndroidMenifest.xml 中定义上述广播事件接收类的定义:receiverandroid:name=“.MyReceiver”/receiver 3、在程序中在需要时设置定时器:Intentintent=newIntent(context,MyReceiver.class);PendingIntentpendingIntent=PendingIntent.getBroadcast(context,0,intent,PendingIntent.F LAG_UPDATE_CURRENT);AlarmManageralarmManager=(AlarmManager)context.getSystemService(Context.ALAR M_SERVICE);alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,Sys temClock.elapsedRealtime()+ms,pendingIntent);经过ms 毫秒之后,MyReceiver 会被调用,从而实现定时触发。

但是,上述实现存在一个问题:如果设置定时器的进程被杀死之后,定时器事件就不会触发。

而在Android 中,系统在需要时会自动终止后台进程,因此在定时过程中,进程被杀死的可能性是非常之大的,特别是在一些内存较少的设备中,基本上后台进程所设置的定时器很难被触发。

alarmmanagersetperiodic方法

alarmmanagersetperiodic方法

alarmmanagersetperiodic方法AlarmManager是Android系统中的一个类,用于实现一些特定的时间触发器,可以帮助我们实现定时任务、定时提醒等功能。

setPeriodic 方法是AlarmManager类中的一个常用方法,用于设置重复执行的定时任务。

setPeriodic方法的原型为:public void setPeriodic (long intervalMillis, long triggerAtMillis, PendingIntent operation)参数说明:1. intervalMillis:重复执行的时间间隔,单位为毫秒。

2. triggerAtMillis:任务的第一次触发时间,即任务的开始时间,单位为毫秒。

3. operation:待执行的操作,可以是启动一个服务、广播一个Intent等。

setPeriodic方法可以重复执行一个任务,直到取消或者设备重启。

它会根据设定的时间间隔,在触发时间过后重新设置一个新的触发时间。

例如,如果我们设置intervalMillis为一小时,triggerAtMillis为当前时间,那么每过一小时,定时任务就会触发一次。

下面是一个示例代码,演示了如何使用setPeriodic方法设置一个每分钟触发一次的定时任务:// 创建一个AlarmManager实例AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);// 创建一个广播IntentIntent intent = new Intent(this, MyBroadcastReceiver.class);PendingIntent pendingIntent =PendingIntent.getBroadcast(this, 0, intent, 0);//获取当前时间long currentTimeMillis = System.currentTimeMillis(;//设置任务的第一次触发时间为当前时间long triggerAtMillis = currentTimeMillis;//设置重复执行的时间间隔为一分钟long intervalMillis = 60 * 1000;// 使用setPeriodic方法设置定时任务在上述示例代码中,我们首先通过getSystemService方法获取到AlarmManager的实例。

AndroidAlarmManager实现定时循环后台任务

AndroidAlarmManager实现定时循环后台任务

AndroidAlarmManager实现定时循环后台任务这篇⽂章使⽤AlarmManager实现了Android定时后台循环任务。

使⽤场景:项⽬需要app每隔⼀段时间就去服务端请求⼀次接⼝,从⽽更新本地保存的信息。

AlarmManager简介AlarmManager是Android中常⽤的⼀种系统级别的提⽰服务,在特定的时刻为我们⼴播⼀个指定的Intent。

简单的说就是我们设定⼀个时间,然后在该时间到来时,AlarmManager为我们⼴播⼀个我们设定的Intent,通常我们使⽤ PendingIntent。

项⽬功能简介:AlarmService模拟后台任务,定时发起⼴播AlarmReceive启动AlarmService,达到循环启动Service的效果通过Service和Receiver的死循环,确保后台任务不被系统杀死。

1.AlarmService类/*** ⼀个定时任务*/public class AlarmService extends Service {/*** 每1分钟更新⼀次数据*/private static final int ONE_Miniute=60*1000;private static final int PENDING_REQUEST=0;public AlarmService() {}/*** 调⽤Service都会执⾏到该⽅法*/@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//这⾥模拟后台操作new Thread(new Runnable() {@Overridepublic void run() {Log.e("wj","循环执⾏了,哈哈."+ System.currentTimeMillis());}}).start();//通过AlarmManager定时启动⼴播AlarmManager alarmManager= (AlarmManager) getSystemService(ALARM_SERVICE);long triggerAtTime=SystemClock.elapsedRealtime()+ONE_Miniute;//从开机到现在的毫秒书(⼿机睡眠(sleep)的时间也包括在内Intent i=new Intent(this, AlarmReceive.class);PendingIntent pIntent=PendingIntent.getBroadcast(this,PENDING_REQUEST,i,PENDING_REQUEST);alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,triggerAtTime,pIntent);return super.onStartCommand(intent, flags, startId);}@Overridepublic IBinder onBind(Intent intent) {// TODO: Return the communication channel to the service.throw new UnsupportedOperationException("Not yet implemented");}}2 AlarmReceive类public class AlarmReceive extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {//循环启动ServiceIntent i = new Intent(context, AlarmService.class);context.startService(i);}}3 启动Servicepublic void startService(View view){Intent intent=new Intent(this, AlarmService.class);startService(intent);}别忘了AndroidMainfest中注册⼴播和服务:<serviceandroid:name=".service.AlarmService"android:enabled="true"android:exported="true"/><receiver android:name=".receive.AlarmReceive"/>以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。

Android闹铃服务AlarmManager用法深入分析

Android闹铃服务AlarmManager用法深入分析

Android闹铃服务AlarmManager⽤法深⼊分析本⽂实例讲述了Android闹铃服务AlarmManager⽤法。

分享给⼤家供⼤家参考,具体如下:对应AlarmManage有⼀个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应⽤程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系统中,linux实现的设备名为"/dev/alarm"),并且⼀直监听闹铃设备,⼀旦有闹铃触发或者是闹铃事件发⽣,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并发出⼴播。

该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。

当然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接⼝之间还有⼀层封装,那就是JNI。

AlarmManager将应⽤与服务分割开来后,使得应⽤程序开发者不⽤关⼼具体的服务,⽽是直接通过AlarmManager来使⽤这种服务。

这也许就是客户/服务模式的好处吧。

AlarmManager与AlarmManagerServie之间是通过Binder来通信的,他们之间是多对⼀的关系。

在android系统中,AlarmManage提供了3个接⼝5种类型的闹铃服务。

3个接⼝:// 取消已经注册的与参数匹配的闹铃void cancel(PendingIntent operation)//注册⼀个新的闹铃void set( int type, long triggerAtTime, PendingIntent operation)//注册⼀个重复类型的闹铃void setRepeating( int type, long triggerAtTime, long interval, PendingIntent operation)//设置时区void setTimeZone(String timeZone)Java代码:// 取消已经注册的与参数匹配的闹铃void cancel(PendingIntent operation)//注册⼀个新的闹铃void set(int type, long triggerAtTime, PendingIntent operation)//注册⼀个重复类型的闹铃void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)//设置时区void setTimeZone(String timeZone)5个闹铃类型public static final int ELAPSED_REALTIME// 当系统进⼊睡眠状态时,这种类型的闹铃不会唤醒系统。

物联网开发AlarmManager闹铃管理器的使用

物联网开发AlarmManager闹铃管理器的使用
建BroadcastReceiver,设定闹铃响应动
3
作。
4 • 注册Receiver。
谢谢关注!
setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi)
时间间隔不是固定的重复闹钟
常用方法参数介绍
参数名称 int type
long startTime long intervalTime PendingIntent pi
闹钟的第一次执行时间,以毫秒为单位,可以自定义时间, 不过一般使用当前时间。
两次闹钟执行的间隔时间,也是以毫秒为单位。
绑定了闹钟的执行动作,比如发送一个广播、给出提示等等。 PendingIntent是Intent的封装类。
编程思路
1 • 创建Intent,通常使用PendingIntent。
2 • 创建AlarmManager,并设定闹铃类型。
常用方法
方法名称 set(int type,long startTime,PendingIntent pi)
方法作用 该方法用于设置一次性闹钟
setRepeating(int type,long startTime,long intervalTime,PendingIntent pi)
该方法用于设置重复闹钟
目录
介绍
1
2
常用方法
3
编程思路
AlarmManager, 闹铃管理器,就 是“提醒”,是 Android中常用的 一种系统级别的 提示服务,在特 定的时刻为我们 广播一个指定的 Intent。
介绍
简单来说就是我 们设定一个时间, 然后在该时间到 来时, AlarmManager为 我们广播一个我 们设定的Intent, 执行相应的操作。

AndroidpendingIntent简介及alarmManager的应用

AndroidpendingIntent简介及alarmManager的应用

AndroidpendingIntent简介及alarmManager的应用1.PendingIntent简介PendingIntent 字面意思就是等待的、未决定的Intent。

要得到一个PendingIntent,使用方法类的静态方法getActivity( Context, int, Intent, int), getBroadcast(Context, int, Intent, int), getService(Context, int, Intent, int) 分别对应Intent的3种行为:跳转到一个Activity组件、打开一个广播组件和打开一个服务组件。

使用PendingIntent的目的在于它所包含的Intent的操作的执行是需要满足某些条件的。

且由于其自己有context,不必依赖于某个Activity存在。

主要使用的例子:通知Notification的发送、短信息SMSManager的发送和AlarmManager的执行等。

Android的状态栏通知(Notification)如果需要查看消息,可以拖动状态栏到屏幕下方即可查看消息。

步骤:1 获取通知管理器NotificationManager,它也是一个系统服务2 建立通知Notification notification = new Notification(icon, null, when);3 为新通知设置参数(比如声音,震动,灯光闪烁)4 把新通知添加到通知管理器NotificationManager mNotificationManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE)int icon = android.R.drawable.stat_notify_chat;long when = System.currentTimeMillis();//通知发生的时间为系统当前时间//新建一个通知,指定其图标和标题Notification notification = new Notification(icon, null,when);//第一个参数为图标,第二个参数为短暂提示标题,第三个为通知时间notification.defaults = Notification.DEFAULT_SOUND;//发出默认声音notification.flags |= Notification.FLAG_AUTO_CANCEL;//点击通知后自动清除通知Intent openintent = new Intent(this, OtherActivity.class);PendingIntent contentIntent = PendingIntent.getActivity(this, 0, openintent, 0);//当点击消息时就会向系统发送openintent意图notification.setLatestEventInfo(this, “标题”, “我是内容", contentIntent);mNotificationManager.notify(0, notification);//第一个参数为自定义的通知唯一标识2.AlarmManager的使用Android中常用的一种系统级别的提示服务,在特定时刻广播一个指定的Intent。

Android随笔之——闹钟制作铺垫之AlarmManager详解

Android随笔之——闹钟制作铺垫之AlarmManager详解

Android随笔之——闹钟制作铺垫之AlarmManager详解 说实话,之前写的两篇博客、以及现在要写的,都算是为之后要写的闹钟应⽤做铺垫,有兴趣的话,⼤家可以去看看前两篇博客。

⼀、AlarmManager简介 对于⼀个闹钟应⽤的实现,个⼈觉得最主要的应该要属于AlarmManager了。

AlarmManager称为全局定时器,字⾯意思就是闹钟管理(请原谅我蹩脚的英语),是Android中常⽤的⼀种系统级别的提⽰服务,在特定的时刻为我们⼴播⼀个指定的Intent。

简单的说就是我们设定⼀个时间,然后在该时间到来时,AlarmManager为我们⼴播⼀个我们设定的Intent,通常我们使⽤ PendingIntent(这货在调⽤系统发送短信的时候也有,找个时间温习下Intent,顺带把这个也好好学习下),PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。

在使⽤Intent的时候,我们还需要在执⾏startActivity、startService或sendBroadcast才能使Intent有⽤。

⽽PendingIntent的话就是将这个动作包含在内了。

//定义⼀个PendingIntent对象,此处先照样画葫芦,下次学了再细讲PendingIntent pi = PendingIntent.getBroadcast(Context, int, Intent, int);补充:⽹上有⼈再说PendingIntent的第⼆个和第四个参数不重要,其实不然,如果在闹钟这个应⽤中,你的第⼆个参数都是同⼀个常数,那么你之后设的闹钟会把之前的闹钟给覆盖掉,导致时间到了也不提醒的情况。

解决办法就是:根据设置闹钟时的时间毫秒数来产⽣第⼆个参数。

⼆、AlarmManager常⽤⽅法简介 AlarmManager类提供的常⽤⽅法主要有⼀下⼏个:public void set(int type, long triggerAtMillis, PendingIntent operation)功能:⽤于设置⼀次性闹钟,第⼀个参数表⽰闹钟类型,第⼆个参数表⽰触发这个闹钟要等待的时间,与type相关(不懂英⽂就查字典吧,我也是查了才理解这个参数的意思的),第三个参数闹钟响应的动作参数:type AlarmManager.ELAPSED_REALTIME 在指定的延时过后,发送⼴播,但不唤醒设备。

5--AlarmManager定时器

5--AlarmManager定时器

AlarmManager的使用AlarmManager的作用文档中的解释是:在特定的时刻为我们广播一个指定的Intent。

简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent。

设定时间3:00----》到时间(发送广播)------》接收广播—》启动服务android提供了四种类型的闹钟:❑ELAPSED_REALTIME在指定的延时过后,发送广播,但不唤醒设备。

❑ELAPSED_REALTIME_WAKEUP在指定的演示后,发送广播,并唤醒设备延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的,具体用法看代码。

❑RTC在指定的时刻,发送广播,但不唤醒设备❑RTC_WAKEUP在指定的时刻,发送广播,并唤醒设备AlarmManager提供的方法:❑void set(int type, long triggerAtTime, PendingIntent operation)设置一个闹钟❑void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)设置一个会重复的闹钟❑void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。

内置的几个interval为:INTERVAL_FIFTEEN_MINUTESINTERVAL_HALF_HOURINTERVAL_HOURINTERVAL_HALF_DAYINTERVAL_DAY如果你将其设为DAY,那么可能这一天中的所有闹钟都会被合并掉。

Android延迟实现的几种解决方法及原理分析

Android延迟实现的几种解决方法及原理分析

Android延迟实现的⼏种解决⽅法及原理分析前⾔在Android开发中我们可能会有延时执⾏某个操作的需求,例如我们启动应⽤的时候,⼀开始呈现的是⼀个引导页⾯,过了两三秒后,会⾃动跳转到主界⾯。

这就是⼀个延时操作。

⽽写这篇⽂章的⽬的,是看到群⾥有⼈在实现延迟的时候,⽤如下的第四种⽅法,个⼈感觉有点不妥,为了防⽌更多的⼈有这种想法,所以⾃⼰抽空深⼊分析,就分析的结果,写下此⽂,希望对部分⼈有启⽰作⽤。

1.实现延迟的⼏种⽅法?答:1.java.util.Timer类的:public void schedule(TimerTask task, long delay) {if (delay < 0)throw new IllegalArgumentException("Negative delay.");sched(task, System.currentTimeMillis()+delay, 0);}2.android.os.Handler类:public final boolean postDelayed(Runnable r, long delayMillis){return sendMessageDelayed(getPostMessage(r), delayMillis);}3.android.app.AlarmManager类:@SystemApi@RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)public void set(@AlarmType int type, long triggerAtMillis, long windowMillis,long intervalMillis, OnAlarmListener listener, Handler targetHandler,WorkSource workSource) {setImpl(type, triggerAtMillis, windowMillis, intervalMillis, 0, null, listener, null,targetHandler, workSource, null);}4.Thread.sleep()然后在⼀定时间之后再执⾏想执⾏的代码:new Thread(new Runnable(){Thead.sleep(4*1000);doTask();}).start()2.他们的各⾃的实现原理?答:1.Timer的实现,是通过内部开启⼀个TimerThread:private void mainLoop() {while (true) {try {TimerTask task;boolean taskFired;synchronized(queue) {// Wait for queue to become non-emptywhile (queue.isEmpty() && newTasksMayBeScheduled)queue.wait();if (queue.isEmpty())break; // Queue is empty and will forever remain; die// Queue nonempty; look at first evt and do the right thinglong currentTime, executionTime;task = queue.getMin();synchronized(task.lock) {if (task.state == TimerTask.CANCELLED) {queue.removeMin();continue; // No action required, poll queue again}currentTime = System.currentTimeMillis();executionTime = task.nextExecutionTime;if (taskFired = (executionTime<=currentTime)) {if (task.period == 0) { // Non-repeating, removequeue.removeMin();task.state = TimerTask.EXECUTED;} else { // Repeating task, reschedulequeue.rescheduleMin(task.period<0 ? currentTime - task.period: executionTime + task.period);}}}if (!taskFired) // Task hasn't yet fired; waitqueue.wait(executionTime - currentTime);}if (taskFired) // Task fired; run it, holding no lockstask.run();} catch(InterruptedException e) {}}}是通过wait和延迟时间到达的时候,调⽤notify来唤起线程继续执⾏,这样来实现延迟的话,我们可以回开启⼀个新的线程,貌似为了个延迟没必要这样吧,定时,频繁执⾏的任务,再考虑这个吧。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

android 4.0目录(?)[-]概述AlarmManagerAlarmManager的成员函数AlarmManagerService逻辑闹钟主要行为设置alarm重复性alarm取消alarm设置系统时间和时区运作细节AlarmThread和Alarm的激发AlarmThread中的runwaitForAlarmtriggerAlarmsLocked进一步处理唤醒闹钟说说AlarmManagerService中的mBroadcastRefCount侯亮1.概述在Android系统中,闹钟和唤醒功能都是由Alarm Manager Service控制并管理的。

我们所熟悉的RTC闹钟以及定时器都和它有莫大的关系。

为了便于称呼,我常常也把这个service简称为ALMS。

另外,ALMS还提供了一个AlarmManager辅助类。

在实际的代码中,应用程序一般都是通过这个辅助类来和ALMS 打交道的。

就代码而言,辅助类只不过是把一些逻辑语义传递给ALMS服务端而已,具体怎么做则完全要看ALMS的实现代码了。

ALMS的实现代码并不算太复杂,主要只是在管理“逻辑闹钟”。

它把逻辑闹钟分成几个大类,分别记录在不同的列表中。

然后ALMS会在一个专门的线程中循环等待闹钟的激发,一旦时机到了,就“回调”逻辑闹钟对应的动作。

以上只是一些概要性的介绍,下面我们来看具体的技术细节。

2.AlarmManager前文我们已经说过,ALMS只是服务端的东西。

它必须向外提供具体的接口,才能被外界使用。

在Android平台中,ALMS 的外部接口为IAlarmManager。

其定义位于frameworks\base\core\java\android\app\IAlarmManager. aidl脚本中,定义截选如下:interface IAlarmManager {void set(int type, long triggerAtTime, in PendingIntent operation);void setRepeating(int type, long triggerAtTime, long interval, in PendingIntent operation);void setInexactRepeating(int type, long triggerAtTime, long interval, in PendingIntent operation);void setTime(long millis);void setTimeZone(String zone);void remove(in PendingIntent operation);}在一般情况下,service的使用者会通过Service Manager Service接口,先拿到它感兴趣的service对应的代理I接口,然后再调用I接口的成员函数向service发出请求。

所以按理说,我们也应该先拿到一个IAlarmManager接口,然后再使用它。

可是,对Alarm Manager Service来说,情况略有不同,其最常见的调用方式如下:manager = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);其中,getSystemService()返回的不再是IAlarmManager接口,而是AlarmManager对象。

我们参考AlarmManager.java文件,可以看到AlarmManager类中聚合了一个IAlarmManager接口,private final IAlarmManager mService;也就是说在执行实际动作时,AlarmManager只不过是把外界的请求转发给内部聚合的IAlarmManager接口而已。

2.1 AlarmManager的成员函数AlarmManager的成员函数有:AlarmManager(IAlarmManager service)public void set(int type, long triggerAtTime, PendingIntent operation)public void setRepeating(int type, long triggerAtTime, long interval,PendingIntent operation)public void setInexactRepeating(int type, long triggerAtTime, long interval,PendingIntent operation)public void cancel(PendingIntent operation)public void setTime(long millis)public void setTimeZone(String timeZone)即1个构造函数,6个功能函数。

基本上完全和IAlarmManager 的成员函数一一对应。

另外,AlarmManager类中会以不同的公共常量来表示多种不同的逻辑闹钟,在Android 4.0的原生代码中有4种逻辑闹钟:1)RTC_WAKEUP2)RTC3)ELAPSED_REALTIME_WAKEUP4)ELAPSED_REALTIME应用侧通过调用AlarmManager对象的成员函数,可以把语义传递到AlarmManagerService,并由它进行实际的处理。

3.AlarmManagerServiceALMS的重头戏在AlarmManagerService中,这个类继承于IAlarmManager.Stub,所以是个binder实体。

它包含的重要成员如下:其中,mRtcWakeupAlarms等4个ArrayList<Alarm>数组分别对应着前文所说的4种“逻辑闹钟”。

为了便于理解,我们可以想象在底层有4个“实体闹钟”,注意,是4个,不是4类。

上面每一类“逻辑闹钟”都会对应一个“实体闹钟”,而逻辑闹钟则可以有若干个,它们被存储在ArrayList中,示意图如下:当然,这里所说的“实体闹钟”只是个概念而已,其具体实现和底层驱动有关,在frameworks层不必过多关心。

Frameworks层应该关心的是那几个ArrayList<Alarm>。

这里的Alarm对应着逻辑闹钟。

3.1 逻辑闹钟Alarm是AlarmManagerService的一个内嵌类Alarm,定义截选如下:private static class Alarm {public int type;public int count;public long when;public long repeatInterval;public PendingIntent operation;public int uid;public int pid;. . . . . .其中记录了逻辑闹钟的一些关键信息。

type域:记录着逻辑闹钟的闹钟类型,比如RTC_WAKEUP、ELAPSED_REALTIME_WAKEUP等;count域:是个辅助域,它和repeatInterval域一起工作。

当repeatInterval大于0时,这个域可被用于计算下一次重复激发alarm的时间,详细情况见后文;when域:记录闹钟的激发时间。

这个域和type域相关,详细情况见后文;repeatInterval域:表示重复激发闹钟的时间间隔,如果闹钟只需激发一次,则此域为0,如果闹钟需要重复激发,此域为以毫秒为单位的时间间隔;operation域:记录闹钟激发时应该执行的动作,详细情况见后文;uid域:记录设置闹钟的进程的uid;pid域:记录设置闹钟的进程的pid。

总体来说还是比较简单的,我们先补充说明一下其中的count域。

这个域是针对重复性闹钟的一个辅助域。

重复性闹钟的实现机理是,如果当前时刻已经超过闹钟的激发时刻,那么ALMS会先从逻辑闹钟数组中摘取下Alarm节点,并执行闹钟对应的逻辑动作,然后进一步比较“当前时刻”和“Alarm理应激发的理想时刻”之间的时间跨度,从而计算出Alarm的“下一次理应激发的理想时刻”,并将这个激发时间记入Alarm节点,接着将该节点重新排入逻辑闹钟列表。

这一点和普通Alarm 不太一样,普通Alarm节点摘下后就不再还回逻辑闹钟列表了。

“当前时刻”和“理应激发时刻”之间的时间跨度会随实际的运作情况而变动。

我们分两步来说明“下一次理应激发时刻”的计算公式:1)count = (时间跨度/ repeatInterval ) + 1 ;2)“下一次理应激发时刻” = “上一次理应激发时刻”+ count * repeatInterval ;我们画一张示意图,其中绿色的可激发时刻表示“上一次理应激发时刻”,我们假定“当前时刻”分别为now_1处或now_2处,可以看到会计算出不同的“下一次理应激发时刻”,这里用桔红色表示。

可以看到,如果当前时刻为now_1,那么它和“上一次理应激发时刻”之间的“时间跨度”是小于一个repeatInterval 的,所以count数为1。

而如果当前时刻为now_2,那么“时间跨度”与repeatInterval的商取整后为2,所以count数为3。

另外,图中那两个虚线箭头对应的可激发时刻,只是用来做刻度的东西。

3.2 主要行为接下来我们来看ALMS中的主要行为,这些行为和AlarmManager辅助类提供的成员函数相对应。

3.2.1 设置alarm外界能接触的设置alarm的函数是set():public void set(int type, long triggerAtTime, PendingIntent operation)type:表示要设置的alarm类型。

如前文所述,有4个alarm 类型。

triggerAtTime:表示alarm“理应激发”的时间。

operation:指明了alarm闹铃激发时需要执行的动作,比如执行某种广播通告。

设置alarm的动作会牵扯到一个发起者。

简单地说,发起者会向Alarm Manager Service发出一个设置alarm的请求,而且在请求里注明了到时间后需要执行的动作。

由于“待执行的动作”一般都不会马上执行,所以要表达成PendingIntent的形式。

(PendingIntent的详情可参考其他文章)另外,triggerAtTime参数的意义也会随type参数的不同而不同。

简单地说,如果type是和RTC相关的话,那么triggerAtTime的值应该是标准时间,即从1970 年1 月1 日午夜开始所经过的毫秒数。

相关文档
最新文档