androidalarmWord格式文档下载.docx

上传人:b****3 文档编号:6790467 上传时间:2023-05-07 格式:DOCX 页数:12 大小:108.36KB
下载 相关 举报
androidalarmWord格式文档下载.docx_第1页
第1页 / 共12页
androidalarmWord格式文档下载.docx_第2页
第2页 / 共12页
androidalarmWord格式文档下载.docx_第3页
第3页 / 共12页
androidalarmWord格式文档下载.docx_第4页
第4页 / 共12页
androidalarmWord格式文档下载.docx_第5页
第5页 / 共12页
androidalarmWord格式文档下载.docx_第6页
第6页 / 共12页
androidalarmWord格式文档下载.docx_第7页
第7页 / 共12页
androidalarmWord格式文档下载.docx_第8页
第8页 / 共12页
androidalarmWord格式文档下载.docx_第9页
第9页 / 共12页
androidalarmWord格式文档下载.docx_第10页
第10页 / 共12页
androidalarmWord格式文档下载.docx_第11页
第11页 / 共12页
androidalarmWord格式文档下载.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

androidalarmWord格式文档下载.docx

《androidalarmWord格式文档下载.docx》由会员分享,可在线阅读,更多相关《androidalarmWord格式文档下载.docx(12页珍藏版)》请在冰点文库上搜索。

androidalarmWord格式文档下载.docx

对于上层应用来说,我们并不需要关心是timer还是RTC为我们提供服务,因为OPhone系统的Framework层把底层细节做了封装并统一提供API。

这个API他的名字就叫AlarmManager。

在OPhone系统中有意思的是对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在OPhone系统中,linux实现的设备名为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并发出广播。

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

当然,在JAVA层的AlarmManagerService与LinuxAlarm驱动程序接口之间还有一层封装,那就是JNI。

 

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

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

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

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

∙ 

3个API调用接口:

void 

cancel(PendingIntentoperation) 

//取消已经注册的与参数匹配的闹铃 

void 

set(inttype,longtriggerAtTime,PendingIntentoperation) 

//注册一个新的闹铃 

setRepeating(inttype,longtriggerAtTime,longinterval,PendingIntentoperation) 

//注册一个重复类型的闹铃 

setTimeZone(StringtimeZone) 

//设置时区 

∙5种闹铃类型:

publicstaticfinalintELAPSED_REALTIME 

//当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。

直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间,可以通过调用SystemClock.elapsedRealtime()获得。

系统值是3 

(0x00000003)。

publicstaticfinalintELAPSED_REALTIME_WAKEUP 

//能唤醒系统,用法同ELAPSED_REALTIME,系统值是2(0x00000002)。

publicstaticfinalintRTC 

直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用System.currentTimeMillis()获得。

系统值是1(0x00000001)。

publicstaticfinalintRTC_WAKEUP 

//能唤醒系统,用法同RTC类型,系统值为0(0x00000000)。

PublicstaticfinalintPOWER_OFF_WAKEUP 

//能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。

使用方法同RTC类型,系统值为4(0x00000004)。

开发者可以通过OPhoneSDK来获取更多AlarmManager的相关细节,他所在的包是:

Android.app.AlarmManager

随着OPhone系统版本的不断的升级,这些接口和闹铃类型也许会有些调整,但其基本使用方法将不会改变

二、闹钟设置与提醒

我们首先通过一个直观的UI来感受一下OPhone系统内嵌的闹钟程序是如何响应用户设置和自动提醒的的:

(如下4个图所示)

(图一)

(图二)

(图三)

(图四)

上面4图直观的告诉了开发者如何使用OPhone内嵌的闹钟应用程序,但开发者可能更关心的是通过代码如何实现这些功能。

比如说怎么设置一个闹铃,该设置哪种类型的闹铃,以及如何获得闹铃时间已到并提醒用户。

依据这几个问题,我们在下面的章节中逐步来介绍。

2.1设置闹铃

在第一小节中,我们已经提到过OPhone系统AlarmManagerService提供了两个设置闹铃的API,他们分别是:

在OPhone1.5版本中又增加了一个API。

下面的程序演示了如何设置一个闹铃。

/当设置的闹铃触发时,Ophone系统会广播一个Intent,当然我们需要在创建一个新的闹铃 

//时注册一个闹铃事件接收对象AlarmReceiver,该接收对象也可以通过在//AndroidManifest.xml中发布,也可以在代码中动态注册。

importandroid.app.AlarmManager;

importandroid.app.PendingIntent;

importandroid.content.Intent;

importandroid.os.SystemClock;

importandroid.os.Bundle;

importjava.util.Calendar;

//创建一个PendingIntent 

Intentintent=newIntent(ALARM_ALERT_ACTION);

intent.putExtra(ID,id);

intent.putExtra(TIME,atTimeInMillis);

PendingIntentsender=PendingIntent.getBroadcast( 

context,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);

//获得AlarmMnager并注册一个新闹铃, 

//一次性闹铃的设置 

AlarmManageram=(AlarmManager)getSystemService(ALARM_SERVICE);

am.set(AlarmManager.POWER_OFF_WAKEUP,atTimeInMillis,sender);

//重复性闹铃的设置 

//Wewantthealarmtogooff30secondsfromnow. 

longfirstTime=SystemClock.elapsedRealtime();

firstTime+=15*1000;

//Schedulethealarm!

am.setRepeating(AlarmManager.POWER_OFF_WAKEUP, 

firstTime,15*1000,sender);

//在AndroidManifest.xml中注册 

<

receiverandroid:

name="

AlarmReceiver"

>

<

intent-filter>

actionandroid:

com.android.alarmclock.ALARM_ALERT"

/>

/intent-filter>

/receiver>

//在应用程序执行过程中注册 

AlarmReceivermAlarmReceiver;

IntentFilterfilter=newIntentFilter();

filter.addAction(“com.android.alarmclock.ALARM_ALERT”);

context.registerReceiver(mAlarmReceiver,filter);

publicclassAlarmReceiverextendsBroadcastReceiver{ 

@Override 

publicvoidonReceive(Contextcontext,Intentintent){ 

2.2闹铃提醒

在OPhone系统中,当应用程序所设置的闹铃时间到了后,OPhone系统中的AlarmManagerService就会从系统底层获取一个闹铃事件并从自己维护的队列中取出其匹配的闹铃,然后通过其应用注册的PendingIntent把该闹铃事件发送回给应用。

PendingIntent.send();

当我们的应用收到该Intent后就会启动相应的Activity来提醒用户闹铃时间到。

程序代码如下:

packagecom.android.alarmclock;

importandroid.content.Context;

importandroid.content.BroadcastReceiver;

importandroid.os.Handler;

importandroid.os.PowerManager;

longnow=System.currentTimeMillis();

intid=intent.getIntExtra(Alarms.ID,0);

longsetFor=intent.getLongExtra(Alarms.TIME,0);

IntentfireAlarm=newIntent(context,AlarmAlert.class);

fireAlarm.putExtra(Alarms.ID,id);

fireAlarm.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

//启动一个新的UI对象来提醒 

context.startActivity(fireAlarm);

三、PendingIntent

在前面的章节中,我们在注册闹铃﹑发送闹铃事件的时候,有过一个重要的参数PendingIntent。

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

开发者可以通过调用getActivity(Context,int,Intent,int),getBroadcast(Context,int,Intent,int),getService(Context,int,Intent,int)函数来得到一个PendingIntent实例。

publicstaticPendingIntentgetBroadcast(Contextcontext,intrequestCode,Intentintent,intflags) 

通过该函数获得的PendingIntent将会扮演一个广播的功能,就像调用Context.sendBroadcast()函数一样。

当系统通过它要发送一个intent时要采用广播的形式,并且在该intent中会包含相应的intent接收对象,当然这个对象我们可以在创建PendingIntent的时候指定,也可以通过ACTION和CATEGORY等描述让OPhone系统自动找到该行为处理对象。

实例代码如下:

Intentintent=newIntent(AlarmController.this,OneShotAlarm.class);

PendingIntentsender=PendingIntent.getBroadcast(AlarmController.this, 

0,intent,0);

PublicstaticPendingIntentgetActivity(Context,int,Intent,int) 

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

我们在intent中必须使用Intent.FLAG_ACTIVITY_NEW_TASK.

//ThePendingIntenttolaunchouractivityiftheuserselectsthisnotification 

PendingIntentcontentIntent=PendingIntent.getActivity(this,0, 

newIntent(this,AlarmService.class),0);

publicstaticPendingIntentgetService(Contextcontext,intrequestCode,Intentintent,intflags) 

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

//CreateanIntentSenderthatwilllaunchourservice,tobescheduled 

//withthealarmmanager. 

mAlarmSender=PendingIntent.getService(AlarmService.this, 

0,newIntent(AlarmService.this,AlarmService_Service.class),0);

四、PendingInent与service

在OPhone系统编程中,一个完整OPhone应用程序可以有4个需要创建的模块,他们分别是:

Activity,BroadcastintentReceiver,Service,ContentProvider。

Service作为一个OPhone应用程序组成部分,通常运行在系统后台,他与用户之间没有交互。

像其他应用程序对象一样运行在所属进程的主线程中。

那么这就意味着它有可能进入长时间的运行等待而导致应用得不到用户的相应。

所以在开发者设计程序的时候就要考虑,如果一个Service要做一些长时间的数据处理时(比如播放MP3,或者是网络下载),就需要把该工作切换到自己的线程空间来执行。

importandroid.app.Notification;

importandroid.app.NotificationManager;

importandroid.app.Service;

importandroid.os.Binder;

importandroid.os.IBinder;

importandroid.os.Parcel;

importandroid.os.RemoteException;

importandroid.widget.Toast;

//定义一个Service对象 

publicclassAlarmService_ServiceextendsService{ 

NotificationManagermNM;

publicvoidonCreate(){ 

//创建一个线程来运行Runnable 

Threadthr=newThread(null,mTask,"

AlarmService_Service"

);

thr.start();

publicvoidonDestroy(){ 

RunnablemTask=newRunnable(){ 

publicvoidrun(){ 

//通常我们就可以在这里设计长时间运行的功能, 

longendTime=System.currentTimeMillis()+15*1000;

while(System.currentTimeMillis()<

endTime){ 

synchronized(mBinder){ 

try{ 

mBinder.wait(endTime-System.currentTimeMillis());

}catch(Exceptione){ 

//停止Service 

AlarmService_Service.this.stopSelf();

};

//在编写Service代码时,可以不实现onStart,onStop等函数,但一定要实现onBind函数 

publicIBinderonBind(Intentintent){ 

returnmBinder;

/* 

通过该对象可以与客户端通信 

*/ 

privatefinalIBindermBinder=newBinder(){ 

protectedbooleanonTransact(intcode,Parceldata,Parcelreply, 

intflags)throwsRemoteException{ 

returnsuper.onTransact(code,data,reply,flags);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 动物植物

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2