版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
本文格式为Word版,下载可任意编辑——Android原生模块DeskClock分析1
CHINA
DeskClock分析文档
DeskClock分析文档
DeskClock分析
一.DeskClock界面二.Alarms界面三.设置闹钟参数四.设置Alarms属性五.布局文件六.个人总结及BUG
附件:Deskclock类图
2
DeskClock分析文档
一.DeskClock界面
DeskClock界面的组件
View组件中包括:NextAlarm,BatteryDisplay,WeatherCurrentTemperature,WertherHighTemerature,WertherLowTemerature,WertherLocation,Date,TimeDisplay,AmPm(天气组件部分未实现)
Button组件中包括:alarm_buttongallery_buttonmusic_buttonhome_buttonnightmode_button
2.DeskClock继承Activity类,主要实现跳转功能。通过将监听器绑定在Button上,实现界面跳转。
本界面重点在于屏保的转换,通过nightmode_button按钮,实现暗屏,屏保等功能。屏幕明暗转换:·暗~明:
UI~创立View并监听~执行nightmodeButton~Dodim~判断true/false执行是否变暗。
·明~暗:
UI~创立View并监听~接收到点击黑屏事件~nightmodeButton~Dodim~判断true/false执行是否变暗。
屏保模式:(超时自动屏保,手动屏保,黑屏移动,退出屏保模式)
·超时自动屏保:
另起线程~当屏幕超时无操作时~新建View,Window获得并显示信息~创立数据~刷新数据~设置可见~确定位置。·长按变暗:
UI~判断dimed的true/false~按nightmodeButton~接受黑屏事件并定义View,将数据显示在黑屏上~刷新数据~刷新闹钟~创立View来显示时钟数据并重新定义位置。·黑屏移动:
另起线程~当改变位置时~调用moveScreenSaver~确定位置~定义长宽.
Digital:另起线程,更新数据~更新~改变格式
·退出屏保:
onDetachedFromWindow~DigitalClock~onFinishInflate~AmPm~setDateFormat~get24HourMode~setShowAmPm~onAttachedToWindow,过滤~另起线程~更新数据
?常量:ACTION_DATE_CHANGEDACTION_BATTERY_CHANGEDACTION_MIDNIGHTBATTERY_STATUS_UNKNOWNQUERY_WEATHER_DATA_MSGUPDATE_WEATHER_DISPLAY_MSGQUERY_WEATHER_DELAYSCREEN_SAVER_TIMEOUT_MSG
广播行动:时间已经改变了系统定义,包括充电状态,普通状态夜间模式(黑屏)位置位置查询天气信息更新天气显示信息查询天气是否显示超时屏保信息
3
DeskClock分析文档
SCREEN_SAVER_MOVE_MSGFLAG_SHOW_WHEN_LOCKEDFLAG_ALLOW_LOCK_WHILE_SCREEN_ONFLAG_TURN_SCREEN_ONFLAG_KEEP_SCREEN_ONSCREEN_SAVER_COLOR_DIMACTION_GENIE_REFRESHWEATHER_CONTENT_AUTHORITYWEATHER_CONTENT_PATHBATTERY_STATUS_CHARGINGBATTERY_STATUS_FULLNEXT_ALARM_FORMATTEDINVISIBLEFLAG_FULLSCREENBRIGHTNESS_OVERRIDE_OFFBRIGHTNESS_OVERRIDE_NONEACTION_EXIT_DESK_MODEALARM_SERVICECATEGORY_DESK_DOCKEXTERNAL_CONTENT_URIFLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_NEW_TASKINTENT_ACTION_MUSIC_PLAYERACTION_MAINDOCK_SETTINGS_ACTION
屏保移动信息锁屏显示亮屏允许锁定亮屏保持亮屏暗屏当局天气内容天气路径电池充电状态电池慢点状态格式化下一个闹铃不可见的(视图)满屏,隐蔽所有装饰关闭覆盖亮度无覆盖亮度桌面模式闹铃服务桌面底座种类外部内容的URI清除顶部活动新建活动栈跳转music跳转home设置底座
4
DeskClock分析文档
二.Alarms界面
?
要解决哪些问题:?闹钟涉及到有关类和方法?怎样闹铃?闹铃之后的操作
闹钟涉及到有关类和方法
????????????
BroadcastReceiverPendingIntentAlarmManagerContentObserverParcelableLayoutLayout
存储和获取数据的机制——preferenceContentResolver
newView和bindView的作用
Notification与Toast的区别以及Notification的使用如何将应用程序的数据暴露出去如何在Activity之间共享数据
?BroadcastReceiver
BroadcastReceiver是Android中用处巨大的异步消息机制。它有轻量和跨进程的性质。一个BroadcastReceiver对象的生命周期不超过5秒,不能绑定服务和做一些耗时的操作,但是用来收发信号和消息则绰绰有余。·BroadcastReceiver的几种用法:
1.把耗内存好多的操作(如:下载或流量统计),注册在一个跨进程的Service里面,通过BroadcastReceiver与前台通信。
DeskClock分析文档
用到了newView和bindView,通过前面的介绍,我们知道这两个方法的功能是:当列表排满时,第一次调用newView,之后只调用bindView就可以了。privateclassAlarmTimeAdapterextendsCursorAdapter{
publicAlarmTimeAdapter(Contextcontext,Cursorcursor){super(context,cursor);Log.i(\}
publicViewnewView(Contextcontext,Cursorcursor,ViewGroupparent){Viewret=mFactory.inflate(R.layout.alarm_time,parent,false);
DigitalClockdigitalClock=(DigitalClock)ret.findViewById(R.id.digitalClock);digitalClock.setLive(false);Log.i(\returnret;}
publicvoidbindView(Viewview,Contextcontext,Cursorcursor){Log.i(\
finalAlarmalarm=newAlarm(cursor);
Viewindicator=view.findViewById(R.id.indicator);
//Settheinitialresourceforthebarimage.finalImageViewbarOnOff=(ImageView)indicator.findViewById(R.id.bar_onoff);barOnOff.setImageResource(alarm.enabled?R.drawable.ic_indicator_on:R.drawable.ic_indicator_off);
//Settheinitialstateoftheclock\finalCheckBoxclockOnOff=(CheckBox)indicator.findViewById(R.id.clock_onoff);clockOnOff.setChecked(alarm.enabled);
//Clickingoutsidethe\indicator.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){clockOnOff.toggle();
updateIndicatorAndAlarm(clockOnOff.isChecked(),barOnOff,alarm);Log.i(\}});
11
DeskClock分析文档
DigitalClockdigitalClock=(DigitalClock)view.findViewById(R.id.digitalClock);
//setthealarmtext
finalCalendarc=Calendar.getInstance();c.set(Calendar.HOUR_OF_DAY,alarm.hour);c.set(Calendar.MINUTE,alarm.minutes);digitalClock.updateTime(c);
digitalClock.setTypeface(Typeface.DEFAULT);
//Settherepeattextorleaveitblankifitdoesnotrepeat.TextViewdaysOfWeekView=(TextView)digitalClock.findViewById(R.id.daysOfWeek);finalStringdaysOfWeekStr=alarm.daysOfWeek.toString(AlarmClock.this,false);if(daysOfWeekStr!=nulldaysOfWeekView.setVisibility(View.VISIBLE);}else{
Log.i(\daysOfWeekView.setVisibility(View.GONE);}
//DisplaythelabelTextViewlabelView=(TextView)view.findViewById(R.id.label);if(alarm.label!=nulllabelView.setVisibility(View.VISIBLE);}else{Log.i(\labelView.setVisibility(View.GONE);}}};
·通过onCreateContextMenu方法,长按选中的闹钟,会显示对闹钟操作的选项@Override
publicvoidonCreateContextMenu(ContextMenumenu,Viewview,ContextMenuInfomenuInfo){//Inflatethemenufromxml.
getMenuInflater().inflate(R.menu.context_menu,menu);
12
DeskClock分析文档
//Usethecurrentitemtocreateacustomviewfortheheader.
finalAdapterContextMenuInfoinfo=(AdapterContextMenuInfo)menuInfo;finalCursorc=(Cursor)mAlarmsList.getAdapter().getItem((int)info.position);finalAlarmalarm=newAlarm(c);
//ConstructtheCalendartocomputethetime.finalCalendarcal=Calendar.getInstance();cal.set(Calendar.HOUR_OF_DAY,alarm.hour);cal.set(Calendar.MINUTE,alarm.minutes);finalStringtime=Alarms.formatTime(this,cal);
//InflatethecustomviewandseteachTextView'stext.
finalViewv=mFactory.inflate(R.layout.context_menu_header,null);TextViewtextView=(TextView)v.findViewById(R.id.header_time);textView.setText(time);
textView=(TextView)v.findViewById(R.id.header_label);textView.setText(alarm.label);
//Setthecustomviewonthemenu.menu.setHeaderView(v);Log.i(\
//Changethetextbasedonthestateofthealarm.if(alarm.enabled){Log.i(\
menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);}
}
·当点击menu时,通过重写onOptionsItemSelected,弹出菜单项选择项@Override
publicbooleanonOptionsItemSelected(MenuItemitem){switch(item.getItemId()){
caseR.id.menu_item_settings:Log.i(\startActivity(newIntent(this,SettingsActivity.class));returntrue;
caseR.id.menu_item_desk_clock:Log.i(\startActivity(newIntent(this,DeskClock.class));returntrue;
caseR.id.menu_item_add_alarm:Log.i(\addNewAlarm();returntrue;
default:Log.i(\break;
13
DeskClock分析文档
}
returnsuper.onOptionsItemSelected(item);
}//监听按钮
publicvoidonItemClick(AdapterViewparent,Viewv,intpos,longid){Intentintent=newIntent(this,SetAlarm.class);intent.putExtra(Alarms.ALARM_ID,(int)id);startActivity(intent);Log.i(\}}
?闹铃后的操作
AlarmAlertFullScreen继承Activity,这是响铃界面。当系统发出广播时,通过BroadcastReceiver接受到广播,来触发响铃。?打盹(snooze)
Snooze后,系统发出通知,提醒下一次再响时间privatevoidsnooze(){
//不终止闹铃,则闹铃被禁用
if(!findViewById(R.id.snooze).isEnabled()){Log.v(\dismiss(false);return;}
finalStringsnooze=PreferenceManager.getDefaultSharedPreferences(this).getString(SettingsActivity.KEY_ALARM_SNOOZE,DEFAULT_SNOOZE);intsnoozeMinutes=Integer.parseInt(snooze);
finallongsnoozeTime=System.currentTimeMillis()+(1000*60*snoozeMinutes);
Alarms.saveSnoozeAlert(AlarmAlertFullScreen.this,mAlarm.id,snoozeTime);
//得到显示时间打盹和更新的通知.finalCalendarc=Calendar.getInstance();c.setTimeInMillis(snoozeTime);
//(snoozed)添加标签.
Stringlabel=mAlarm.getLabelOrDefault(this);
label=getString(R.string.alarm_notify_snooze_label,label);
//通知用户已经snoozed警报。
14
DeskClock分析文档
IntentcancelSnooze=newIntent(this,AlarmReceiver.class);cancelSnooze.setAction(Alarms.CANCEL_SNOOZE);cancelSnooze.putExtra(Alarms.ALARM_ID,mAlarm.id);PendingIntentbroadcast=PendingIntent.getBroadcast(this,mAlarm.id,cancelSnooze,0);Log.v(\
NotificationManagernm=getNotificationManager();
Notificationn=newNotification(R.drawable.stat_notify_alarm,label,0);
n.setLatestEventInfo(this,label,getString(R.string.alarm_notify_snooze_text,Alarms.formatTime(this,c)),broadcast);n.flags|=Notification.FLAG_AUTO_CANCEL|Notification.FLAG_ONGOING_EVENT;nm.notify(mAlarm.id,n);Log.v(\
StringdisplayTime=getString(R.string.alarm_alert_snooze_set,snoozeMinutes);
Log.v(displayTime);
//显示toast。
Toast.makeText(AlarmAlertFullScreen.this,displayTime,Toast.LENGTH_LONG).show();
stopService(newIntent(Alarms.ALARM_ALERT_ACTION));finish();
}
?取消(dismiss)
privatevoiddismiss(booleankilled){
Log.i(killed?\
//Theservicetoldusthatthealarmhasbeenkilled,donotmodify//thenotificationorstoptheservice.if(!killed){Log.v(\
//CancelthenotificationandstopplayingthealarmNotificationManagernm=getNotificationManager();nm.cancel(mAlarm.id);
stopService(newIntent(Alarms.ALARM_ALERT_ACTION));}finish();
}
15
DeskClock分析文档
?AlarmReceiver类继承BroadcastReceiver,该类重写onReceive()方法,定义
了NotificationManager()和updateNotification()。?
onReceive()方法接受系统发来的广播
@Override
publicvoidonReceive(Contextcontext,Intentintent){//杀死闹铃
if(Alarms.ALARM_KILLED.equals(intent.getAction())){Log.e(\
//Thealarmhasbeenkilled,updatethenotificationupdateNotification(context,(Alarm)//手动杀死
intent.getParcelableExtra(Alarms.ALARM_INTENT_EXTRA),//超时杀死intent.getIntExtra(Alarms.ALARM_KILLED_TIMEOUT,-1));return;
}elseif(Alarms.CANCEL_SNOOZE.equals(intent.getAction())){Log.e(\
Alarms.saveSnoozeAlert(context,-1,-1);return;}
Alarmalarm=null;//
finalbyte[]data=
intent.getByteArrayExtra(Alarms.ALARM_RAW_DATA);if(data!=null){Log.e(\Parcelin=Parcel.obtain();
in.unmarshall(data,0,data.length);in.setDataPosition(0);
alarm=Alarm.CREATOR.createFromParcel(in);}
if(alarm==null){Log.e(\
Log.v(\intent\
return;}
//Intentionallyverbose:alwayslogthealarmtimetoprovideuseful
//informationinbugreports.
16
DeskClock分析文档
longnow=System.currentTimeMillis();SimpleDateFormatformat=newSimpleDateFormat(\
Log.v(\+format.format(newDate(alarm.time)));
if(now>alarm.time+STALE_WINDOW*1000){Log.e(\if(Log.LOGV){Log.v(\}return;}
//保证cpu唤醒前,通过AlarmAlertWakeLock和AlarmAlert将AlarmAlertWakeLock.acquireCpuWakeLock(context);
/*Closedialogsandwindowshade*/IntentcloseDialogs=new
Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS);context.sendBroadcast(closeDialogs);
//决定哪些活动开始基于keyguard的状态.Classc=AlarmAlert.class;
KeyguardManagerkm=(KeyguardManager)context.getSystemService(Context.KEYGUARD_SERVICE);Log.e(\if(km.inKeyguardRestrictedInputMode()){Log.e(\
//使用全屏活动以保证安全.
c=AlarmAlertFullScreen.class;}
/*launchUI,explicitlystatingthatthisisnotduetouseraction*sothatthecurrentapp'snotificationmanagementisnotdisturbed*/
IntentalarmAlert=newIntent(context,c);
alarmAlert.putExtra(Alarms.ALARM_INTENT_EXTRA,alarm);alarmAlert.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_NO_USER_ACTION);context.startActivity(alarmAlert);
//假使snooze,禁用.
Alarms.disableSnoozeAlert(context,alarm.id);//假使没有重复,禁用
17
DeskClock分析文档
if(!alarm.daysOfWeek.isRepeatSet()){Log.e(\Alarms.enableAlarm(context,alarm.id,false);}else{Log.e(\
//假使有下一个警报。enableAlarm通知setNextAler,避免调用它的两次.Alarms.setNextAlert(context);}
//启用闹铃和震动装置.
IntentplayAlarm=newIntent(Alarms.ALARM_ALERT_ACTION);playAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA,alarm);context.startService(playAlarm);
Intentnotify=newIntent(context,AlarmAlert.class);notify.putExtra(Alarms.ALARM_INTENT_EXTRA,alarm);
PendingIntentpendingNotify=PendingIntent.getActivity(context,alarm.id,notify,0);
Stringlabel=alarm.getLabelOrDefault(context);Log.e(\
Notificationn=newNotification(R.drawable.stat_notify_alarm,label,alarm.time);
n.setLatestEventInfo(context,label,context.getString(R.string.alarm_notify_text),pendingNotify);
n.flags|=Notification.FLAG_SHOW_LIGHTS|Notification.FLAG_ONGOING_EVENT;n.defaults|=Notification.DEFAULT_LIGHTS;
NotificationManagernm=getNotificationManager(context);nm.notify(alarm.id,n);
}
?updateNotification()方法更新消息privatevoidupdateNotification(Contextcontext,Alarmalarm,inttimeout){
NotificationManagernm=getNotificationManager(context);
//Ifthealarmisnull,justcancelthenotification.if(alarm==null){
if(Log.LOGV){Log.e(\
18
DeskClock分析文档
Log.v(\}return;}
//当点击,发出SetAlarm.
IntentviewAlarm=newIntent(context,SetAlarm.class);viewAlarm.putExtra(Alarms.ALARM_ID,alarm.id);PendingIntentintent=PendingIntent.getActivity(context,alarm.id,viewAlarm,0);
//更新通知显示警报已经消失.
Stringlabel=alarm.getLabelOrDefault(context);Log.e(\
Notificationn=newNotification(R.drawable.stat_notify_alarm,label,alarm.time);
n.setLatestEventInfo(context,label,context.getString(R.string.alarm_alert_alert_silenced,timeout),intent);
n.flags|=Notification.FLAG_AUTO_CANCEL;
//Wehavetocanceltheoriginalnotificationsinceitisinthe//ongoingsectionandwewantthe\plain
//notification.nm.cancel(alarm.id);nm.notify(alarm.id,n);}}
19
DeskClock分析文档
三.设置闹钟参数
?SetAlarm继承PreferenceActivity,它是一个参数设置界面和参数存储的Activity。
?PreferenceActivity继承ListActivity它是以一个列表的形式在浮现内容,它最主要的特
点是添加Preference可以让控件的状态持久化储存,举个例子譬如用户选中checkbox后退出应用然后在进入应用,这时用户希望看到的是checkbox被选中,所以软件必需记录用户每次操作的过程并且持久储存,在进入应用的时候必需判断这些久储存的数据然后将系统控件的状态浮现在UI中。
特别是软件开发确定会有一堆设置选项,每次进入Activity都去手动的去取储存的数据,这样代码会变得很繁杂很麻烦。这个时候Preference就出来了,它就是专门解决这些特别的选项保存与读取的显示。用户每次操作事件它会及时的以键值对的形式记录在SharedPreferences中,Activity每次启动它会自动帮我们完成数据的读取以及UI的显示。
Android开发中一共为我们提供了4个组件,分别是CheckBoxPreference组件、EditTextPreference组件、ListPreference组件、RingtonePreference组件
SetAlarm类的作用是储存闹钟参数界面的设置。
?Alarm.java闹钟参数界面
·启动:privateCheckBoxPreferencemEnabledPref;·时间:privatePreferencemTimePref;·重复:privateRepeatPreferencemRepeatPref;·铃声:privateAlarmPreferencemAlarmPref;·震动:privateCheckBoxPreferencemVibratePref·标签:privateEditTextPreferencemLabel;
?以下代码是SetAlarm中onCreate方法
@Override
protectedvoidonCreate(Bundleicicle){super.onCreate(icicle);Log.e(\//获得set_alarm的布局文件setContentView(R.layout.set_alarm);
addPreferencesFromResource(R.xml.alarm_prefs);mLabel=(EditTextPreference)findPreference(\
//为Label设置监听
mLabel.setOnPreferenceChangeListener(newPreference.OnPreferenceChangeListener(){publicbooleanonPreferenceChange(Preferencep,
20
DeskClock分析文档
ObjectnewValue){Stringval=(String)newValue;
//Setthesummarybasedonthenewlabel.p.setSummary(val);
if(val!=null}
returntrue;}});
mEnabledPref=(CheckBoxPreference)findPreference(\
//为EnabledPref设置监听
mEnabledPref.setOnPreferenceChangeListener(newPreference.OnPreferenceChangeListener(){publicbooleanonPreferenceChange(Preferencep,ObjectnewValue){Log.e(\//Popatoastwhenenablingalarms.
if(!mEnabledPref.isChecked()){Log.e(\popAlarmSetToast(SetAlarm.this,mHour,mMinutes,mRepeatPref.getDaysOfWeek());}
returnSetAlarm.this.onPreferenceChange(p,newValue);}});
//为mAlarmPref、mVibratePref、mRepeatPref设置监听
mTimePref=findPreference(\
mAlarmPref=(AlarmPreference)findPreference(\mAlarmPref.setOnPreferenceChangeListener(this);
mVibratePref=(CheckBoxPreference)findPreference(\mVibratePref.setOnPreferenceChangeListener(this);
mRepeatPref=(RepeatPreference)findPreference(\mRepeatPref.setOnPreferenceChangeListener(this);
//定义Intent,来获取值
Intenti=getIntent();
mId=i.getIntExtra(Alarms.ALARM_ID,-1);if(Log.LOGV){
Log.v(\}
Alarmalarm=null;
if(mId==-1){Log.e(\
21
DeskClock分析文档
//Noalarmidmeanscreateanewalarm.alarm=newAlarm();}else{Log.e(\
/*loadalarmdetailsfromdatabase*/
alarm=Alarms.getAlarm(getContentResolver(),mId);//Badalarm,bailtoavoidaNPE.if(alarm==null){Log.e(\finish();return;}}
mOriginalAlarm=alarm;
updatePrefs(mOriginalAlarm);
//Wehavetodothistogetthesave/cancelbuttonstohighlighton//theirown.
getListView().setItemsCanFocus(true);
//为save设置监听
Buttonb=(Button)findViewById(R.id.alarm_save);b.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewv){Log.e(\saveAlarm();finish();}});
//为revert设置监听
finalButtonrevert=(Button)findViewById(R.id.alarm_revert);revert.setEnabled(false);
revert.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewv){Log.e(\intnewId=mId;updatePrefs(mOriginalAlarm);//\if(mOriginalAlarm.id==-1){Log.e(\
Alarms.deleteAlarm(SetAlarm.this,newId);}else{Log.e(\saveAlarm();}revert.setEnabled(false);
22
DeskClock分析文档
}});
//为delete设置监听
b=(Button)findViewById(R.id.alarm_delete);if(mId==-1){Log.e(\b.setEnabled(false);}else{Log.e(\
b.setOnClickListener(newView.OnClickListener(){publicvoidonClick(Viewv){Log.e(\deleteAlarm();}});}
//Thelastthingwedoispopthetimepickerifthisisanewalarm.if(mId==-1){Log.e(\//AssumetheuserhitcancelmTimePickerCancelled=true;showTimePicker();}}
?updatePrefs方法用来更新获取的值
privatevoidupdatePrefs(Alarmalarm){Log.e(\mId=alarm.id;
mEnabledPref.setChecked(alarm.enabled);mLabel.setText(alarm.label);mLabel.setSummary(alarm.label);mHour=alarm.hour;mMinutes=alarm.minutes;
mRepeatPref.setDaysOfWeek(alarm.daysOfWeek);mVibratePref.setChecked(alarm.vibrate);//Givethealerturitothepreference.mAlarmPref.setAlert(alarm.alert);updateTime();}
?onBackPressed方法,设置闹铃后,退出并保存@Override
publicvoidonBackPressed(){
if(!mTimePickerCancelled){Log.e(\
23
DeskClock分析文档
saveAlarm();}finish();}
?通过onPreferenceTreeClick方法设置时间
@Override
publicbooleanonPreferenceTreeClick(PreferenceScreenpreferenceScreen,
Preferencepreference){Log.e(\if(preference==mTimePref){Log.e(\showTimePicker();}
returnsuper.onPreferenceTreeClick(preferenceScreen,preference);}
·showTimePicker方法,定义newTimePickerDialog,设置时间privatevoidshowTimePicker(){Log.e(\newTimePickerDialog(this,this,mHour,mMinutes,DateFormat.is24HourFormat(this)).show();}
·onTimeSet方法,更新时间设置
publicvoidonTimeSet(TimePickerview,inthourOfDay,intminute){Log.e(\
mTimePickerCancelled=false;mHour=hourOfDay;mMinutes=minute;updateTime();
//Ifthetimehasbeenchanged,enablethealarm.mEnabledPref.setChecked(true);//Savethealarmandpopatoast.
popAlarmSetToast(this,saveAlarmAndEnableRevert());
}
?调用在AlarmKlaxon类中定义的mVibrator@Override
publicvoidonCreate(){mVibrator=(Vibrator)
getSystemService(Context.VIBRATOR_SERVICE);
//Listenforincomingcallstokillthealarm.mTelephonyManager=(TelephonyManager)
24
DeskClock分析文档
getSystemService(Context.TELEPHONY_SERVICE);//通话
mTelephonyManager.listen(mPhoneStateListener,PhoneStateListener.LISTEN_CALL_STATE);
AlarmAlertWakeLock.acquireCpuWakeLock(this);Log.e(\}
?铃声:privateAlarmPreferencemAlarmPref;
通过AlarmPreference类继承RingtonePreference类。
RingtonePreference专门处理铃声。可以在应用程序中使用它为用户提供一个选项,以便选择某个铃声作为首选项。
?设置闹铃重复:privateRepeatPreferencemRepeatPref;
通过RepeatPreference类继承ListPreference类。
ListPreference相当于windows的下拉列表框,提供用户可选项和默认选项。通过重写onPrepareDialogBuilder方法创立一个下拉列表
@Override
protectedvoidonPrepareDialogBuilder(Builderbuilder){Log.e(\
CharSequence[]entries=getEntries();
CharSequence[]entryValues=getEntryValues();
builder.setMultiChoiceItems(entries,mDaysOfWeek.getBooleanArray(),newDialogInterface.OnMultiChoiceClickListener(){
//监听选中项publicvoidonClick(DialogInterfacedialog,intwhich,booleanisChecked){Log.e(\mNewDaysOfWeek.set(which,isChecked);}});
}
通过重写onDialogClose
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 上饶市广丰县2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 白银市白银区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 果洛藏族自治州甘德县2025-2026学年第二学期五年级语文第四单元测试卷(部编版含答案)
- 厦门市湖里区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 伊春市翠峦区2025-2026学年第二学期六年级语文第五单元测试卷部编版含答案
- 保定市高碑店市2025-2026学年第二学期四年级语文期中考试卷(部编版含答案)
- 公司接待方案
- 深度解析(2026)《CBT 4428-2015船用辅锅炉控制设备技术条件》
- 深度解析(2026)《CBT 4015-2005 J类法兰青铜 1.6MPa截止阀》
- 深度解析(2026)《AQT 1121-2023煤矿安全现状评价实施细则》宣贯培训长文
- 江西省港口集团招聘笔试题库2026
- 给水工程可行性研究报告
- 装饰装修施工安全培训课件
- 《生物医学新技术临床研究和临床转化应用管理条例》测试练习竞赛考试题库(附答案)
- 2026年细胞免疫学实验计划
- 铁路货车课件
- 审计法讲解课件
- 2026年公安机关理论考试题库300道及参考答案(满分必刷)
- 做账实操-金属制品有限公司成本核算SOP
- 老年性发声障碍嗓音声学评估与方案
- 植物根的生长课件
评论
0/150
提交评论