Android广播事件处理闹钟实例
Android中Alarm的机制

Android中Alarm的机制本次给大家分析的是Android中Alarm的机制所用源码为最新的Android4.4.4。
首先简单介绍如何使用Alarm并给出其工作原理,接着分析Alarm和Timer以及Handler在完成定时任务上的差别,最后分析Alarm机制的源码。
什么是AlarmAlarm是android提供的用于完成闹钟式定时任务的类,系统通过AlarmManager来管理所有的Alarm,Alarm支持一次性定时任务和循环定时任务,它的使用方式很简单,这里不多做介绍,只给出一个简单的示例:[java]view plaincopyAlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(getApplicationContext(), TestActivity.class); PendingIntent pendIntent =PendingIntent.getActivity(getApplicationContext(),0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //5秒后发送广播,只发送一次int triggerAtTime = SystemClock.elapsedRealtime() + 5 * 1000;alarmMgr.set(AlarmManager.ELAPSED_REALTIME, triggerAtTime, pendIntent); Alarm和Timer以及Handler在定时任务上的区别相同点:三者都可以完成定时任务,都支持一次性定时和循环定时(注:Handler可以间接支持循环定时任务)不同点:Handler和Timer在定时上是类似的,二者在系统休眠的情况下无法正常工作,定时任务不会按时触发。
Android安卓项目编程实例

26. Android手机通话健康卫士。
要求:手机通话有辐射影响健康是人所共识。要求:软件每月统计通话时间,超过一定通话时间,手机震动(一定震动),提醒用户,过度“电话煲”有害健康。
27. Android手机更换Sim卡后报警系统。
要求:手机更换Sim卡后,软件悄悄地拍照,把手机号码,照片,GPS位置,时间,发送到指定邮箱。(可以起到,手机丢失后的一定补救)。
8. Android Http协议调试工具
要求:Android程序 可以访问任意Http协议文件,打印出Http协议头,网页代码。
9. Android程序PC开机程序设计
要求:使用Android程序 发送UDP数据包 (Magic Packets),PC设置网卡唤醒功能,Android程序发送数据包,打开局域网的PC计算机。
18. 基于Android时空闹钟系统设计
要求:在满足一定时间和空间条件下,触发闹钟服务,提醒用户做某事!!
19. 基于Android 轨迹记录系统
要求:用户拿着Android手机,运行该软件,在户外行走能记录GPS位置,换算成走的距离(减肥用)
20. 基于Android时空 拍照系统
10. Android Wifi网络直连系统。
要求:两台以上的Wifi设备通过点对点(不通过AP,实现两台设备连接)。
11. Android天气预报系统
要求:Android程序 使用ksoap开发包,实现对天气预报Web Service访问,实现天气查询。
12. Android应用系统内嵌广告盈利方法的研究(如:Admob等)
3. Android 蓝牙设备扫描与记录系统。
要求:自动搜索周围蓝牙设备列表,将设备列表,与GPS空间位置记录到数据库。
安卓6.0手机时钟测试用例

Clock(6.0)_ 1.3.40
Clock(6.0)_ 1.3.41
Clock(6.0)_
1.3.42 Clock(6.0)_
快捷图标操作
Clock(6.0)_ 1.1.8
menu选项菜单
Clock(6.0)_
1.1.9
Clock(6.0)_
1.1.10
Clock(6.0)_ 1.1.11
时钟屏保
Clock(6.0)_ 1.1.12
Clock(6.0)_ 天气预报 1.1.13
Clock(6.0)_ 1.1.14 1.2、闹钟列表
1.来闹钟后,持续选择贪睡
1.点击自动停止闹铃 2.再响间隔时间列表选择取消或Back键 3.再响间隔时间列表选择任意时间
1.设置为关闭,闹钟响应界面不做任何操作
1.设置为5分钟,闹钟响应界面不做任何操作
1.设置为10分钟,闹钟响应界面不做任何操作
1.设置为15分钟,闹钟响应界面不做任何操作
1.设置为20分钟,闹钟响应界面不做任何操作
1.设置为25分钟,闹钟响应界面不做任何操作
1.设置为30分钟,闹钟响应界面不做任何操作 1.点击音量按钮,查看界面 2.按钮的作用列表选择取消或Back键后再次进 入 3.按钮的作用列表选择任意选项后再次进入
1.选择无,添加闹钟,等闹钟响应时按侧键查 看
1.选择暂停,添加闹钟,等闹钟响应时按侧键 查看
Clock(6.0)_ 1.2.1
默认闹钟
预置条件
操作步骤
Android音频焦点管理实例详解

Android⾳频焦点管理实例详解⽬录⾳频焦点管理的意义⾳频焦点管理的⾏为准则版本兼容在Android 8.0(API 26) 之前对⾳频焦点具体处理实现8.0 之后实现延迟获取焦点⾃动降低⾳量⾳频焦点请求⽅式响应⾳频焦点更改暂时性失去焦点永久性失去焦点附⾳频基础知识总结⾳频焦点管理的意义两个或两个以上的 Android 应⽤可同时向同⼀输出流播放⾳频。
系统会将所有⾳频流混合在⼀起。
虽然这是⼀项出⾊的技术,但却会给⽤户带来很⼤的困扰。
为了避免所有⾳乐应⽤同时播放,Android 引⼊了“⾳频焦点”的概念。
⼀次只能有⼀个应⽤获得⾳频焦点。
当您的应⽤需要输出⾳频时,它需要请求获得⾳频焦点,获得焦点后,就可以播放声⾳了。
不过,在您获得⾳频焦点后,您可能⽆法将其⼀直持有到播放完成。
其他应⽤可以请求焦点,从⽽占有您持有的⾳频焦点。
如果发⽣这种情况,您的应⽤应暂停播放或降低⾳量,以便于⽤户听到新的⾳频源。
⾳频焦点管理的⾏为准则在即将开始播放之前调⽤ requestAudioFocus(),并验证调⽤是否返回 AUDIOFOCUS_REQUEST_GRANTED。
在其他应⽤获得⾳频焦点时,应该停⽌或者暂停播放,或者降低⾳量。
播放停⽌后应该放弃⾳频焦点版本兼容从Android 8.0(O版本,API 26)开始,⾳频焦点的请求⽅式以及系统管理有了细微的变化,下⾯分两部分来说明。
在Android 8.0(API 26) 之前对⾳频焦点具体处理实现当想录⾳或者播放歌曲的时候,最好(⾮必须)先请求⾳频焦点,这个时候需要调⽤AudioManager.requestAudioFocus()⽅法,函数原型如下AudioManager.requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint)第⼀个参数⽤于监听焦点变化第⼆个参数表明请求的⾳频焦点影响的是那种类型流,例如,如果我们录⾳,我们肯定是要影响Music这⼀类型的⾳频流,因此可以选择AudioManager.STREAM_MUSIC。
手机闹钟的设计与实现教案

教学设计方案
1、采用四、项目实施阶段小组讨方案设计完毕后,下发本节课手机闹钟项目的实施单,学生们根论法,按据自己小组的设计方案,完成项目代码的编写工作。
照任务代码编写完成后,同学们提交自己的作品和实施单。
单中的要求,完成手机终评价阶段最五、闹钟项1、教师选取1~2个具有代表性的学生作品,有学生进行演示,详方的目
图如果我们要用1、本节课我们用了一个普通的按钮作为闹钟启动按钮,
标作为启动按钮,该用什么控件实现,如何实现?,程序执行完毕后,显时间为“07:02”2、在开发过程中,设置TimePicker,显示效果不友好,如何解决该问题?示时间为“7:2”
:参考文献与资料(学生用)页、211页杨丰盛主编《Android应用开发揭秘》65 教学后记(内容、方法、学情、资源等):本节课内容饱满、丰富,只是在评价阶段,由于学生讲解详细时间稍内容:紧,其他教学内容完成很好,完成教学任务,满足教学目标要求。
本节课采用“教、学、做”一体化教学模式,采用项目教学法进行实方法:施,在授课过程中,灵活运用案例分析法、实验演示法、分组讨论法、激励教学法、引导启发法的教学方法。
在教学过程中,在方案设计阶段,有一个小组同学稍有问题,经过指学情:导,顺利完成。
整体课堂效果较好,学生学习主动,积极与老师互动,很好的完成教学任务。
android alarmmanager 用法

android alarmmanager 用法Android中的AlarmManager是一个用于调度延迟执行或重复执行任务的系统级类。
它可以在指定的时间间隔内执行某个任务或者在特定的日期和时间触发某个任务。
本文将详细介绍AlarmManager的用法,包括如何创建、设置和取消闹钟任务。
一、什么是AlarmManager?Android的AlarmManager是一个系统级别的管理器,用于调度延迟执行或重复执行任务。
它是Android系统中的一个重要部分,可以被应用程序用于一些关键任务,如定时更新数据、触发通知、执行后台操作等。
二、AlarmManager的工作原理AlarmManager使用系统的闹钟服务来调度任务。
当一个任务被设定后,AlarmManager将会启动一个定时器,当定时器到达指定时刻后,系统将会触发相应的操作。
这个操作可以是启动一个服务、发送广播或者唤醒设备等。
三、创建一个闹钟任务要创建一个闹钟任务,首先需要获取AlarmManager的实例。
可以通过如下代码来获取:AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);四、设置一个闹钟任务设置一个闹钟任务需要指定触发时间和任务的触发方式。
Android中提供了三种触发方式:1. ELAPSED_REALTIME:相对时间触发,以系统启动开始计时。
可以使用如下代码来设置:alarmManager.set(AlarmManager.ELAPSED_REALTIME, triggerTime, pendingIntent);其中,triggerTime为触发时间,pendingIntent是一个准备要触发的操作的PendingIntent对象。
2. RTC:绝对时间触发,以1970年1月1日开始计时。
可以使用如下代码来设置:alarmManager.set(AlarmManager.RTC, triggerTime, pendingIntent);3. RTC_WAKEUP:在设备处于休眠状态时,使用绝对时间触发。
利用 AlarmManager 进行系统级闹钟管理

利用 AlarmManager 进行系统级闹钟管理AlarmManager 是 Android 系统提供的一个用于定时触发特定操作的类。
通过 AlarmManager,我们可以实现在指定时间点或者间隔时间内执行某些任务,比如提醒用户、执行后台操作等。
本文将介绍如何利用 AlarmManager 进行系统级闹钟管理。
一、介绍 AlarmManagerAlarmManager 是 Android 系统的一个系统级别的服务,用于在特定时间点触发指定操作。
它可以在设备休眠的情况下也能正常工作,并且能够持续触发重复性的操作。
使用 AlarmManager 需要以下步骤:1. 获取 AlarmManager 实例:```javaAlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);```2. 创建 PendingIntent 对象:```javaIntent intent = new Intent(this, AlarmReceiver.class);PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);```3. 设置闹钟:```java// 在指定时间触发闹钟alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTimeMillis, pendingIntent);// 在指定时间间隔触发闹钟alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, firstAlarmTimeMillis, intervalMillis, pendingIntent);```4. 创建广播接收器 AlarmReceiver:```javapublic class AlarmReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 处理闹钟触发后的操作}}```二、设置系统级闹钟1. 单次闹钟```java// 获取当前时间Calendar currentTime = Calendar.getInstance();// 设置闹钟时间为当前时间的一小时后Calendar alarmTime = Calendar.getInstance();alarmTime.setTimeInMillis(currentTime.getTimeInMillis() + TimeUnit.HOURS.toMillis(1));// 设置闹钟alarmManager.set(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), pendingIntent);```2. 重复闹钟```java// 获取当前时间Calendar currentTime = Calendar.getInstance();// 设置闹钟时间为当前时间的第二天早上8点Calendar alarmTime = Calendar.getInstance();alarmTime.set(Calendar.HOUR_OF_DAY, 8);alarmTime.set(Calendar.MINUTE, 0);alarmTime.add(Calendar.DAY_OF_MONTH, 1);// 设置闹钟间隔为一天long intervalMillis = TimeUnit.DAYS.toMillis(1);// 设置闹钟alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime.getTimeInMillis(), intervalMillis, pendingIntent);```三、取消闹钟如果需要取消闹钟,可以使用 AlarmManager 的 cancel() 方法,并传入之前创建的 PendingIntent 对象。
Android小闹钟程序

Android小闹钟程序【安卓进化十三】2011-11-08 18:17:26 我来说两句收藏我要投稿最近写了个闹钟的程序,看到SharedPreferences在一个程序中可以共享数据,SharedPreferences是一个轻量级的键值存储机制,只可以存储基本数据类型。
我就拿来用用,没想到SharedPreferences太好了,真是轻量级的保存数据的好的工具,比sqlite好用多了!以后我又多了一种编程思想了,呵呵,所以现在分享给大家,特别注意这点:这个无法直接在多个程序间共享Preferences数据。
程序关闭再打开时间仍然保留你上次设置的时间。
这就是Preferences的作用!特别声明:想要源码的请在博客的留言版中留下邮箱。
转载请标明出处:/wdaming1986/article/details/6705902大家也可以去csdn下载,下载地址:/source/3536834程序欢迎界面:点击设置闹钟界面:点击闹钟设置中的设置后的界面:闹钟时间到了弹出dialog:设置重复想起闹钟后的界面:点击返回键弹出的提示:下面请看代码:一、MainActivity中的代码:package .daming;import java.util.Calendar;import android.app.Activity;import android.app.AlarmManager;import android.app.AlertDialog;import android.app.PendingIntent; import android.app.TimePickerDialog; import android.content.DialogInterface;import android.content.Intent;import android.content.SharedPreferences; import android.os.Bundle;import android.view.KeyEvent;import youtInflater;import android.view.MotionEvent;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;import android.widget.TimePicker;import android.widget.Toast;public class MainActivity extends Activity { TextView setTime1;TextView setTime2;TextView setTime3;Button mButton1;Button mButton2;Button mButton3;Button mButton4;Button mButton5;Button mButton6;String time1String = null;String time2String = null;String time3String = null;String defalutString = "目前无设置";AlertDialog builder = null;Calendar c=Calendar.getInstance();@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(yout.main);//取得活动的Preferences对象SharedPreferences settings =getPreferences(Activity.MODE_PRIVATE);time1String = settings.getString("TIME1", defalutString); time2String = settings.getString("TIME2", defalutString); time3String = settings.getString("TIME3", defalutString); InitButton1();InitButton2();InitButton3();InitButton4();InitButton5();InitButton6();setTime1.setText(time1String);setTime3.setText(time2String);setTime2.setText(time3String);}public void InitButton1(){setTime1=(TextView) findViewById(R.id.setTime1);mButton1=(Button)findViewById(R.id.mButton1);mButton1.setOnClickListener(new View.OnClickListener(){public void onClick(View v){c.setTimeInMillis(System.currentTimeMillis());int mHour=c.get(Calendar.HOUR_OF_DAY);int mMinute=c.get(Calendar.MINUTE);new TimePickerDialog(MainActivity.this,new TimePickerDialog.OnTimeSetListener(){public void onTimeSet(TimePicker view,int hourOfDay,int minute){c.setTimeInMillis(System.currentTimeMillis());c.set(Calendar.HOUR_OF_DAY,hourOfDay);c.set(Calendar.MINUTE,minute);c.set(Calendar.SECOND,0);c.set(LISECOND,0);Intent intent = new Intent(MainActivity.this, CallAlarm.class);PendingIntent sender=PendingIntent.getBroadcast( MainActivity.this,0, intent, 0);AlarmManager am;am = (AlarmManager)getSystemService(ALARM_SERVICE);am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),sender);String tmpS=format(hourOfDay)+":"+format(minute);setTime1.setText(tmpS);//SharedPreferences保存数据,并提交SharedPreferences time1Share = getPreferences(0); SharedPreferences.Editor editor = time1Share.edit(); editor.putString("TIME1", tmpS);mit();Toast.makeText(MainActivity.this,"设置大明闹钟时间为"+tmpS, Toast.LENGTH_SHORT).show();}},mHour,mMinute,true).show();}});}public void InitButton2(){mButton2=(Button) findViewById(R.id.mButton2);mButton2.setOnClickListener(new View.OnClickListener(){public void onClick(View v){Intent intent = new Intent(MainActivity.this, CallAlarm.class); PendingIntent sender=PendingIntent.getBroadcast(MainActivity.this,0, intent, 0);AlarmManager am;am =(AlarmManager)getSystemService(ALARM_SERVICE);am.cancel(sender);Toast.makeText(MainActivity.this,"大明闹钟时间删除",Toast.LENGTH_SHORT).show();setTime1.setText("目前无设置");SharedPreferences time1Share = getPreferences(0); SharedPreferences.Editor editor = time1Share.edit();editor.putString("TIME1", "目前无设置");mit();}});}public void InitButton3(){setTime3=(TextView) findViewById(R.id.setTime5);mButton3=(Button)findViewById(R.id.mButton5);mButton3.setOnClickListener(new View.OnClickListener(){public void onClick(View v){c.setTimeInMillis(System.currentTimeMillis());int mHour=c.get(Calendar.HOUR_OF_DAY);int mMinute=c.get(Calendar.MINUTE);new TimePickerDialog(MainActivity.this,new TimePickerDialog.OnTimeSetListener(){public void onTimeSet(TimePicker view,int hourOfDay,int minute){c.setTimeInMillis(System.currentTimeMillis());c.set(Calendar.HOUR_OF_DAY,hourOfDay);c.set(Calendar.MINUTE,minute);c.set(Calendar.SECOND,0);c.set(LISECOND,0);Intent intent = new Intent(MainActivity.this, CallAlarm.class); PendingIntent sender=PendingIntent.getBroadcast(MainActivity.this,1, intent, 0);AlarmManager am;am = (AlarmManager)getSystemService(ALARM_SERVICE);am.set(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),sender);String tmpS=format(hourOfDay)+":"+format(minute);setTime3.setText(tmpS);//SharedPreferences保存数据,并提交SharedPreferences time2Share = getPreferences(1); SharedPreferences.Editor editor = time2Share.edit(); editor.putString("TIME2", tmpS);mit();Toast.makeText(MainActivity.this,"设置大明闹钟时间为"+tmpS, Toast.LENGTH_SHORT).show();}},mHour,mMinute,true).show();}});}public void InitButton4(){mButton4=(Button) findViewById(R.id.mButton6);mButton4.setOnClickListener(new View.OnClickListener(){public void onClick(View v){Intent intent = new Intent(MainActivity.this, CallAlarm.class); PendingIntent sender=PendingIntent.getBroadcast(MainActivity.this,0, intent, 0);AlarmManager am;am =(AlarmManager)getSystemService(ALARM_SERVICE);am.cancel(sender);Toast.makeText(MainActivity.this,"大明闹钟时间删除",Toast.LENGTH_SHORT).show();setTime3.setText("目前无设置");//SharedPreferences保存数据,并提交SharedPreferences time2Share = getPreferences(1); SharedPreferences.Editor editor = time2Share.edit();editor.putString("TIME2", "目前无设置");mit();}});}public void InitButton5(){setTime2=(TextView) findViewById(R.id.setTime2);LayoutInflater factory = LayoutInflater.from(this);final View setView = factory.inflate(yout.timeset,null); final TimePicker tPicker=(TimePicker)setView.findViewById(R.id.tPicker);tPicker.setIs24HourView(true);final AlertDialog di=new AlertDialog.Builder(MainActivity.this) .setIcon(R.drawable.clock).setTitle("设置").setView(setView).setPositiveButton("确定",new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int which){EditText ed=(EditText)setView.findViewById(R.id.mEdit);int times=Integer.parseInt(ed.getText().toString())*1000;c.setTimeInMillis(System.currentTimeMillis());c.set(Calendar.HOUR_OF_DAY,tPicker.getCurrentHour());c.set(Calendar.MINUTE,tPicker.getCurrentMinute());c.set(Calendar.SECOND,0);c.set(LISECOND,0);Intent intent = new Intent(MainActivity.this,CallAlarm.class);PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this,1, intent, 0);AlarmManager am;am = (AlarmManager)getSystemService(ALARM_SERVICE); am.setRepeating(AlarmManager.RTC_WAKEUP,c.getTimeInMillis(),times,sender);String tmpS=format(tPicker.getCurrentHour())+":"+ format(tPicker.getCurrentMinute());String subStr = "设置大明闹钟时间为"+tmpS+"开始,重复间隔为"+times/1000+"秒";setTime2.setText("设置大明闹钟时间为"+tmpS+"开始,重复间隔为"+times/1000+"秒");//SharedPreferences保存数据,并提交SharedPreferences time3Share = getPreferences(2); SharedPreferences.Editor editor = time3Share.edit(); editor.putString("TIME3", subStr);mit();Toast.makeText(MainActivity.this,"设置大明闹钟为"+tmpS+ "开始,重复间隔为"+times/1000+"秒",Toast.LENGTH_SHORT).show();}}).setNegativeButton("取消",new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int which){}}).create();mButton5=(Button) findViewById(R.id.mButton3);mButton5.setOnClickListener(new View.OnClickListener(){public void onClick(View v){c.setTimeInMillis(System.currentTimeMillis());tPicker.setCurrentHour(c.get(Calendar.HOUR_OF_DAY));tPicker.setCurrentMinute(c.get(Calendar.MINUTE));di.show();}});}public void InitButton6(){mButton6=(Button) findViewById(R.id.mButton4);mButton6.setOnClickListener(new View.OnClickListener(){public void onClick(View v){Intent intent = new Intent(MainActivity.this, CallAlarm.class);PendingIntent sender = PendingIntent.getBroadcast( MainActivity.this,1, intent, 0);AlarmManager am;am = (AlarmManager)getSystemService(ALARM_SERVICE); am.cancel(sender);Toast.makeText(MainActivity.this,"闹钟时间删除", Toast.LENGTH_SHORT).show();setTime2.setText("目前无设置");//SharedPreferences保存数据,并提交SharedPreferences time3Share = getPreferences(2); SharedPreferences.Editor editor = time3Share.edit(); editor.putString("TIME3", "目前无设置");mit();}});}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) { if(keyCode == KeyEvent.KEYCODE_BACK){builder = new AlertDialog.Builder(MainActivity.this) .setIcon(R.drawable.clock).setTitle("温馨提示:").setMessage("您是否要退出大明闹钟程序!!!").setPositiveButton("确定",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) {MainActivity.this.finish();}}).setNegativeButton("取消",new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) {builder.dismiss();}}).show();}return true;}private String format(int x){String s=""+x;if(s.length()==1) s="0"+s;return s;}}二、CallAlarm中的代码:package .daming;import android.content.Context;import android.content.Intent;import android.content.BroadcastReceiver;import android.os.Bundle;public class CallAlarm extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {Intent i = new Intent(context, AlarmAlert.class); Bundle bundleRet = new Bundle();bundleRet.putString("STR_CALLER", "");i.putExtras(bundleRet);i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivity(i);}}三、AlarmAlert中的代码:package .daming;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.os.Bundle;public class AlarmAlert extends Activity{@Overrideprotected void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);new AlertDialog.Builder(AlarmAlert.this).setIcon(R.drawable.clock).setTitle("大明闹钟响了!!").setMessage("快完成你制定的计划吧!!!").setPositiveButton("关掉它",new DialogInterface.OnClickListener(){public void onClick(DialogInterface dialog, int whichButton) {AlarmAlert.this.finish();}}).show();}}四、main.xml布局文件的代码:<?xml version="1.0" encoding="utf-8"?><AbsoluteLayoutxmlns:android="/apk/res/android" android:id="@+id/layout1"android:layout_width="fill_parent"android:layout_height="fill_parent"android:background="@drawable/other"><DigitalClockandroid:id="@+id/dClock"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="40sp"android:textColor="@drawable/blue"android:layout_x="70px"android:layout_y="32px"></DigitalClock><TextViewandroid:id="@+id/text1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/str_title3"android:textSize="20sp"android:textColor="@drawable/black"android:layout_x="10px"android:layout_y="104px"></TextView><Buttonandroid:id="@+id/mButton1"android:layout_width="wrap_content" android:layout_height="40px" android:text="@string/str_button1" android:textColor="@drawable/black" android:textSize="18sp"android:layout_x="190px"android:layout_y="102px"></Button><TextViewandroid:id="@+id/setTime1"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/str_default" android:textColor="@drawable/red" android:textSize="16sp"android:layout_x="10px"android:layout_y="149px"></TextView><Buttonandroid:id="@+id/mButton2"android:layout_width="wrap_content" android:layout_height="40px" android:text="@string/str_button2" android:textColor="@drawable/black" android:textSize="18sp"android:layout_x="190px"android:layout_y="142px"></Button><TextViewandroid:id="@+id/text5"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/str_title4" android:textSize="20sp"android:textColor="@drawable/black" android:layout_x="10px"android:layout_y="216px"></TextView><Buttonandroid:id="@+id/mButton5"android:layout_width="wrap_content" android:layout_height="40px" android:text="@string/str_button1" android:textColor="@drawable/black" android:textSize="18sp"android:layout_x="190px"android:layout_y="212px"></Button><TextViewandroid:id="@+id/setTime5"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/str_default" android:textColor="@drawable/red" android:textSize="16sp"android:layout_x="10px"android:layout_y="259px"></TextView><Buttonandroid:id="@+id/mButton6"android:layout_width="wrap_content"android:layout_height="40px" android:text="@string/str_button2" android:textColor="@drawable/black" android:textSize="18sp"android:layout_x="190px"android:layout_y="252px"></Button><TextViewandroid:id="@+id/text2"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/str_title2" android:textSize="20sp"android:textColor="@drawable/black" android:layout_x="10px"android:layout_y="326px"></TextView><Buttonandroid:id="@+id/mButton3"android:layout_width="wrap_content" android:layout_height="40px" android:text="@string/str_button1"android:textColor="@drawable/black" android:textSize="18sp"android:layout_x="190px"android:layout_y="322px"></Button><TextViewandroid:id="@+id/setTime2"android:layout_width="170px" android:layout_height="wrap_content" android:text="@string/str_default" android:textColor="@drawable/red" android:textSize="16sp"android:layout_x="10px"android:layout_y="369px"></TextView><Buttonandroid:id="@+id/mButton4"android:layout_width="wrap_content" android:layout_height="40px" android:text="@string/str_button2" android:textColor="@drawable/black" android:textSize="18sp"android:layout_x="190px"android:layout_y="362px"></Button></AbsoluteLayout>五、timeset.xml布局文件中的代码:<?xml version="1.0" encoding="utf-8"?><AbsoluteLayoutandroid:id="@+id/layout2"android:layout_width="fill_parent"android:layout_height="fill_parent"xmlns:android="/apk/res/android" ><TextViewandroid:id="@+id/text1"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/str_text1"android:textColor="@drawable/white"android:textSize="16sp"android:layout_x="10px"android:layout_y="32px"></TextView><TextViewandroid:id="@+id/text2"android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/str_text2" android:textColor="@drawable/white" android:textSize="16sp"android:layout_x="10px"android:layout_y="172px"></TextView><TimePickerandroid:id="@+id/tPicker"android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_x="100px"android:layout_y="12px"></TimePicker><EditTextandroid:id="@+id/mEdit"android:layout_width="52px" android:layout_height="40px" android:text="15"android:textSize="16sp"android:layout_x="120px"android:layout_y="162px"></EditText><TextViewandroid:id="@+id/text3"android:layout_width="wrap_content"android:layout_height="wrap_content"android:text="@string/str_text3"android:textColor="@drawable/white"android:textSize="16sp"android:layout_x="180px"android:layout_y="172px"></TextView></AbsoluteLayout>六、string.xml中的代码:<?xml version="1.0" encoding="utf-8"?><resources><string name="hello">Hello World, EX06_10</string> <string name="app_name">大明原创闹钟</string><string name="str_button1">设置闹钟</string><string name="str_button2">删除闹钟</string><string name="str_title2">重复响起的闹钟</string><string name="str_title3">大明闹钟一</string><string name="str_title4">大明闹钟二</string><string name="str_default">目前无设置</string><string name="str_text1">开始时间</string><string name="str_text2">重复响起的闹钟</string><string name="str_text3">秒</string></resources>七:color.xml中的代码:<?xml version="1.0" encoding="utf-8"?><resources><drawable name="white">#FFFFFFFF</drawable><drawable name="other">#FF00FFF0</drawable><drawable name="black">#000000</drawable><drawable name="blue">#0000FF</drawable><drawable name="red">#FF0000</drawable></resources>八、Android Manifest.xml中的代码<?xml version="1.0" encoding="utf-8"?><manifestxmlns:android="/apk/res/android" package=".daming"android:versionCode="1"android:versionName="1.0"><uses-sdk android:minSdkVersion="8" /><application android:icon="@drawable/icon"android:label="@string/app_name"><!-- 註冊receiver CallAlarm --><receiver android:name=".CallAlarm" android:process=":remote" /> <activity android:name=".MainActivity"android:label="@string/app_name"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity><activity android:name=".AlarmAlert"android:label="@string/app_name"></activity></application></manifest>。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Android广播事件处理闹钟实例对应AlarmManage有一个AlarmManagerServie服务程序,该服务程序才是正真提供闹铃服务的,它主要维护应用程序注册下来的各类闹铃并适时的设置即将触发的闹铃给闹铃设备(在系统中,linux实现的设备名为”/dev/alarm”),并且一直监听闹铃设备,一旦有闹铃触发或者是闹铃事件发生,AlarmManagerServie服务程序就会遍历闹铃列表找到相应的注册闹铃并发出广播。
该服务程序在系统启动时被系统服务程序system_service启动并初始化闹铃设备(/dev/alarm)。
当然,在JAVA层的AlarmManagerService与Linux Alarm驱动程序接口之间还有一层封装,那就是JNI。
AlarmManager将应用与服务分割开来后,使得应用程序开发者不用关心具体的服务,而是直接通过AlarmManager来使用这种服务。
这也许就是客户/服务模式的好处吧。
AlarmManager与 AlarmManagerServie之间是通过Binder来通信的,他们之间是多对一的关系。
在android系统中,AlarmManage提供了3个接口5种类型的闹铃服务。
3个接口:1. // 取消已经注册的与参数匹配的闹铃2. void cancel(PendingIntent operation)1.2. //注册一个新的闹铃3. void set(int type, long triggerAtTime, PendingIntent operation)4. //注册一个重复类型的闹铃5. void setRepeating(int type, long triggerAtTime, long interval, PendingIntent operation)6. //设置时区7. void setTimeZone(String timeZone)5个闹铃类型public static final int ELAPSED_REALTIME1. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。
直到系统下次被唤醒才传递它,该闹铃所用的时间是相对时间,是从系统启动后开始计时的,包括睡眠2. 时间,可以通过调用SystemClock.elapsedRealtime()获得。
系统值是 3(0x00000003)。
3. public static final int ELAPSED_REALTIME_WAKEUP4. //能唤醒系统,用法同ELAPSED_REALTIME,系统值是2 (0x00000002) 。
5. public static final int RTC6.7. //当系统进入睡眠状态时,这种类型的闹铃不会唤醒系统。
直到系统下次被唤醒才传递它,该闹铃所用的时间是绝对时间,所用时间是UTC时间,可以通过调用8. System.currentTimeMillis()获得。
系统值是1 (0x00000001) 。
9. public static final int RTC_WAKEUP10. //能唤醒系统,用法同RTC类型,系统值为 0 (0x00000000) 。
11. Public static final int POWER_OFF_WAKEUP12.13. //能唤醒系统,它是一种关机闹铃,就是说设备在关机状态下也可以唤醒系统,所以我们把它称之为关机闹铃。
使用方法同RTC类型,系统值为14. 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.// The PendingIntent to launch our activity if the user selects this notification1. PendingIntent contentIntent = PendingIntent.getActivity(this , 0 , new Intent( this , AlarmService. class ), 0 );getService——通过该函数获得的PengdingIntent可以直接启动新的Service,就像调用Context.startService()一样。
// Create an IntentSender that will launch our service, to be scheduled// with the alarm manager.1. mAlarmSender = PendingIntent.getService(AlarmService.this , 0 , new Intent(AlarmService. this , AlarmService_Service. class ), 0 );实例:/Chapter08_Broadcast_AlarmManager/src/com/amaker/ch08/app/MainActivity.java代码package com.amaker.ch08.app;import com.amaker.ch08.app.R;import android.app.Activity;import android.app.AlarmManager;import android.app.PendingIntent;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;/**** 测试AlarmManager*/public class MainActivity extends Activity {// 声明Buttonprivate Button setBtn, cancelBtn;// 定义广播Actionprivate static final String BC_ACTION = "com.amaker.ch08.app.action.BC_ACTION";@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 设置当前布局视图setContentView(yout.main);// 实例化ButtonsetBtn = (Button) findViewById(R.id.Button01);cancelBtn = (Button) findViewById(R.id.Button02);// 获得AlarmManager实例final AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);// 实例化IntentIntent intent = new Intent();// 设置Intent action属性intent.setAction(BC_ACTION);intent.putExtra("msg", "你该去开会啦!");// 实例化PendingIntentfinal PendingIntent pi = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0);// 获得系统时间final long time = System.currentTimeMillis();// 设置按钮单击事件setBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// 重复提示,从当前时间开始,间隔5秒am.setRepeating(AlarmManager.RTC_WAKEUP, time,8 * 1000, pi);}});// 设置按钮单击事件cancelBtn.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {am.cancel(pi);}});}}/Chapter08_Broadcast_AlarmManager/src/com/amaker/ch08/app/MyReceiver.java 代码package com.amaker.ch08.app;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.widget.Toast;public class MyReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {// 获得提示信息String msg = intent.getStringExtra("msg");// 显示提示信息Toast.makeText(context, msg, Toast.LENGTH_LONG).show();}}/Chapter08_Broadcast_AlarmManager/res/layout/main.xml代码<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="/apk/res/android" android:orientation="vertical"android:layout_width="fill_parent"android:layout_height="fill_parent"><Buttonandroid:text="设置闹钟"android:id="@+id/Button01"android:layout_width="wrap_content"android:layout_height="wrap_content"></Button><Buttonandroid:text="取消闹钟"android:id="@+id/Button02"android:layout_width="wrap_content"android:layout_height="wrap_content"></Button></LinearLayout>/Chapter08_Broadcast_AlarmManager/AndroidManifest.xml代码<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.amaker.ch08.app"android:versionCode="1"android:versionName="1.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="UNCHER" /></intent-filter></activity><receiver android:name="MyReceiver"><intent-filter><action android:name="com.amaker.ch08.app.action.BC_ACTION"/></intent-filter></receiver></application><uses-sdk android:minSdkVersion="3" /></manifest>================================================================================ AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。