Android广播事件处理闹钟实例
Android中Alarm的机制
![Android中Alarm的机制](https://img.taocdn.com/s3/m/22e71ff4e009581b6bd9ebba.png)
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安卓项目编程实例
![Android安卓项目编程实例](https://img.taocdn.com/s3/m/aa738f513b3567ec102d8a43.png)
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手机时钟测试用例
![安卓6.0手机时钟测试用例](https://img.taocdn.com/s3/m/e31134979b89680203d825fd.png)
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音频焦点管理实例详解](https://img.taocdn.com/s3/m/ab487a7e1fb91a37f111f18583d049649b660e4d.png)
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。
手机闹钟的设计与实现教案
![手机闹钟的设计与实现教案](https://img.taocdn.com/s3/m/95743ed1336c1eb91a375d9e.png)
教学设计方案
1、采用四、项目实施阶段小组讨方案设计完毕后,下发本节课手机闹钟项目的实施单,学生们根论法,按据自己小组的设计方案,完成项目代码的编写工作。
照任务代码编写完成后,同学们提交自己的作品和实施单。
单中的要求,完成手机终评价阶段最五、闹钟项1、教师选取1~2个具有代表性的学生作品,有学生进行演示,详方的目
图如果我们要用1、本节课我们用了一个普通的按钮作为闹钟启动按钮,
标作为启动按钮,该用什么控件实现,如何实现?,程序执行完毕后,显时间为“07:02”2、在开发过程中,设置TimePicker,显示效果不友好,如何解决该问题?示时间为“7:2”
:参考文献与资料(学生用)页、211页杨丰盛主编《Android应用开发揭秘》65 教学后记(内容、方法、学情、资源等):本节课内容饱满、丰富,只是在评价阶段,由于学生讲解详细时间稍内容:紧,其他教学内容完成很好,完成教学任务,满足教学目标要求。
本节课采用“教、学、做”一体化教学模式,采用项目教学法进行实方法:施,在授课过程中,灵活运用案例分析法、实验演示法、分组讨论法、激励教学法、引导启发法的教学方法。
在教学过程中,在方案设计阶段,有一个小组同学稍有问题,经过指学情:导,顺利完成。
整体课堂效果较好,学生学习主动,积极与老师互动,很好的完成教学任务。
android alarmmanager 用法
![android alarmmanager 用法](https://img.taocdn.com/s3/m/15076885d4bbfd0a79563c1ec5da50e2534dd159.png)
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 进行系统级闹钟管理](https://img.taocdn.com/s3/m/0ef3b0e30129bd64783e0912a216147917117e33.png)
利用 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小闹钟程序](https://img.taocdn.com/s3/m/1fa6ba12b7360b4c2e3f6465.png)
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>。
基于Android平台的自动闹钟软件的开发
![基于Android平台的自动闹钟软件的开发](https://img.taocdn.com/s3/m/d334e49d03d8ce2f01662359.png)
HandleSetAlarm,java
设置alarm到activity
NumberHelper.java
数字帮组
RepeatPreference.java
重复
SetAlarm.java
设置闹铃
SettingActivity.java
设置闹铃页面
ToastMaster.java
功能设置
Android的资源文件保存在/res的子目录中。其中/res/drawable目录中保存的事图像文件,/res/layout目录中保存的事布局文件,/res/menu目录中保存的是菜单文件,/res/values目录中保存的是用来定义字符串和颜色的文件,/res/xml目录保存的事XML格式的数据文件。
4.运行之后的闹钟界面
点击图4.1图灵闹钟图片出现如图4.2所示界面
图4.1
此闹钟可以通过点击“添加图灵闹钟”按钮添加到五个及五个以上闹钟
图4.2
点击“添加图灵闹钟”按钮,如图4.4所示界面
点击“关于”按钮,出现如图4.9所示界面
图4.3
可以通过set设置图4.5中的三个闹钟及图4.6中的五个闹钟
图4.4
图4.12
图4.13
点击“标签”按钮可以设置标签名称
图4.14
点击“振动”可以设置是否振动
图4.15
图4.16
5.小组分工
***:闹钟软件的设计与开发
***:界面的构思与设计
***:软件的编译、修改与调试
6.小结
在此次课程设计中,不仅了解到了Android的有关知识,而且学习了Java语言以及eclipse等硬件环境,有几点需要特别注意:
自动闹钟课程设计项目报告
事件触发控制仿真简单例子
![事件触发控制仿真简单例子](https://img.taocdn.com/s3/m/600a1ee964ce0508763231126edb6f1aff007180.png)
事件触发控制仿真简单例子
1. 想象一下,你在玩游戏的时候,每一次得分就会触发特殊效果,就像打地鼠游戏,每打中一次地鼠就会有惊喜出现,这就是事件触发控制!
2. 当你早上起床,闹钟响起就是一个事件触发,它控制着你开始新的一天,就好比是开启一天生活之旅的钥匙,这不是很神奇吗?
3. 你按下车钥匙的解锁键,车子发出“嘀嘀”的声音并解锁,这就是一个事件触发控制的简单例子呀,是不是很常见?
4. 去看电影的时候,到了开场时间灯光暗下来,这就是事件触发控制,就如同火车按时启动带着我们驶向未知的精彩,多有意思!
5. 你在手机上点击发送消息的按钮,立马就把你的想法传递出去了,这个点击动作就是事件触发控制呀,仿佛是信息的魔法棒!
6. 过生日的时候,吹灭蜡烛这个动作触发了大家一起唱歌的欢乐氛围,这也是事件触发控制呀,像不像打开了欢乐的宝箱?
7. 在智能音箱旁说一句播放音乐,它就开始播放了,这多神奇呀,这就是事件触发控制,不正像你掌握了音乐的开关吗?
8. 当你进入家门,感应灯会自动亮起,这就是事件触发呀,如同黑暗中突然出现的光明使者,真的很方便呢!
我觉得事件触发控制在我们生活中无处不在,给我们带来了很多便利和惊喜,它就像是一个神奇的魔法,让一切变得更加有趣和有序!。
android获取情景模式和铃声实现震动、铃声提醒
![android获取情景模式和铃声实现震动、铃声提醒](https://img.taocdn.com/s3/m/111a1835a4e9856a561252d380eb6294dd882266.png)
android获取情景模式和铃声实现震动、铃声提醒当我们想通过铃声或者震动提醒⽤户的时候(类似于⼿机来电提醒界⾯),我们需要考虑到⼿机本⾝的情景模式。
(⽬前有个OPPO的测试⼿机就发现,即使调为了静⾳模式,我依旧可以将铃声播放出来),为了防⽌“灵异”事件的发⽣,所以在提⽰前将情景模式判断以便还是有必要的,特地将代码纪录。
1、获取⼿机情景模式:AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);int ringerMode = audioManager.getRingerMode();其中 ringerMode有三种情况,分别是:AudioManager.RINGER_MODE_NORMAL(铃⾳模式)、AudioManager.RINGER_MODE_SILENT(静⾳模式)、AudioManager.RINGER_MODE_VIBRATE(震动模式)2、获取系统铃声uri:// 获取系统默认铃声的Uriprivate Uri getSystemDefultRingtoneUri() {return RingtoneManager.getActualDefaultRingtoneUri(this,RingtoneManager.TYPE_RINGTONE);}3、播放/停⽌播放系统铃声/*** 播放系统声⾳* */private void startAlarm() {//有的⼿机会创建失败,从⽽导致mMediaPlayer为空。
mMediaPlayer = MediaPlayer.create(this, getSystemDefultRingtoneUri());if (mMediaPlayer == null) {//有的⼿机铃声会创建失败,如果创建失败,播放我们⾃⼰的铃声SoundPoolUtils.playCallWaitingAudio();//⾃⼰定义的铃⾳播放⼯具类。
Android广播接实现监听电话状态(电话的状态,拦截)
![Android广播接实现监听电话状态(电话的状态,拦截)](https://img.taocdn.com/s3/m/6874d9d78ad63186bceb19e8b8f67c1cfad6ee95.png)
Android⼴播接实现监听电话状态(电话的状态,拦截)⾸先我们来理解下监听器的机制。
Android的事件处理机制有两种:监听和回调。
A基于监听的事件处理主要涉及三类对象:EventSource(事件源),Event(事件),EventListener(事件监听器)监听机制处理事件的流程图如下(委派式:Delegation):1:需要在AndroidManifest.xml清单中添加权限<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/><uses-permission android:name="android.permission.READ_PHONE_STATE" />2:注册⼴播要注意事件的级别(android中的级别-1000~1000)<receiver android:name=".PhoneBroadcastReceiver"><intent-filter android:priority="1000"><action android:name="android.intent.action.NEW_OUTGOING_CALL"/><action android:name="android.intent.action.PHONE_STATE"/></intent-filter></receiver>详细配置请看 AndroidManifest.xml<manifest xmlns:android="/apk/res/android"package="com.zyw.broadcastsendsms"android:versionCode="1"android:versionName="1.0" ><uses-sdkandroid:minSdkVersion="8"android:targetSdkVersion="15" /><applicationandroid:icon="@drawable/ic_launcher"android:label="@string/app_name"android:theme="@style/AppTheme" ><activityandroid:name=".SendSMS"android:label="@string/title_activity_send_sms" ><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /></intent-filter></activity><receiver android:name=".PhoneBroadcastReceiver"><intent-filter android:priority="1000"><action android:name="android.intent.action.NEW_OUTGOING_CALL"/><action android:name="android.intent.action.PHONE_STATE"/></intent-filter></receiver></application><uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/><uses-permission android:name="android.permission.READ_PHONE_STATE" /></manifest>3:编写⼴播的实现类这⾥需要继承BroadcastReceiver 实现onReceive()⽅法程序的源代码如下:package com.zyw.broadcastsendsms;import android.app.Service;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.telephony.TelephonyManager;import android.util.Log;public class PhoneBroadcastReceiver extends BroadcastReceiver {private static final String TAG = "message";private static boolean mIncomingFlag = false;private static String mIncomingNumber = null;@Overridepublic void onReceive(Context context, Intent intent) {// 如果是拨打电话if (intent.getAction().equals(Intent.ACTION_NEW_OUTGOING_CALL)) {mIncomingFlag = false;String phoneNumber = intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);Log.i(TAG, "call OUT:" + phoneNumber);} else {// 如果是来电TelephonyManager tManager = (TelephonyManager) context.getSystemService(Service.TELEPHONY_SERVICE);switch (tManager.getCallState()) {case TelephonyManager.CALL_STATE_RINGING:mIncomingNumber = intent.getStringExtra("incoming_number");Log.i(TAG, "RINGING :" + mIncomingNumber);break;case TelephonyManager.CALL_STATE_OFFHOOK:if (mIncomingFlag) {Log.i(TAG, "incoming ACCEPT :" + mIncomingNumber);}break;case TelephonyManager.CALL_STATE_IDLE:if (mIncomingFlag) {Log.i(TAG, "incoming IDLE");}break;}}}/*@Overridepublic void onReceive(Context context, Intent intent) {String number = getResultData();if("5556".equals(number)){setResultData(null);//挂断}else{number = "12593"+ number; //其他,则加区号setResultData(number);}}*/}以上内容给⼤家介绍了Android⼴播接实现监听电话状态(电话的状态,拦截)的相关知识,希望对⼤家有所帮助!。
androidtimepicker组件的用法
![androidtimepicker组件的用法](https://img.taocdn.com/s3/m/b7f05a0d30126edb6f1aff00bed5b9f3f80f7266.png)
androidtimepicker组件的用法Android的TimePicker组件是用来选择时间的UI组件,它允许用户通过滚动选择小时和分钟。
在本文中,我将介绍TimePicker的用法,并提供一些示例代码来说明其具体实现。
1. 添加TimePicker到布局文件中要在布局文件中使用TimePicker,可以将以下代码添加到XML布局文件中:```xml<TimePicker/>```2. 在Activity中获取TimePicker实例并设置监听器要获取TimePicker实例,可以使用findViewById(方法。
然后,可以通过调用setOnTimeChangedListener(方法来设置时间变化的监听器。
以下是在Activity中设置TimePicker监听器的代码示例:```javapublic void onTimeChanged(TimePicker view, int hourOfDay, int minute)//处理时间变化事件}```在上述代码中,onTimeChanged(方法会在时间发生变化时被调用,你可以在该方法中编写处理变化事件的代码。
3.获取选中的时间值要获取用户选择的时间值,可以通过调用getHour(和getMinute(方法来获取小时和分钟值。
以下是获取选中时间值的示例代码:```java```4.设置初始时间值要设置TimePicker的初始时间值,可以调用setHour(和setMinute(方法,并传入所需的小时和分钟值。
以下是设置初始时间值的示例代码:```java```5.设置时间选择范围你还可以使用setMinHour(、setMaxHour(、setMinMinute(和setMaxMinute(方法来限制用户可以选择的时间范围。
以下是设置时间选择范围的示例代码:```java在上述代码中,用户只能在早上9点到晚上6点之间选择时间。
Android闹钟机制实现定时任务功能
![Android闹钟机制实现定时任务功能](https://img.taocdn.com/s3/m/09c86302f08583d049649b6648d7c1c709a10b43.png)
Android闹钟机制实现定时任务功能Android的闹钟实现机制,需要调⽤AlarmManager.set()将闹铃时间记录到系统中,当闹铃时间到后,系统会给应⽤程序发送⼴播,我们只需要去注册⼴播接收器就可以了。
本⽂分三部分讲解如何实现闹钟:⽬录:1. 设置闹铃时间;2. 接收闹铃事件⼴播;3. 重开机后重新计算并设置闹铃时间;1. 设置闹铃时间(毫秒)private void setAlarmTime(Context context, long triggerAtMillis) {AlarmManager am = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);Intent intent = new Intent("android.alarm.demo.action");PendingIntent sender = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);//闹铃间隔,这⾥设为1分钟闹⼀次,在第2步我们将每隔1分钟收到⼀次⼴播//int interval = 60 * 1000;//am.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis, interval, sender);am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, sender);}第⼆个参数它⼤致分为两种类型⼀种是相对时间⼀种是绝对时间。
所以,根据使⽤的类型不同 triggerAtTime设置也有所不同。
如果使⽤ELAPSED_REALTIME_WAKEUP类型应该调⽤SystemClock.elapsedRealtime()获取相对时间在加上你设定的延迟时间。
Android 用户界面---通知(Notifications)
![Android 用户界面---通知(Notifications)](https://img.taocdn.com/s3/m/c5f079fa700abb68a982fbfc.png)
有几种类型的场景可能会要求你把应用程序中发生的事件通知给用户。
有些事件需要用户响应,而有些则不需要。
例如:1.当像文件保存完成的一个事件发生时,就应该显示一个短消息,提示用户保存成功了。
2.如果应用程序正在后台运行,并且需要用户的关注,那么应用程序就应该创建一个允许用户方便响应的通知。
3.如果应用程序正在执行用户必须等待的工作(如装载文件),那么应用程序就应该显示一个悬停的进度对话框。
每种通知任务都能够使用以下三种不同的技术来实现:1.广播通知,主要针对来自后台的短消息;2.状态栏通知,主要针对来自后台的并要求用户响应的持续性提醒;3.对话框通知,主要针对Activity相关的通知。
广播通知(Toast Notification)广播通知是弹出到窗口表明的一个消息(如图1所示)。
它仅填充了消息要求的空间大小,并且依然保留当前Activity的可先性和交互性。
这种类型的通知自动的渐入渐出,而且不接受交互事件。
因为广播通知是由后台服务创建的,即使应用程序不可见,它也会显示。
图1广播通知最好用短文本消息,如“文件保存成功”。
广播通知不能接收用户交互事件,如果希望能够的到用户的响应,可以考虑私用状态栏通知来替代。
状态栏通知(Status Bar Notification)状态栏通知会把一个图标(带有一个可选的提示文本消息)添加到系统的状态栏(如图2所示),并把一个展开的消息添加到通知窗口中。
当用户选择这个展开的消息时,Andriod 会触发一个由通知定义的Intent对象(通常是要启动一个Activity)。
你也能够在设备上给通知配置一个声音、震动、屏幕闪亮等效果以提醒用户。
图2当用户的应用程序正在一个后台服务中工作,并且需要把一个内部事件通知给用户时,这种类型的通知是非常合适的。
如果你需要把发生的事件通知给用户的同时,Activity不能保留焦点,可以考虑使用对话框通知来代替。
对话框通知(Dialog Notification)对话框通常是显示在当前Activity前面的一个小窗口。
Android开发闹钟(详细开发步骤)
![Android开发闹钟(详细开发步骤)](https://img.taocdn.com/s3/m/16a16d5769eae009581becbb.png)
一、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) {EditTexted=(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>八、AndroidManifest.xml中的代码<?xml version="1.0" encoding="utf-8"?><manifest xmlns: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" /> <categoryandroid:name="UNCHER" /></intent-filter></activity><activity android:name=".AlarmAlert"android:label="@string/app_name"></activity></application></manifest>。
基于Android平台的懒人闹钟设计及实现
![基于Android平台的懒人闹钟设计及实现](https://img.taocdn.com/s3/m/7637da12783e0912a2162a91.png)
基于Android平台的懒人闹钟设计及实现摘要我们每天第一件要做的事就是起床,而对于“懒人”们来讲,都会备一个小闹钟,即便你很讨厌被它吵醒,但又不得不依赖它把你叫醒,其实是很纠结的。
而随着智能手机的发展,懒人闹钟也会被应用于手机中,替代传统的实体闹钟。
本文阐述了一个基于安卓平台的懒人闹钟的手机应用型软件的设计及其实现过程。
该软件以Android系统为运行平台,平台所包含的功能和框架,为移动终端用户设计并实现了一套流畅、稳定的客户端应用软件。
本设计采用软件工程中结构化思想,采用标准的软件设计流程,从可行性研究、需求分析、系统设计以及系统实现等步骤开发了懒人闹钟应用软件。
软件中运用了SQLite存储数据等技术。
将整个应用程序划分为服务器端的搭建、用户主界面的UI设计、各个功能模块界面的UI设计、数据库四个模块。
其中数据库模块具有存储,查询,增加,删除功能。
此款懒人闹钟最大的特色是程序简洁,占用内存小,软件大小仅5M多;功能强,实现了市面上现有手机闹钟的大多数功能,具有很强的实用性。
关键词:懒人闹钟移动终端AndroidAbstractEvery day the first thing we should do is to wake up. And for "lazy people" ,they will prepare a small alarm clock. even if you hate it, but have to rely on it to wake you up. It is very tangled. With the development of smart phones, a lazy person also can be used in the mobile phone alarm clock, replace the traditional entity alarm clock.This article expounds a lazy alarm based on android platform of mobile phone application software design and its implementation process. The software for Android platform, platform contains function and framework. For mobile terminal users was designed and implemented a smooth, stable client software system.This design USES the structured thinking in software engineering, use standard software design process,From the feasibility study, demand analysis, system design and system implementation steps to develop the lazy alarm system. To use SQLite store data and other technical software. The whole application into the server, user home interface UI design, UI design of each functional module interface, and database four modules.Which database module has the storage, query, increase, delete functions.The biggest feature of this lazy alarm clock program is concise, small footprint, software size just over 5 M; Function is strong,,Is achieved on the market most of the existing mobile phone alarm clock function, have very strong practicability.Key Words:Lazy Alarm Clock Mobile Terminals Android目录摘要 (I)Abstract (II)目录 (III)绪论 (1)1.1 Android概述 (4)1.2 Android架构 (4)1.3 Android权限的获取 (5)1.4 Android用户界面构建 (6)1.5 资源的获取和使用 (7)1.6 SQLite数据库技术 (8)1.7 多媒体的支持能力 (8)1.8 本章小结 (9)2 基于Android平台的懒人闹钟软件需求分析 (10)2.1 用户功能流程图 (10)2.2 用户功能需求分析 (10)2.3 软件性能分析 (11)2.4 开发可行性分析 (11)2.5 整体架构分析 (12)2.6 本章小结 (12)3 基于Android平台的懒人闹钟软件设计 (13)4 基于Android平台的懒人闹钟软件实现 (16)4.1 软件功能模块设计图 (16)4.2 首次安装模块 (16)4.3 用户主界面 (17)4.4 设置闹钟时间模块设计 (18)4.5 闹钟铃声和振动模块 (19)4.6 开始闹钟模块 (20)4.7 工程源代码结构图 (21)结论 (22)绪论在软件产业高速发展的今天,软件的设计思想和理念也在不断变化。
Android学习之多媒体开发,包括音频,视频,录音,闹钟,铃声等
![Android学习之多媒体开发,包括音频,视频,录音,闹钟,铃声等](https://img.taocdn.com/s3/m/e86bf1380912a21614792910.png)
主要涉及类:MediaPlayer(1)当一个MediaPlayer对象被创建或者调用reset()方法之后,它处于空闲状态,调用release()方法后处于结束状态1,一个MediaPlayer对象调用了reset()方法后,再调用其它方法可能会触发OnErrorListener.onError()事件,未调用reset()方法则不会触发2,当Mediaplayer对象不再被使用时,最好调用release()方法对其进行释放,使其处于结束状态,此时它不能被使用3,Mediaplayer对象被创建时(调用构造方法)处于空闲状态,若使用create()方法创建后则处于准备状态。
(2)一般情况下,一些常用的播放控制操作可能因为音频、视频的格式不被支持或者质量较差以及流超时,也有可能由于开发者的疏忽使得Mediaplayer对象处于无效状态等而导致错误。
此时可通过注册setOnErrorListener方法实现监控。
如果发生了错误,Mediaplayer对象将处于多雾状态,可以使用reset()方法来回复错误。
(3)任何Mediaplayer对象都必须先处于准备状态,然后才开始播放(4)要开始播放Mediaplayer对象都必须成功调用start()方法,可通过isPlaying()方法来检测是否正在播放(5)当Mediaplayer对象在播放时,可以进行暂停和停止操作,pause()方法暂停播放,stop()方法停止播放。
处于暂停暂停时可通过start()方法恢复播放,但是处于停止状态时则必须先调用prepare()方法使其处于准备状态,再调用start()方法。
主要方法:Mediaplayer:构造方法create:创建一个要播放的多媒体getCurrentPosition:得到当前播放位置getDuration:得到文件的时间prepare:准备(同步)prepareAsync:准备(异步)seekTo:指定播放的位置(以毫秒为单位)setAudioStreamType:设置流媒体的类型setDataSource:设置数据来源setDisplay:设置用SurfaceHolder来显示多媒体setOnBufferingUpdateListener:网络流媒体的缓冲监听setOnErrorListener:设置错误信息监听setOnVideoSizeChangedListener:视频尺寸监听setScreenOnWhilePlaying:设置是否使用SurfaceHolder来显示setVolume:设置音量//获取sd卡上的音频文件setDataSource(“/sdcard/test.mp3”);//装载资源中的音乐MediaPlayer.create(Activity01.this,R.raw.test);//目前存在问题,不能循环解析出音频文件原因:.android_secure文件夹受保护,无法获取里面的文件信息相关类:VideoView方法说明:getBufferPercentage:得到缓冲的百分比getCurrentPosition:得到当前播放位置getDuration:得到视频文件的时间resolveAdjustedSize:调整视频显示大小setMediaController:设置播放控制器模式(播放进度条)setOnCompletionListener:当视频文件播放完时触发事件setVideoPath:设置视频源路径setVideoURI:设置视频源地址录音相关类:MediaRecorder方法说明:MediaRecorder:构造方法getMaxAmplitude:得到最大幅度setAudioEncoder:设置音频编码setAudioSource:设置音频源setCamera:设置摄像机setMaxDuration:设置最长录音时间setMaxFileSize:设置文件的最大尺寸setOutputFile:设置输出文件setOutputFormat:设置输出文件格式setPreviewDisplay:设置预览setVideoEncoder:设置视频编码setVideoFrameRate:设置视频帧的频率setVideoSize:设置视频的宽度和高度(分辨率)setVideoSource:设置视频源File类下的方法:public static File createTempFile(String prefix, String suffix, File directory)Creates an empty temporary file in the given directory using the given prefix and suffix as part of the file name.系统会自动在prefix和suffix之间加上一些数字来构建完整的文件名实现录音的一般步骤:1,实例化MediaRecorder mr,调用构造方法2,初始化mr:mr.setAudioSource(MIC)/setVideoSource(CAMERA)3,配置DataSource:设置输出文件格式/路径,编码器等4,准备录制:mr.prepare()5,开始录制:mr.start()6,停止录制:mr.stop()7,释放资源:mr.release()注:2,3不可调换顺序添加许可:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permission android:name="android.permission.RECORD_AUDIO">相机设置相关类:Camera,它是专门用来连接和断开相机服务的类Camera的几个事件:Camera.AutoFocusCallback:自动调焦功能Camera.ErrorCallback:错误信息捕捉Camera.Parameters:相机的属性参数Camera.PictureCallback:拍照、产生图片时触发Camera.PreviewCallback:相机预览设置Camera.ShutterCallback:快门设置Camera.Size:图片的尺寸Camera类没有构造方法,可通过open()方法来打开相机设备Camera类的方法介绍:autoFocus:设置自动对焦getParameters:得到相机参数open:启动相机服务release:释放相机服务setParameters:设置参数setPreviewDisplay:设置预览startPreview:开始预览stopPreview:停止预览takePicture:拍照注:takePicture方法要实现3个回调函数作为它的三个参数:Camera.ShutterCallback(快门),和两个Camera.Picture.Callback(图像数据)。
Anroid实时时钟和闹钟系统--RTC-ALARM
![Anroid实时时钟和闹钟系统--RTC-ALARM](https://img.taocdn.com/s3/m/f76108e59b89680203d825ff.png)
3
第一部分 警报器系统结构和移植内容
各种 Android应用
平台API
JAVA框架
警报器的调用 AlarmManager和 AlarmManagerService AlarmManagerService JNI
本地框架 Android 系统 硬件 和驱动
Alarm和实时时钟设备
4
第一部分 警报器系统结构和移植内容
14
3 上层的情况和注意事项
Alarm 在用户空间中的本地 -JNI 部分的代码在 frameworks/base/services/jni/ 目录,由 com_android_server_AlarmManagerService. cpp 文件实现。它调用了 Alarm 驱动程序,向上层 提供了 JNI 的接口。
Android闹钟内核驱动——Alarm
![Android闹钟内核驱动——Alarm](https://img.taocdn.com/s3/m/708cb6775acfa1c7aa00ccce.png)
Android闹钟内核驱动——Alarm;测试版;*************************************************************** RS BIT P3.4R_W BIT P3.5ENABLE BIT P3.3ALARM BIT P3.2 ;闹钟指示TIME_GO_FLAG BIT 00H ;标志位,1表示定时1秒钟到ALARM_FLAG BIT 01H ;闹铃标志,1设定状态,0设定结束DB0_DB7 DA TA P1;**************************************************************** ;R6,R7:延时程序用于计数;R3,R4,R5终端中使用;R2:KEY_SCAN子程序:键扫描计数;**************************************************************** ORG 0000HSJMP MAINORG 000BHLJMP INTERRUPTORG 0040HMAIN: MOV SP,#5FHLCALL ALARM_INITIAL ;闹钟缓冲区初始化LCALL DISBUF_INITIALMOV TIME_50MS,#20 ;定时计数,一次50ms,20次1秒SETB F0 ;标志位,标志是否进入时间设定状态,;F0=1,进入时间设定状态MOV TMOD,#01H ;定时初始化,定时50msMOV TL0,#0B0HMOV TH0,#3CHSETB EALCALL CLSLCALL LCD_INITIAL ;LCD初始化MOV A,#10000000B ;set the addressCALL Write_instructionMOV DPTR,#SET_TIMECALL PR_STRINGMAIN_LOOP: LCALL DISPLA YMOV C,TIME_GO_FLAGJNC NEXTLCALL TIME_GOLCALL CHECK_ALARMNEXT: LCALL KEY_SCANCJNE A,#08H,DELAY_YES ;无键按下,不需要延时SJMP JMP_DELAYDELAY_YES: LCALL DELAY1JMP_DELAY: MOV TEMP,A;散转RL AADD A,TEMPMOV DPTR,#PMTBJMP @A+DPTRPMTB: LJMP PM0LJMP PM1LJMP PM2LJMP PM3LJMP PM4LJMP PM5LJMP PM6LJMP PM7LJMP MAIN_LOOP;***************************************************************** ;PM0:定时设定开关,k0按下,开始时间设定,再次按下,结束设定;***************************************************************** PM0: MOV C,F0 ;进入设定状态JC SET_OVERCLR ET0CLR TR0SETB F0LCALL CLSMOV A,#10000000B ;set the addressCALL Write_instructionMOV DPTR,#SET_TIMECALL PR_STRINGLJMP MAIN_LOOPSET_OVER: MOV TH0,#3CHMOV TL0,#0B0HSETB ET0SETB TR0 ;结束设定状态,返回CLR F0LCALL CLSMOV A,#10000000B ;set the addressCALL Write_instructionMOV DPTR,#LINE1CALL PR_STRINGLJMP MAIN_LOOP;***************************************************************** ;PM1:k1按下,秒加1;***************************************************************** PM1: MOV C,F0JNC RET_PM1MOV A,SECONDCJNE A,#59,SEC_UPMOV SECOND,#0LJMP MAIN_LOOPSEC_UP: INC SECONDRET_PM1: LJMP MAIN_LOOP;***************************************************************** ;PM2:k2按下,分加1;***************************************************************** PM2: MOV C,ALARM_FLAGJC ALARM_MIN_SET ;闹钟设定有效MOV C,F0JNC RET_PM2MOV A,MINUTE ;时间设定有效CJNE A,#59,MIN_UPMOV MINUTE,#0SJMP RET_PM2ALARM_MIN_SET: MOV A,ALARM_MINCJNE A,#59,ALARM_MIN_UPMOV ALARM_MIN,#0SJMP RET_PM2MIN_UP: INC MINUTESJMP RET_PM2ALARM_MIN_UP: INC ALARM_MINRET_PM2: LJMP MAIN_LOOP;***************************************************************** ;PM3:k3按下,时加1;***************************************************************** PM3: MOV C,ALARM_FLAGJC ALARM_HOU_SETMOV C,F0JNC RET_PM3MOV A,HOURCJNE A,#23,HOU_UPMOV HOUR,#0SJMP RET_PM3ALARM_HOU_SET: MOV A,ALARM_HOUCJNE A,#23,ALARM_HOU_UPMOV ALARM_HOU,#0SJMP RET_PM3HOU_UP: INC HOURSJMP RET_PM3ALARM_HOU_UP: INC ALARM_HOURET_PM3: LJMP MAIN_LOOPPM4: LJMP MAIN_LOOPPM5: LJMP MAIN_LOOPPM6: LJMP MAIN_LOOP;***************************************************************** ;PM7:k7按下,闹铃设定开启;***************************************************************** PM7: MOV C,F0JC RET_ALARMMOV C,ALARM_FLAGJC ALARM_SET_OVERSETB ALARM_FLAGLCALL CLSMOV A,#10000000B ;set the addressCALL Write_instructionMOV DPTR,#ALARM_SETCALL PR_STRINGSJMP RET_ALARMALARM_SET_OVER: CLR ALARM_FLAGLCALL CLSMOV A,#10000000B ;set the addressCALL Write_instructionMOV DPTR,#LINE1CALL PR_STRINGRET_ALARM: LJMP MAIN_LOOP;***************************************************************** ;INTERRUPT:中断处理程序;***************************************************************** INTERRUPT: PUSH ACCPUSH PSWPUSH 00H ;R0入栈保护MOV TL0,#0B0HMOV TH0,#3CHDJNZ TIME_50MS,RET_INTSETB TIME_GO_FLAGMOV TIME_50MS,#20 ;1秒钟RET_INT: POP 00HPOP PSWPOP ACCRETI;***************************************************************** ;CHECK_ALARM子程序:判闹钟时间到;***************************************************************** CHECK_ALARM: MOV A,HOURMOV TEMP,ALARM_HOUCJNE A,TEMP,NO_ALARMMOV A,MINUTEMOV TEMP,ALARM_MINCJNE A,TEMP,NO_ALARMMOV A,ALARM_SECCJNE A,#0,RET_CHECKCLR ALARMSJMP RET_CHECKNO_ALARM: SETB ALARMRET_CHECK: RET;***************************************************************** ;KEY_SCAN子程序:键扫描;***************************************************************** KEY_SCAN:MOV A,P0CJNE A,#0FFH,KEY_CONFIRMSJMP NO_KEY_DOWNKEY_CONFIRM: LCALL DELAYMOV A,P0CJNE A,#0FFH,KEY_DOWNSJMP NO_KEY_DOWNKEY_DOWN: MOV KEY,#0MOV R2,#8KEY_LOOP: RRC AJNC FOUNDINC KEYDJNZ R2,KEY_LOOPFOUND: MOV A,KEYRETNO_KEY_DOWN: MOV A,#08HRET;***************************************************************** ;TIME_GO子程序:时钟增长;***************************************************************** TIME_GO:MOV A,SECONDCJNE A,#59,SEC_ADDMOV SECOND,#0MOV A,MINUTECJNE A,#59,MIN_ADDMOV MINUTE,#0MOV A,HOURCJNE A,#23,HOU_ADDMOV HOUR,#0SJMP RET_GOHOU_ADD: INC HOURSJMP RET_GOMIN_ADD: INC MINUTESJMP RET_GOSEC_ADD: INC SECONDRET_GO: CLR TIME_GO_FLAGRET;***************************************************************** ;BINARY_TO_BCD子程序;入口R3,出口R4;***************************************************************** BINARY_TO_BCD:MOV R4,#0MOV R5,#8BCD_LOOP: CLR CMOV A,R3RLC AMOV R3,AMOV A,R4 ;低位在R4ADDC A,R4DA AMOV R4,ADJNZ R5,BCD_LOOPRET;*****************************************************************;DISBUF_INITIAL子程序;初始化时钟显示缓冲区;*****************************************************************DISBUF_INITIAL:MOV A,#00HMOV R7,#8MOV R0,#HOU_HIGHCLR_BUF: MOV @R0,AINC R0DJNZ R7,CLR_BUFMOV 42H,#0AH ;分秒中间的'-'MOV 45H,#0AH;***************** 时间二进制缓冲区初始化***********************MOV SECOND,#00HMOV MINUTE,#00HMOV HOUR,#00HRET;*****************************************************************;ALARM_INITIAL子程序;初始化闹钟显示缓冲区;*****************************************************************ALARM_INITIAL:MOV 5AH,#0 ;闹钟缓冲时清零MOV 5BH,#0 ;闹钟缓冲分清零MOV 5CH,#0 ;闹钟缓冲秒清零SETB ALARM ;闹钟关闭CLR ALARM_FLAG ;清除闹钟标志,初始不进入闹钟设定状态RET;*****************************************************************;DISPLA Y子程序;时钟显示;***************************************************************** DISPLAY:MOV A,#11000000B ;设置显示初始位置,第二行开始显示CALL Write_instructionMOV C,ALARM_FLAGJC ALARM_DISPMOV R3,SECONDLCALL TO_SEC_BUF ;将时钟秒值转移到秒的显示缓冲MOV R3,MINUTELCALL TO_MIN_BUFMOV R3,HOURLCALL TO_HOU_BUFSJMP DIS_STARTALARM_DISP: MOV R3,ALARM_SECLCALL TO_SEC_BUFMOV R3,ALARM_MINLCALL TO_MIN_BUFMOV R3,ALARM_HOULCALL TO_HOU_BUFDIS_START: MOV R0,#HOU_HIGHDIS_LOOP: MOV A,@R0MOV DPTR,#TABLEMOVC A,@A+DPTRCALL WriteLCDDataINC R0CJNE R0,#48H,DIS_LOOPRET;***************************************************************** ;TO_SEC_BUF子程序;将时钟秒值转移到秒的显示缓冲,入口参数R3;***************************************************************** TO_SEC_BUF: LCALL BINARY_TO_BCDMOV A,R4ANL A,#0FHMOV SEC_LOW,AMOV A,R4ANL A,#0F0HSW AP AMOV SEC_HIGH,ARET;***************************************************************** ;TO_MIN_BUF子程序;将时钟分值转移到分的显示缓冲,入口参数R3;***************************************************************** TO_MIN_BUF: LCALL BINARY_TO_BCDMOV A,R4ANL A,#0FHMOV MIN_LOW,AMOV A,R4ANL A,#0F0HSW AP AMOV MIN_HIGH,ARET;***************************************************************** ;TO_HOU_BUF子程序;将时钟时值转移到时的显示缓冲,入口参数R3;***************************************************************** TO_HOU_BUF: LCALL BINARY_TO_BCDMOV A,R4ANL A,#0FHMOV HOU_LOW,AMOV A,R4ANL A,#0F0HSW AP AMOV HOU_HIGH,ARET;***************************************************************** ;LCD_INITIAL子程序;定LCM使用8bits汇流排、显示两行、使用5×7字型、显示器要显示、光标;要显示但不闪烁;***************************************************************** LCD_INITIAL:MOV A,#00111000BCALL Write_instructionMOV A,#00001100BCALL Write_instructionMOV A,#00000110BCALL Write_instructionRET;***************************************************************** ;CheckBusy;等待LCM有空可以执行下一个命令;***************************************************************** CheckBusy:PUSH ACCCheckBusyLoop:CLR ENABLESETB R_WCLR RSSETB ENABLEMOV A,DB0_DB7CLR ENABLE; JB ACC.7,CheckBusyLoopPOP ACCCALL DELAYRET;***************************************************************** ;Write_instruction子程序;将ACC内的资料输入到LCM的IR寄存器;***************************************************************** Write_instruction:CALL CheckBusyCLR ENABLECLR R_WCLR RSSETB ENABLEMOV DB0_DB7,ACLR ENABLERET;***************************************************************** ;WriteLCDData子程序;将ACC内的资料输入到LCM的DR寄存器;***************************************************************** WriteLCDData:CALL CheckBusyCLR ENABLECLR R_WSETB RSSETB ENABLEMOV DB0_DB7,ACLR ENABLERET;***************************************************************** ;cls子程序;清除LCM的显示字幕;***************************************************************** CLS:MOV A,#01HCALL Write_instructionRET;*****************************************************************;PR_STRING子程序;将一个字幕显示在LCM,字串的其实地址要存入DPTR,字串必须以00H结束;***************************************************************** PR_STRING:PUSH ACCPR_LOOP:CLR AMOVC A,@A+DPTRJZ END_PRCALL WriteLCDDataINC DPTRJMP PR_LOOPEND_PR:POP ACCRET;*****************************************************************;DELAY子程序;延时R6*(500uS);***************************************************************** DELAY:MOV R6,#5D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETDELAY1: MOV R2,#7FHDELAY1_LOOP: LCALL DELAYDJNZ R2,DELAY1_LOOPRET;***************************************************************** LINE1: DB 'BeiJing TIME:',00HSET_TIME: DB 'Setting the time',00HALARM_SET: DB 'Alarm setting:',00H;***************************************************************** TABLE: DB 30H,31H,32H,33H,34HDB 35H,36H,37H,38H,39H,2DH;***************************************************************** TIME_50MS EQU 3FHDISBUF EQU 30HSEC_LOW EQU 47HSEC_HIGH EQU 46HMIN_LOW EQU 44HMIN_HIGH EQU 43HHOU_LOW EQU 41HHOU_HIGH EQU 40HSECOND EQU 4AHMINUTE EQU 4BHHOUR EQU 4CHTEMP EQU 4EHKEY EQU 4FH;STOPSW A TCH_SS EQU 53H;STOPSW A TCH_S EQU 52H;STOPSW A TCH_M EQU 51H;STOPSW A TCH_H EQU 50HALARM_SEC EQU 5CHALARM_MIN EQU 5BHALARM_HOU EQU 5AH;***************************************************************** END。
- 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的使用机制有的称呼为全局定时器,有的称呼为闹钟。