- 浏览: 1575320 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (289)
- java 语法基础 (51)
- spring (8)
- mvc struct /Ant --build.xml (8)
- SOA (0)
- oracle 9i/10g (23)
- sql server 2000-2005 (3)
- 数据库基础知识 (6)
- 设计模式与软件架构 (10)
- Hibernate 持久化 (9)
- J2SE/J2EE/J2ME/AJAX 技术 (8)
- JSF 技术 (3)
- JAVA 图形化 (0)
- JMS (40)
- Eclipse 3.2 IDE 开发技巧 (13)
- 项目处理方法集合 (2)
- html/jsp/javascript (2)
- Unix/Linux (9)
- j2me/ARM/windriver/嵌入式 (4)
- 电信科学 (8)
- jsp (1)
- c/c++ (1)
- LZW压缩算法(java) (2)
- Android (77)
- 版本管理git/svn (2)
最新评论
-
huihai:
有demo吗?
NamingStrategy实现动态表名映射 -
cangbaotu:
推荐给大家一些有用的爬虫源码:https://github.c ...
网络爬虫(源代码参考) -
tuspark:
除了.classpath文件以外,.project文件也应该了 ...
Eclipse .classpath文件浅谈 -
tuspark:
造成eclipse自动关闭的原因有很多,这里有很多介绍:ecl ...
eclipse 自动关闭 解决方案 -
DEMONU:
网上都是这些,这种文章。。。
ActiveMQ中的消息持久性
本文通过对android内置闹铃功能的简单介绍,来让开发者朋友们了解基于OPhone平台下客户/服务模式的编程模型,以及如何使用OPhone 系统提供的闹铃唤醒功能。与此同时,本文还对PendingIntent做一些简单的介绍,并通过实例程序来演示如何通过PendingIntent将闹 钟应用程序和系统闹铃服务联系起来。
一、闹铃功能
闹钟应用程序作为人 们日常常用的基本应用程序之一,其重要性不言而喻。在OPhone系统中闹铃服务功能不仅仅对闹钟应用程序服务,最重要的是可以利用该闹铃服务功能提供的 唤醒能力来做定时器。这样即便应用程序没有运行或者是没有启动的情况下,只要其注册过闹铃,那么该闹铃到时间后,OPhone系统可以自动将该应用程序启 动,这就是所谓的闹铃“唤醒“功能。
在OPhone系统中,底层系统提供了两种类型的时钟,软时钟与硬时钟,软时钟就是我们常说的 Timer,硬时钟就是RTC。系统在正常运行的情况下,Timer工作提供时间服务和闹铃提醒,而在系统进入睡眠状态后,时间服务和闹铃提醒由RTC来 负责。对于上层应用来说,我们并不需要关心是 timer还是RTC为我们提供服务,因为OPhone系统的Framework层把底层细节做了封装并统一提供API。这个API他的名字就叫 AlarmManager。在OPhone系统中有意思的是对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序 才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在OPhone系统中,linux实现的设备名为 ”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表 找到相应的注册闹铃并发出广播。该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。当 然,在JAVA层的AlarmManagerService与Linux Alarm驱动 程序接口之间还有一层封装,那就是JNI。
AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过AlarmManager来使用这种服务。这也 许就是客户/服务模式的好处吧。AlarmManager与AlarmManagerServie之间是通过Binder来通信 的,他们之间是多对一的关系。在OPhone系统中,AlarmManage提供了3个接口5种类型的闹铃服务:
- 3个API调用接口:
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->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种闹铃类型:
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->public static final int ELAPSED_REALTIME
// 当 系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间, 可以通过调用SystemClock.elapsedRealtime()获得。系统值是3 (0x00000003)。
public static final int ELAPSED_REALTIME_WAKEUP
// 能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
public static final int RTC
// 当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用 System.currentTimeMillis()获得。系统值是1 (0x00000001) 。
public static final int RTC_WAKEUP
// 能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
Public static final int POWER_OFF_WAKEUP
// 能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。使用方法同RTC类型,系统值为4(0x00000004)。
开发者可以通过OPhone SDK来获取更多AlarmManager的相关细节,他所在的包是:Android.app.AlarmManager
随着OPhone系统版本的不断的升级,这些接口和闹铃类型也许会有些调整,但其基本使用方法将不会改变
二、闹钟设置与提醒
我们首先通过一个直观的UI来感受一下OPhone系统内嵌的闹钟程序是如何响应用户设置和自动提醒的的:(如下4个图所示)
上面4图直观的告诉了开发者如何使用OPhone内嵌的闹钟应用程序,但开发者可能更关心的是通过代码如何实现这些功能。比如说怎么设置一个闹铃,该设置哪种类型的闹铃,以及如何获得闹铃时间已到并提醒用户。依据这几个问题,我们在下面的章节中逐步来介绍。
2.1 设置闹铃
在第一小节中,我们已经提到过OPhone系统AlarmManagerService提供了两个设置闹铃的API,他们分别是:
void setRepeating( int type, long triggerAtTime, long interval, PendingIntent operation)
在OPhone 1.5版本中又增加了一个API。
下面的程序演示了如何设置一个闹铃。
// 时注册一个闹铃事件接收对象AlarmReceiver ,该接收对象也可以通过在 // AndroidManifest.xml中发布,也可以在代码中动态注册。
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.content.Intent;
import android.os.SystemClock;
import android.os.Bundle;
import java.util.Calendar;
// 创建一个PendingIntent
Intent intent = new Intent(ALARM_ALERT_ACTION);
intent.putExtra(ID, id);
intent.putExtra( TIME , atTimeInMillis);
PendingIntent sender = PendingIntent.getBroadcast(
context, 0 , intent, PendingIntent.FLAG_CANCEL_CURRENT);
// 获得AlarmMnager并注册一个新闹铃,
// 一次性闹铃的设置
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.set(AlarmManager.POWER_OFF_WAKEUP, atTimeInMillis, sender);
// 重复性闹铃的设置
// We want the alarm to go off 30 seconds from now .
long firstTime = SystemClock.elapsedRealtime();
firstTime += 15 * 1000 ;
// Schedule the alarm!
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.POWER_OFF_WAKEUP,
firstTime, 15 * 1000 , sender);
< receiver android:name = " AlarmReceiver " >
< intent - filter >
< action android:name = " com.android.alarmclock.ALARM_ALERT " />
</ intent - filter >
</ receiver >
AlarmReceiver mAlarmReceiver;
IntentFilter filter = new IntentFilter();
filter .addAction(“com.android.alarmclock.ALARM_ALERT”);
context.registerReceiver(mAlarmReceiver, filter );
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
在OPhone系统中,当应用程序所设置的闹铃时间到了后,OPhone系统中的 AlarmManagerService就会从系统底层获取一个闹铃事件并从自己维护的队列中取出其匹配的闹铃,然后通过其应用注册的 PendingIntent把该闹铃事件发送回给应用。
当我们的应用收到该Intent后就会启动相应的Activity来提醒用户闹铃时间到。
程序代码如下:
import android.content.Context;
import android.content.Intent;
import android.content.BroadcastReceiver;
import android.os.Handler;
import android.os.PowerManager;
import android.os.SystemClock;
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
long now = System.currentTimeMillis();
int id = intent.getIntExtra(Alarms.ID, 0 );
long setFor = intent.getLongExtra(Alarms.TIME, 0 );
Intent fireAlarm = new Intent(context, AlarmAlert.class);
fireAlarm.putExtra(Alarms.ID, id);
fireAlarm.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
// 启动一个新的UI对象来提醒
context.startActivity(fireAlarm);
}
}
在前面的章节中,我们在注册闹铃﹑发送闹铃事件的时候,有过一个重要的参数 PendingIntent。这个PendingIntent可以说是 Intent的进一步封装,他既包含了Intent的描述又是Intent行为的执行(这种定义也许不太严格),如果将Intent比作成一个订单的 话,PendingIntent更像是一个下订单的人,因为它既要负责将订单发出去,也要负责订单发送后的处理,比如发送成功后要准备验收订单货物,发送 失败后要重发还是取消订单等操作。开发者可以通过调用getActivity(Context, int, Intent, int), getBroadcast(Context, int, Intent, int), getService(Context, int, Intent, int)函数来得到一个PendingIntent实例。
通过该函数获得的PendingIntent将会扮演一个广播的功能,就像调用 Context.sendBroadcast()函数一样。当系统通过它要发送一个intent时要采用广播的形式,并且在该intent中会包含相应的 intent接收对象,当然这个对象我们可以在创建PendingIntent的时候指定,也可以通过ACTION 和CATEGORY等描述让OPhone系统自动找到该行为处理对象。
实例代码如下:
PendingIntent sender = PendingIntent.getBroadcast(AlarmController.this,
0 , intent, 0 );
通过该函数获得的PendingIntent可以直接启动新的activity, 就像调用 Context.startActivity(Intent)一样.不过值得注意的是要想这个新的Activity不再是当前进程存在的Activity 时。我们在intent中必须使用Intent.FLAG_ACTIVITY_NEW_TASK.
实例代码如下:
PendingIntent contentIntent = PendingIntent.getActivity(this, 0 ,
new Intent(this, AlarmService.class), 0 );
通过该函数获得的PengdingIntent可以直接启动新的Service,就像调用Context.startService()一样。
实例代码如下:
// with the alarm manager.
mAlarmSender = PendingIntent.getService(AlarmService.this,
0 , new Intent(AlarmService.this, AlarmService_Service.class), 0 );
四、PendingInent与 service
在OPhone系统编程中,一个完整OPhone应用程序可以有4个需要创建的模块,他们分别是:
Activity ,Broadcast intent Receiver,Service,Content Provider。Service作为一个OPhone应用程序组成部分,通常运行在系统后台,他与用户之间没有交互。像其他应用程序对象一样运行在所属 进程的主线程中。那么这就意味着它有可能进入长时间的运行等待而导致应用得不到用户的相应。所以在开发者设计程序的时候就要考虑,如果一个Service 要做一些长时间的数据处理时(比如播放MP3 ,或者是网络 下载),就需要把该工作切换到自己的线程空间来执行。
实例代码如下:
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.os.Parcel;
import android.os.RemoteException;
import android.widget.Toast;
// 定义一个 Service 对象
public class AlarmService_Service extends Service {
NotificationManager mNM;
public void onCreate() {
// 创建一个线程来运行Runnable
Thread thr = new Thread( null , mTask, " AlarmService_Service " );
thr.start();
}
public void onDestroy() {
}
Runnable mTask = new Runnable() {
public void run() {
// 通常我们就可以在这里设计长时间运行的功能,
long endTime = System.currentTimeMillis() + 15 * 1000 ;
while (System.currentTimeMillis() < endTime) {
synchronized (mBinder) {
try {
mBinder.wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}
// 停止Service
AlarmService_Service.this.stopSelf();
}
};
// 在编写Service代码时,可以不实现onStart,onStop等函数,但一定要实现onBind函数
public IBinder onBind(Intent intent) {
return mBinder;
}
/* 通过该对象可以与客户端通信
*/
private final IBinder mBinder = new Binder() {
@Override
protected boolean onTransact( int code, Parcel data, Parcel reply,
int flags) throws RemoteException {
return super.onTransact(code, data, reply, flags);
}
};
}
小结: 本 篇文章主要介绍了如何使用AlarmManager的定时唤醒功能,以及各种闹铃的含义与API使用实例,希望对读者朋友们在OPhone应用编程中,对 AlarmManager的正确使用起到抛砖引玉的作用。同时我们还引入了一个重要的概念 PendingIntent,通过对PendingIntent参数的解析,相信读者朋友们对PendingIntent的使用有了一个基本的认识。
发表评论
-
APN(default、mms、supl、dun、hipri接入点类型的区别)
2013-10-10 19:31 45563设置APN上网时,大家可能经常遇到这个问题:为什么有时要填写 ... -
AMR音频编码器概述及文件格式分析
2013-10-10 19:29 3902全称Adaptive Multi-Rate,自适应多速率编码 ... -
pad 强制加载 Hdpi资源 (2.3 dpi < 240)
2012-07-16 16:47 0pad 强制加载 Hdpi资源 (2.3 dpi < ... -
android 设计模式-享元模式
2011-12-16 23:01 2139享元(FlyWeight)模式,原意是“轻量级”模式,它用来解 ... -
statusbar 2.3
2011-11-08 16:04 1235以前我的文章分析过Stat ... -
android 输入法默认设置
2011-07-07 14:00 7132设置默认输入法 在 frameworks\base\co ... -
Android Media Scanner Process
2011-06-06 22:58 3341下面是系统图 Medi ... -
handler与多线程消息处理
2011-06-04 13:42 8231在Android下面也有多线程的概念,在C/C++中,子线程可 ... -
android light
2011-03-24 16:15 3364背光设置是在:设置->声音和显示->亮度,通过进度 ... -
PowerManagerService sensor
2011-03-22 20:06 2625默认分类 2010-12-24 14:34:55 阅读144 ... -
android 单例
2011-02-15 09:26 41801. Framework层的代码: A ... -
Android 开发之 Services 服务
2010-11-02 18:21 4181Service Service ... -
深入学习android之AlarmManager
2010-11-01 16:50 34663对应AlarmManage有一个Alarm ... -
eclipse+android+ddms+adt
2010-09-14 10:30 8376用eclipse + ADT作为android ... -
Menus
2010-09-05 19:01 1744Android Menus 文章分类:移动开发 1.O ... -
Android开机自启动应用开发
2010-08-28 10:07 4541目前需要开发一个开机自启动的GTD应用程序来提醒用户的 ... -
Android2.1_Launcher学习笔记
2010-08-11 13:40 3799文章分类:移动开发 好么,2.0的源码没看几天,2.1的 ... -
Browsing Android Source in Eclipse
2010-08-09 16:00 3380Google’s Android SDK includes ... -
android 编译
2010-08-07 16:31 24781 我的系统是Ubuntu 8.04 * 2 系统上 ... -
Ubuntu linux 右键添加"以管理员身份打开","在终端中打开"
2010-08-02 15:04 4543Ubuntu linux 右键添加"以管理员身份打开 ...
相关推荐
本篇通过AlarmManager和PendingIntent实现定时提醒功能,界面运用Button、TextView、Switch进行布局 同时这也是中国大学慕课移动终端应用开发的网课作业18,我会持续更新我的作业,如果有需要关注一下吧 说明 具体的...
实现可定时响起的闹钟----PendingIntent 与 AlarmManager 的运用
AlarmManager简介 AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service...PendingIntent sender = PendingIntent.getBroadcast(cont
Android闹钟alarmManager+PendingIntent的使用方法,供大家参考,具体内容如下 这次给大家分享两种闹钟: 第一种是当到达闹钟时间后执行一次相应的操作 alarmManager.set(AlarmManager.RTC_WAKEUP,c....
本文实例讲述了Android编程实现PendingIntent控制多个闹钟的方法。分享给大家供大家参考,具体如下: 要用 android.app.PendingIntent.getBroadcast(Context context, int requestCode, Intent intent)来实现控制多...
android-闹钟 使用 AlarmManager、BroadcastReceiver 和 PendingIntent 的重复 Android 警报的简单示例
利用系统服务做到闹钟的功能 private Intent intent; private PendingIntent pendingIntent; private Calendar calendar; private AlarmManager alarmManager; @Override protected void onCreate(Bundle ...
Android 使用... am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);//设置闹钟 Toast.makeText(Sample_12_7.this, "闹钟设置成功", Toast.LENGTH_LONG).show();//提示用户 } }
PendingIntent pi=PendingIntent.getBroadcast(//创建PendingIntent对象 Sample6_12_Activity.this, 0, intent, 0); AlarmManager alarm=(AlarmManager)Sample6_12_Activity.this.getSystemService(ALARM_...
闹钟闹不醒的可以自己去调整下,这个最是最基本的 MainActivity public class MainActivity extends AppCompatActivity { private AlarmManager alarmManager; private PendingIntent pendingIntent; @Override ...
闹钟的简单实现,只有显示时间和设置闹钟。 AlarmView package com.example.lenovo.clock2; import android.app.AlarmManager; import android.app.PendingIntent; import android.app.TimePickerDialog; import ...
简单说一下这次demo内容,首先做一个设置一次性闹钟,先得到alarmManager,打开一个时间对话框,在里面设置闹钟的时间,时间一到发送广播,然后广播接受者接到跳转到新的activity播放音乐。接着是一个反复闹钟,最后...
AlarmManager通常用来开发手机闹钟,并且它是一个全局定时器,可在指定时间或指定周期启动其他组件(包括Activity,Service,BroadcastReceiver) 获取AlarmManager对象: getSystemService(Service.ALARM_SERVICE) 调用...
6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——SensorListener及AudioManager整合应用 6.13 指定...
6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——SensorListener及AudioManager整合应用 6.13 指定...
6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——SensorListener及AudioManager整合应用 6.13 指定...
6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——SensorListener及AudioManager整合应用 6.13 指定...
SEND 6.8 存储卡剩余多少容量——Environment加StatFs 6.9 访问本机内存与存储卡——File的创建与删除 6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——...
6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——SensorListener及AudioManager整合应用 6.13 ...