AlarmManager、PendingIntent的使用附件Home监听十分钟后再度启动应用取消服务

AlarmManager、PendingIntent的使用\附件Home监听十分钟后再次启动应用取消服务

AlarmManager、PaddingIntent的使用\

\附件Home监听十分钟后再次启动应用取消服务

对应AlarmManage有一个AlarmManagerServie服务程 序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系统中,linux实现的设备名 为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列 表找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当 然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接口之间还有一层封装,那就是JNI。

  AlarmManager将应用与服务分割开来后,使得应用程序开发者不用 关心具体的服务,而是直接通过AlarmManager来使用这种服务。这也许就是客户/服务模式的好处吧。AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。

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

5个接口:

  1. // 取消已经注册的与参数匹配的闹铃
  2. void   cancel(PendingIntent operation)
  3. //注册一个新的闹铃
  4. void   set(int type, long triggerAtTime, PendingIntent operation)
  5. //注册一个重复类型的闹铃
  6. void   setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)
  7. //设置时区  设置系统的默认时区。需要android.permission.SET_TIME_ZONE权限
  8. void   setTimeZone(String timeZone)
  9. void setInexactRepeating(int type, long triggerAtTime, long interval, PendingIntent operation) 
    设置一个重复闹钟的不精确版本,它相对而言更节能(power-efficient)一些,因为系统可能会将几个差不多的闹钟合并为一个来执行,减少设备的唤醒次数。 
    内置的几个interval为: 
    INTERVAL_FIFTEEN_MINUTES 
    INTERVAL_HALF_HOUR 
    INTERVAL_HOUR 
    INTERVAL_HALF_DAY 
    INTERVAL_DAY 
    如果你将其设为DAY,那么可能这一天中的所有闹钟都会被合并掉。

5个闹铃类型

  1. public   static   final   int  ELAPSED_REALTIME
  2. // 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时 间,可以通过调用SystemClock.elapsedRealtime()获得。系统值是3    (0x00000003)。
  3. 在指定的延时过后,发送广播,但不唤醒设备。
  4. public   static   final   int  ELAPSED_REALTIME_WAKEUP
  5. //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
  6. 在指定的演示后,发送广播,并唤醒设备 
    延时是要把系统启动的时间SystemClock.elapsedRealtime()算进去的
  7. public   static   final   int  RTC
  8. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
  9. 在指定的时刻,发送广播,但不唤醒设备
  10. public   static   final   int  RTC_WAKEUP
  11. //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
  12. 在指定的时刻,发送广播,并唤醒设备
  13. Public static   final   int  POWER_OFF_WAKEUP
  14. //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。

注意一个重要的参数PendingIntent。这个PendingIntent可以说是 Intent的进一步封装,他既包含了Intent的描述又是Intent行为的执行(这种定义也许不太严格),如果将Intent比作成一个订单的 话,PendingIntent更像是一个下订单的人,因为它既要负责将订单发出去,也要负责订单发送后的处理,比如发送成功后要准备验收订单货物,发送 失败后要重发还是取消订单等操作。开发者可以通过调用

getActivity(Context, int, Intent, int)

getBroadcast(Context, int, Intent, int)

getService(Context, int, Intent, int)

三种不同方式来得到一个PendingIntent实例。

getBroadcast——通过该函数获得的PendingIntent将会 扮演一个广播的功能,就像调用 Context.sendBroadcast()函数一样。当系统通过它要发送一个intent时要采用广播的形式,并且在该intent中会包含相应的 intent接收对象,当然这个对象我们可以在创建PendingIntent的时候指定,也可以通过ACTION 和CATEGORY等描述让系统自动找到该行为处理对象。

  1. Intent intent = new Intent(AlarmController.this, OneShotAlarm.class);
  2. PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this, 0, intent, 0);

getActivity——通过该函数获得的PendingIntent可以直 接启动新的activity, 就像调用 Context.startActivity(Intent)一样.不过值得注意的是要想这个新的Activity不再是当前进程存在的Activity 时。我们在intent中必须使用Intent.FLAG_ACTIVITY_NEW_TASK.

  1. // The PendingIntent to launch our activity if the user selects this notification
  2. PendingIntent contentIntent = PendingIntent.getActivity(this ,  0 ,   new  Intent( this , AlarmService. class ),  0 );

getService——通过该函数获得的PengdingIntent可以直接启动新的Service,就像调用Context.startService()一样。

  1. PendingIntent mAlarmSender = PendingIntent.getService(AlarmService.this , 0 ,  new  Intent(AlarmService. this , AlarmService_Service. class ),  0 );

5s后发送指定广播

Java代码

  1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
  3. int requestCode = 0;
  4. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
  5. requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  6. // 5秒后发送广播,只发送一次
  7. int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
  8. alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent);

5s后发送指定广播,然后每个10秒重复发送广播

Java代码

  1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
  3. int requestCode = 0;
  4. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
  5. requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  6. // 5秒后发送广播,然后每个10秒重复发广播。广播都是直接发到AlarmReceiver的
  7. int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;
  8. int interval = 10 * 1000;
  9. alarmMgr.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, interval, pendIntent);

取消一个闹钟

Java代码

  1. AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
  2. Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
  3. PendingIntent pendIntent = PendingIntent.getBroadcast(getApplicationContext(),
  4. 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
  5. // 与上面的intent匹配(filterEquals(intent))的闹钟会被取消
  6. alarmMgr.cancel(pendIntent);
时间: 2024-11-06 20:41:15

AlarmManager、PendingIntent的使用附件Home监听十分钟后再度启动应用取消服务的相关文章

Oralce配置正确,报监听错误或无法识别描述中的服务

出差客户现场,修改过网络配置,回来后本地虚拟机的Oracle数据库就不能登陆了 报监听错误,在服务器中使用Net Configration Assistant删除以前的,重新配置新的,还是不行,重启系统,再测试 报监听程序当前无法识别连接描述符中请求的服务,这次只在Oracle Net Manager中删除配置的服务重新配置一下,再重启系统,就可以了

SVN开启端口监听,并设置开机启动

svnserve -d -r /home/svn/repo --listen-port=3690,svn仓库地址,及监听端口 vi svn_startup.sh,位置在/root下面编辑一个启动脚本,内容如下: #!/bin/bash /usr/bin/svnserve -d -r /home/svn/repo --listen-port=3690 然后设置chmod 777 /root/svn_startup.sh 然后在设置该脚本为开机启动 vi /etc/rc.d/rc.local,将上述

iOS:Reachability网络监听

iOS利用Reachability确认网络环境3G/WIFI 开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息.如果没有处理它们,是不会通过Apple的审查的. Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法.在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中.如下图: 我们来看看Reachability.h文件中的具体内容: #import <Found

Android监听返回键

android开发中,对返回键事件的监听是要经常用到的,下面以一个例子来演示一下android对返回键的事件监听. public class BackKeyTest extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); se

oracle静态与动态监听

在运行lsnrctl命令的status时,常会看到如下返回值: 服务“test”包含1个例程. 例程"mydata",状态 UNKOWN,包含此服务的一个处理程序... 服务"a"包含1个例程. 例程"mydata",状态 READY,包含此服务的一个处理程序... 这里的,状态UNKOWN即表明为静态注册(手动填写参数): 状态为READY的记录,表明为动态注册(listener.ora参数由PMON进程自动从参数文件获取): 一.静态注册 监

[Java聊天室server]实战之二 监听类

前言 学习不论什么一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列尽管涉及的是socket相关的知识,但学习之前,更想和广大程序猿分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比方近期在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序猿最好还是从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字...

Android实现后台长期监听时间变化

1.首先我们的目的是长期监听时间变化,事实上应用程序退出. 通过了解我们知道注冊ACTION_TIME_TICK广播接收器能够监听系统事件改变,可是 查看SDK发现ACTION_TIME_TICK广播事件仅仅能动态注冊: Broadcast Action: The current time has changed. Sent every minute. You can not receive this through components declared in manifests, only

事件监听的三种方法

事件监听的三种方法: addTarget --用于监听一些点击.值改变等事件 代理       -- 监听一些开始.结束.选中某行等一些改变控制属性的一些事件 通知:上面都不行考虑使用通知 通知使用注意:只要监听通知就要移除通知,否则控制器销毁后,通知发送时就会找不到对象导致程序崩溃 文本框事件的监听: textfied代理只能监听开始编辑结束编辑,能否改变文字,不能监听改变文字后的情况,本项目需要 监听文本框中是否有输入,代理和addTarget都不适用. 文本框发出的三个通知: UIKIT_

Oracle如何配置监听

很多网友提出监听配置相关问题,客户终端(Client)无法连接服务器端(Server).本文现对监听配置作一简单介绍,并提出一些客户终端无法连接服务器端的解决思路. 一.监听器(LISTENER) 监听器是Oracle基于服务器端的一种网络服务,主要用于监听客户端向数据库服务器端提出的连接请求.既然是基于服务器端的服务,那么它也只存在于数据库服务器端,进行监听器的设置也是在数据库服务器端完成的. 二.本地服务名(Tnsname) Oracle客户端与服务器端的连接是通过客户端发出连接请求,由服务