- 浏览: 455884 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
wwwjiandan:
我现在遇到的问题是将Activity设置为非全屏,且andro ...
Android中软键盘弹出时底部菜单上移问题 -
zjhdreams:
求下载链接
Android 9Patch (NinePatch) -
wtjandjay:
受教了 .......
从程序员到项目经理 -
mr_zhang2011:
将博客搬至CSDN -
fyc0109:
为什么我传过去的值, 有的都不对呢, 顺序也是一样的.就是获得 ...
Android Parcelable序列化自定义类集合在Activity间传递
转载http://blog.csdn.net/liutao5757124/article/details/6064099
本文通过对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调用接口:
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
// 当 系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠时间, 可以通过调用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的使用有了一个基本的认识。
发表评论
-
android Log.isLoggable方法的使用
2014-06-06 15:35 2928android 动态控制logcat日志开关,通过Log. ... -
View not attached to window manager
2013-01-10 11:55 1041View not attached to window man ... -
代码设置android:icon,android:label
2013-01-05 15:26 7921requestWindowFeature( Window.F ... -
Android项目为一个apk设置多个ICON图标和执行入口
2013-01-05 12:13 3834Android开发中,一个工程对应一个AndroidManif ... -
Intent跳转到系统应用中的拨号界面、联系人界面、短信界面及其他
2012-12-04 12:15 01:调用系统发送短信界面 Uri smsT ... -
Android 源码目录结构详解
2012-11-22 17:20 1425这是Android2.1的源代码的 ... -
如何获取android源代码
2012-07-10 17:50 2709如何获取android源代码 研究 ... -
Android uses-permission大全
2012-06-12 17:33 1018android.permission.ACCESS_CHE ... -
Android 应用程序基础(Application Fundamentals)
2012-05-23 17:42 1192Android 应用程序基础(Application Fun ... -
转Android 音乐频谱实现
2012-02-18 23:35 0最近由于需要实现音乐频谱,所以今天就为大家普及一下。 这里实现 ... -
android VideoView本工程mp4文件
2012-01-09 18:42 2657最近在做一个demo,要求播放视频,记录一下。使用的是Vid ... -
关于android播放mp3与歌词同步问题收集
2012-01-09 17:57 1615关于android播放mp3与歌词同步问题收集,有时间再试。 ... -
android使用MediaPlayer播放音乐文件时遇到的问题
2012-01-09 17:38 18275把mp3文件放在Assets文件夹里,然后用MediaPlay ... -
android资源目录---assets与res/raw的不同
2012-01-05 11:49 2298android资源目录---assets与 ... -
Android 的cpu硬盘 内存 网络设置 系统信息 硬件信息
2012-01-04 10:56 1524转载 http://www.cnmsdn.com/html/2 ... -
使用 Android Compatibility Package 来简化开发工作
2012-01-04 10:12 1397转载 http://www.cnmsdn.com/html/2 ... -
Android 9Patch (NinePatch)
2011-12-26 16:06 44501:介绍 NinePatch图片以*.9.png结尾,和普通 ... -
Windows平台下Android源码的下载
2011-12-21 11:06 1187Windows平台下Android源码的下载 ... -
改变MenuItem默认背景
2011-12-07 19:58 1416@Override public boolean onCre ... -
Android横屏竖屏切换
2011-11-10 18:20 107转载 http://blog.csdn.net/leesido ...
相关推荐
实现可定时响起的闹钟----PendingIntent 与 AlarmManager 的运用
NULL 博文链接:https://technicalsearch.iteye.com/blog/2007636
Cordova 本地通知插件 本地通知的基本目的是使应用程序能够在应用程序不在前台运行时通知其用户它有一些东西给他们——例如,一条消息或即将到来的约会。 它们由应用程序调度并在同一设备上交付。...
根据本讲学习内容,学会运用AlarmManager和PendingIntent实现定时提醒功能。 (1) 提交的作业包中含有应用程序运行效果截图。
AlarmManager简介 AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service...PendingIntent sender = PendingIntent.getBroadcast(cont
android-闹钟 使用 AlarmManager、BroadcastReceiver 和 PendingIntent 的重复 Android 警报的简单示例
本篇通过AlarmManager和PendingIntent实现定时提醒功能,界面运用Button、TextView、Switch进行布局 同时这也是中国大学慕课移动终端应用开发的网课作业18,我会持续更新我的作业,如果有需要关注一下吧 说明 具体的...
简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用 PendingIntent。 项目功能简介: AlarmService模拟后台任务,定时发起广播 AlarmReceive启动...
本文实例讲述了Android编程实现PendingIntent控制多个闹钟的方法。分享给大家供大家参考,具体如下: 要用 android.app.PendingIntent.getBroadcast(Context context, int requestCode, Intent intent)来实现控制多...
alarmManager.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent); } }, calendar.get(Calendar.HOUR_OF_DAY), calendar.get(Calendar.MINUTE), false).show(); } }
AlarmManager am= (AlarmManager) getSystemService(ALARM_SERVICE); // create a PendingIntent that will perform a broadcast PendingIntent pi= PendingIntent.getBroadcast(MainActivity.this, 0, new ...
PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); // 开始时间 long firstime = SystemClock.elapsedRealtime(); // 60秒一个周期,不停的发送广播 // am....
PendingIntent pi=PendingIntent.getBroadcast(//创建PendingIntent对象 Sample6_12_Activity.this, 0, intent, 0); AlarmManager alarm=(AlarmManager)Sample6_12_Activity.this.getSystemService(ALARM_...
Android闹钟alarmManager+PendingIntent的使用方法,供大家参考,具体内容如下 这次给大家分享两种闹钟: 第一种是当到达闹钟时间后执行一次相应的操作 alarmManager.set(AlarmManager.RTC_WAKEUP,c....
Android 使用... am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pi);//设置闹钟 Toast.makeText(Sample_12_7.this, "闹钟设置成功", Toast.LENGTH_LONG).show();//提示用户 } }
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 指定...
6.10 实现可定时响起的闹钟——PendingIntent与AlarmManager的运用 6.11 黑名单来电自动静音——PhoneStateListener与AudioManager 6.12 手机翻背面即静音震动——SensorListener及AudioManager整合应用 6.13 指定...