android 闹钟定时系统的闹钟设计与实现

744学习人数6477播放次数
课程目录课程简介
Android项目开发实战——多功能时钟
极客学院金牌布道师
免费排行付费排行
腾讯精品课[转载]Android&实现闹钟功能
一、手机闹钟主要用到了AlarmManager类,AlarmManager类提供了访问系统定时服务的途径,开发人员可以在程序中设置某个应用程序在未来的某个时刻被执行。当AlarmManager定时时间到了之后,当初注册的Intent对象将会被系统广播,进而启动目标程序。
二、在程序运行时当需要使用AlarmManager类时,可以通过Context对象的getSystemService(Context.ALARM_SERVICE)方法来获得AlarmManager对象。
以下程序中使用时间选择对话框设置闹钟的时间。
main.xml布局文件
&?xml version="<span STYLE="CoLor: #.0"
encoding="utf-8"?&&LinearLayout xmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"& &Button android:id="@+id/btn"
android:text="设置闹钟"
android:layout_width="fill_parent"
android:layout_height="wrap_content" /&&/LinearLayout&
&?xml version="<span STYLE="CoLor: #.0"
encoding="utf-8"?&&manifest xmlns:android="/apk/res/android"
package="com.ljq.activity" android:versionCode="<span STYLE="CoLor: #"
android:versionName="<span STYLE="CoLor: #.0"& &application android:icon="@drawable/icon"
android:label="@string/app_name"& &activity android:name=".MainActivity"
android:label="@string/app_name"& &intent-filter& &action android:name="android.intent.action.MAIN" /& &category
android:name="android.intent.category.LAUNCHER"
/& &/intent-filter& &/activity& &activity android:name=".AlarmActivity" /& &!-- android:process=":remote":
新开一个进程 --& &receiver android:name=".AlarmReceiver" android:process=":remote"/& &/application& &uses-sdk
android:minSdkVersion="<span STYLE="CoLor: #"
/&&/manifest&
AlarmReceiver类
package com.ljq.
android.content.BroadcastR
import android.content.Cimport android.content.I
class AlarmReceiver extends BroadcastReceiver{
@Override public
void onReceive(Context context, Intent intent) {
Intent i=new Intent(context, AlarmActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);
AlarmActivity类
package com.ljq.
android.app.Aimport
android.app.AlertDimport android.content.DialogIimport
android.content.DialogInterface.OnClickL
import android.os.B
class AlarmActivity extends Activity {
@Override public
void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//显示对话框 new AlertDialog.Builder(AlarmActivity.this).
setTitle("闹钟").//设置标题 setMessage("时间到了!").//设置内容 setPositiveButton("知道了",
new OnClickListener(){//设置按钮 public void onClick(DialogInterface dialog,
int which) {
AlarmActivity.this.finish();//关闭Activity }
}).create().show();
MainActivity类
package com.ljq.
java.util.C
android.app.Aimport
android.app.AlarmMimport android.app.Dimport android.app.PendingIimport
android.app.TimePickerDimport
android.content.Cimport android.content.Iimport android.os.Bimport android.view.Vimport android.widget.Bimport android.widget.TimePimport
android.widget.T
class MainActivity extends Activity{ private Button
btn=null; private AlarmManager alarmManager=null;
Calendar cal=Calendar.getInstance();
final int DIALOG_TIME = <span STYLE="CoLor: #;
//设置对话框id
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
alarmManager=(AlarmManager)getSystemService(Context.ALARM_SERVICE);
btn=(Button)findViewById(R.id.btn);
btn.setOnClickListener(new View.OnClickListener(){ public void onClick(View view) {
showDialog(DIALOG_TIME);//显示时间选择对话框 }
@Override protected Dialog onCreateDialog(int id)
Dialog dialog=null; switch (id)
DIALOG_TIME:
dialog=new TimePickerDialog( this, new TimePickerDialog.OnTimeSetListener(){
public void onTimeSet(TimePicker timePicker,
int hourOfDay,int minute)
Calendar c=Calendar.getInstance();//获取日期对象
c.setTimeInMillis(System.currentTimeMillis());
//设置Calendar对象 c.set(Calendar.HOUR, hourOfDay);
//设置闹钟小时数 c.set(Calendar.MINUTE, minute);
//设置闹钟的分钟数 c.set(Calendar.SECOND, <span STYLE="CoLor: #);
//设置闹钟的秒数 c.set(Calendar.MILLISECOND, <span STYLE="CoLor: #);
//设置闹钟的毫秒数 Intent
intent = new Intent(MainActivity.this,
AlarmReceiver.class);
//创建Intent对象 PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this,
<span STYLE="CoLor: #,
intent, <span STYLE="CoLor: #); //创建PendingIntent //alarmManager.set(AlarmManager.RTC_WAKEUP,
c.getTimeInMillis(), pi); //设置闹钟 alarmManager.set(AlarmManager.RTC_WAKEUP,
System.currentTimeMillis(), pi); //设置闹钟,当前时间就唤醒 Toast.makeText(MainActivity.this,
"闹钟设置成功",
Toast.LENGTH_LONG).show();//提示用户 }
cal.get(Calendar.HOUR_OF_DAY),
cal.get(Calendar.MINUTE), false);
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。&&Android闹钟程序转自csdn:2个牛币请下载代码后再发表评论//DeskClockApp-4-10/DeskClockApp-4-10/.classpath/DeskClockApp-4-10/.project/DeskClockApp-4-10/AndroidManifest.xml/DeskClockApp-4-10/bin/DeskClockApp-4-10/bin/classes/DeskClockApp-4-10/bin/classes/com/DeskClockApp-4-10/bin/classes/com/cn/DeskClockApp-4-10/bin/classes/com/cn/daming/DeskClockApp-4-10/bin/classes/com/cn/daming/deskclock/DeskClockApp-4-10/bin/classes/com/cn/daming/deskclock/Alarm$1.class/DeskClockApp-4-10/bin/classes/com/cn/daming/deskclock/Alarm$Columns.class/DeskClockApp-4-10/bin/classes/com/cn/daming/deskclock/Alarm$DaysOfWeek.class/DeskClockApp-4-10/bin/classes/com/cn/daming/deskclock/Alarm.class/DeskClockApp-4-10/bin/classes/com/cn/daming/deskclock/AlarmAlert$1.class/DeskClockApp-4-10/bin/classes/com/cn/daming/deskclock/AlarmAlert$2.class/DeskClockApp-4-10/bin/classes/com/cn/daming/deskclock/AlarmAlert.class精精精精原原原原原原最热搜索分享话题编程语言基础Web开发数据库开发客户端开发脚本工具游戏开发服务器软硬件开源组件类库相关分享精精精精精原最近下载暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级最近浏览暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级暂无贡献等级扫描二维码关注最代码为好友"/>扫描二维码关注最代码为好友Android系统原生应用解析之桌面闹钟及相关原理应用之时钟任务的应用(一)
Android系统原生应用解析之桌面闹钟及相关原理应用之时钟任务的应用(一)
前段时间我一个朋友在面试回来问我:那个公司要5天之内完成一个项目,功能包括每天早上6点开始执行定时任务,大批量图片上传,大批量数据库同步。我心想,后两个功能还好说,可就是每天早上6点开始执行的这种定时任务如何搞定?
有了问题,自然要琢磨怎么解决,如果接触的知识面不够,或者没有系统的学习Android API,例如不知道AlarmManager,自然是不知道如何启动定时任务的,当时我也不知道这个的存在,突然心头一闪,那手机上的闹钟可不就是定时任务吗?
多亏了这心头一闪,知道从系统闹钟看看一个闹钟这种标准的定时任务是如何完成的,正好手中刚刚下载完完整的安卓源码,也编译通过了,在源码的目录/packages/中找到了DeskClock文件夹,一看便知是闹钟了。
为了不破坏原生系统的完整性,我将这个工程拷了出来,导入了Studio进行分析,看看如何启动一个定时任务(我自己心里是觉得应该不会有一个服务在后台一直跑着用来监控时间),导入Studio之后进行简单的环境配置编译,跑了起来:
不得不说原生应用还是很漂亮的,为了达到我们的研究目的,我们只选择一个闹钟是如何被创建以及是如何被响应的。
首先我们需要找到一个闹钟任务是如何被创建及打开的,我没有直接去找闹钟是如何创建的,我去找了闹钟是如何被打开的,因为在item上有个开关,我找到了那个开关:
这个开关位于com.android.deskclock.AlarmClockFragment内,AlarmClockFragment内含有一个Adapter内部类,在Adapter的getView方法中找到了这个小开关的触发事件:
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
v = newView(mContext, getCursor(), parent);
v = convertV
bindView(v, mContext, getCursor());
public void bindView(final View view, Context context, final Cursor cursor) {
final Alarm alarm = new Alarm(cursor);
Object tag = view.getTag();
final CompoundButton.OnCheckedChangeListener onOffListener = new CompoundButton.OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton compoundButton, boolean checked) {
if (checked != alarm.enabled) {
setDigitalTimeAlpha(itemHolder, checked);
alarm.enabled =
asyncUpdateAlarm(alarm, alarm.enabled);
itemHolder.onoff.setOnCheckedChangeListener(onOffListener);
}onOffListener引用的对象便是闹钟开关的实现逻辑了,它调用了asyncUpdateAlarm方法:
private void asyncUpdateAlarm(final Alarm alarm, final boolean popToast) {
final Context context = AlarmClockFragment.this.getActivity().getApplicationContext();
final AsyncTask&Void, Void, AlarmInstance& updateTask = new AsyncTask&Void, Void, AlarmInstance&() {
protected AlarmInstance doInBackground(Void... parameters) {
ContentResolver cr = context.getContentResolver();
// Dismiss all old instances
AlarmStateManager.deleteAllInstances(context, alarm.id);
// Update alarm
Alarm.updateAlarm(cr, alarm);
if (alarm.enabled) {
return setupAlarmInstance(context, alarm);
protected void onPostExecute(AlarmInstance instance) {
if (popToast && instance != null) {
AlarmUtils.popAlarmSetToast(context, instance.getAlarmTime().getTimeInMillis());
updateTask.execute();
}它内部执行了一个异步任务,任务的核心调用的是setupAlarmInstance:
private static AlarmInstance setupAlarmInstance(Context context, Alarm alarm) {
ContentResolver cr = context.getContentResolver();
AlarmInstance newInstance = alarm.createInstanceAfter(Calendar.getInstance());
newInstance = AlarmInstance.addInstance(cr, newInstance);
// Register instance to state manager
AlarmStateManager.registerInstance(context, newInstance, true);
return newI
}这里的意思是,将闹钟数据添加到ContentProvider中,以便将数据共享给其它应用。接下来调用了AlarmStateManager.registerInstance:
public static void registerInstance(Context context, AlarmInstance instance,
boolean updateNextAlarm) {
// The caller prefers to handle updateNextAlarm for optimization
if (updateNextAlarm) {
updateNextAlarm(context);
}这段代码中本来有很长的一段代码,用来判断闹钟的各个时间段的执行情况,为了避免干扰我们的主流程,对代码进行了删减处理,我们从上一段代码可知,这里的updateNextAlarm&#20540;为true,进入到updateNextAlarm:
public static void updateNextAlarm(Context context) {
AlarmNotifications.registerNextAlarmWithAlarmManager(context, nextAlarm);
public static void registerNextAlarmWithAlarmManager(Context context, AlarmInstance instance)
// Sets a surrogate alarm with alarm manager that provides the AlarmClockInfo for the
// alarm that is going to fire next. The operation is constructed such that it is ignored
// by AlarmStateManager.
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
int flags = instance == null ? PendingIntent.FLAG_NO_CREATE : 0;
PendingIntent operation = PendingIntent.getBroadcast(context, 0 /* requestCode */,
AlarmStateManager.createIndicatorIntent(context), flags);
if (instance != null) {
long alarmTime = instance.getAlarmTime().getTimeInMillis();
// Create an intent that can be used to show or edit details of the next alarm.
PendingIntent viewIntent = PendingIntent.getActivity(context, instance.hashCode(),
createViewAlarmIntent(context, instance), PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager.AlarmClockInfo info =
new AlarmManager.AlarmClockInfo(alarmTime, viewIntent);
alarmManager.setAlarmClock(info, operation);
} else if (operation != null) {
alarmManager.cancel(operation);
}updateNextAlarm方法中通过调用AlarmNotifications类中的registerNextAlarmWithAlarmManager方法将下一次的闹铃注册到AlarmManager,歪果仁的命名清晰易懂啊!registerNextAlarmWithAlarmManager的方法内部则是我们真正需要看到的,首先是获取到了系统中的AlarmManager对象,接着创建了一个PendingIntent对象operation,这个对象用来执行当闹钟时间到的时候,需要调用的广播类,我们看看AlarmStateManager.createIndicatorIntent(context)方法内部是如何实现的:
* Creates an intent that can be used to set an AlarmManager alarm to set the next alarm
* indicators.
public static Intent createIndicatorIntent(Context context) {
return new Intent(context, AlarmStateManager.class).setAction(INDICATOR_ACTION);
public final class AlarmStateManager extends BroadcastReceiver {
}内部则是简单的new了一个Intent,这个显式的意图指定的是AlarmStateManager,而AlarmStateManager则继承的是BroadcastReceiver,这时,我们很明白,当时钟任务触发的时候会调用我们这个AlarmStateManager的广播,其实AlarmStateManager这个类的内部是有很多代码了,这里被我删减了,以便看代码清晰。
回到上一段方法中继续往下走,又看到在创建PendingIntent的对象viewIntent,这个对象则是用来当时钟任务启动时显示的界面,我们在使用闹钟的时候会弹出一个界面让我们关掉,那与我们交互的Activity就是这里被设定的,createViewAlarmIntent方法内部创建的是一个显式的Activity,有兴趣的可以进去看看。
一切设定好之后,再通过AlarmManager的方法setAlarmClock将我们的时钟任务注册到系统,系统会在我们设定的时间到达之后调用相关的Intent对象。
除了可以使用setAlarmClock方法注册一个时钟任务之外,我们还可以通过cancel方法将这个任务取消。
好,这就是闹钟的基本实现原理。接下里详细描述一下AlarmManager的各种时钟任务应用。
我的热门文章
即使是一小步也想与你分享&实现Android闹钟界面
实现Android闹钟界面
开通极客学院VIP会员,免费观看全部会员课程
最低 21.6 元 / 月
VIP会员尊享特权
观看全部会员课程
720P高清视频下载
已有会员账号,请
视频太卡?试试切换线路
本课时针对课程内容进行简要讲解。
android多功能时钟项目应用主框架搭建视频教程,主讲android 框架,android快速开发框架,android项目框架搭建,学会Android项目建立与Android框架搭建
实现显示Android时钟功能视频教程,主讲android时钟项目开发实战中如何实现显示Android时间,在第一个标签中显示时钟,并且在该标签不可见时停止时钟刷新
实现Android闹钟列表视频教程,主讲android 闹钟,android闹钟实现,掌握使用android listview,listview控件显示Android闹钟列表,并添加一个“添加闹钟”按钮
添加安卓闹钟1 显示时间选定组件及闹钟日期视频教程,主讲按下“添加闹钟”后显示时间选定组件,android 时钟控件,并格式化显示Android闹钟日期
添加Android闹钟2 保存和读取闹钟数据视频教程,主讲Android闹钟列表存储,学会保存和读取安卓闹钟数据
添加安卓闹钟3 判断闹钟是否被触发视频教程,主要实现判断Android闹钟是否被触发,并执行简单的提示输出
添加Android闹钟4 判断闹钟是否被触发视频教程,判断实现安卓闹钟是否被触发,并能执行简单的提示输出
添加Android闹钟5 闹钟触发后清除视频教程,在Android多功能闹钟项目开发实战中,实现安卓闹钟触发后清除闹钟
实现Android闹钟界面视频教程,主讲android闹钟界面实现,了解安卓界面,安卓界面设计,android界面,android界面开发,实现在新的Android
Activity中显示闹钟提示,并播放音乐
实现Android计时器功能1 创建计时器UI界面视频教程,主讲android 计时器,android计时器界面实现,学习安卓界面,安卓界面设计,android ui界面设计,实现创建安卓计时器UI界面
实现Android计时器功能2 计时器控件交互视频教程,学习android计时器控件交互,涉及知识点android计时器控件,android 控件,android控件,android时间控件
实现Android计时器功能3 计时器功能逻辑实现视频教程,主讲安卓计时器功能的逻辑实现
实现Android计时器功能4 计时器功能逻辑实现视频教程,主要实现安卓计时器功能的逻辑实现,涉及Android逻辑运算,android 逻辑等知识点
实现Android秒表功能1 创建和配置秒表界面UI视频教程,主讲android 秒表,秒表 android,android 秒表计时器的界面UI实现,涉及知识点android ui界面设计,android 界面设计,安卓界面设计
实现Android秒表功能2 添加秒表功能交互视频教程,主要实现添加安卓秒表功能交互,涉及知识点android秒表交互,android 交互设计,安卓交互设计
实现Android秒表功能3 秒表功能逻辑实现视频教程,主要实现android多功能时钟项目开发实战中的秒表逻辑功能
实现Android秒表功能4 秒表功能逻辑实现视频教程,学会安卓秒表逻辑功能实现,涉及知识点android秒表逻辑,android 逻辑
只有成为VIP会员才能提问&回复,快吧!如果你还没有账号你可以一个账号。
添加新技术问题
课程 [实现Android闹钟界面]
中已存在问题
添加新技术问题
问题描述越详细,被解答的速度越快
有新回答时请邮件提醒我
着急,拜托快点
不急,慢慢解决
关联课程 [实现Android闹钟界面]
服务热线:400-678-8266

我要回帖

更多关于 android 闹钟定时 的文章

 

随机推荐