android 关于闹钟
以下是我发现的几点闹钟中重要的点,分享一下:
(1)在闹钟中有AudioManager管理机制,这个机制可以申请和释放OnAudioFocusChangeListener监听。
还有mTelephonyManager对象,处理在闹钟响的时候,来电铃声的切换。
(2)广播接收闹钟,通过广播启动AlarmKlaxon这个Service,隐式启动service:
public static final String ALARM_INTENT_EXTRA = "intent.extra.alarm";
[java] view plain copy print ?- //Playthealarmalertandvibratethedevice.
- IntentplayAlarm=newIntent(Alarms.ALARM_ALERT_ACTION);
- playAlarm.putExtra(Alarms.ALARM_INTENT_EXTRA,alarm);
- context.startService(playAlarm);
在mainfest中,AlarmKlaxon这个服务的定义如下:
[java] view plain copy print ?- <serviceandroid:name="AlarmKlaxon"
- android:description="@string/alarm_klaxon_service_desc"
- >
- <intent-filter>
- <actionandroid:name="com.cn.daming.deskclock.ALARM_ALERT"/>
- </intent-filter>
- </service>
这个service做的是允许别的Activity打断正在响铃的铃声,播放其他的铃声,例如,闹钟响的时候来电话了。
(3)在listview中包含checkbox,这时候闹钟的处理时,activity实现一个OnItemClickListener的监听,点击每一项的监听。然后在checkbox单独拿出去写一个类,继承LinearLayout,重写setPressed()这个方法,以实现“当点击checkbox的时候不触发parent的click事件”。关键代码如下:
[java] view plain copy print ?- <spanstyle="font-size:18px;">@Override
- publicvoidsetPressed(booleanpressed){
- //Iftheparentispressed,donotsettopressed.
- if(pressed&&((View)getParent()).isPressed()){
- return;
- }
- super.setPressed(pressed);
- }</span>
点击新建闹钟出现的界面 设置好时间弹出的toast。
下面我把我的主要入口类的代码贴出来:
DeskClockMainActivity.java
[java] view plain copy print ?- <spanstyle="font-size:18px;">packagecom.cn.daming.deskclock;
- importjava.util.Calendar;
- importandroid.app.Activity;
- importandroid.app.AlertDialog;
- importandroid.content.Context;
- importandroid.content.DialogInterface;
- importandroid.content.Intent;
- importandroid.content.SharedPreferences;
- importandroid.database.Cursor;
- importandroid.graphics.Typeface;
- importandroid.os.Bundle;
- importandroid.view.LayoutInflater;
- importandroid.view.Menu;
- importandroid.view.MenuItem;
- importandroid.view.View;
- importandroid.view.ContextMenu;
- importandroid.view.ContextMenu.ContextMenuInfo;
- importandroid.view.View.OnClickListener;
- importandroid.view.ViewGroup;
- importandroid.widget.AdapterView;
- importandroid.widget.AdapterView.AdapterContextMenuInfo;
- importandroid.widget.AdapterView.OnItemClickListener;
- importandroid.widget.CheckBox;
- importandroid.widget.CursorAdapter;
- importandroid.widget.ImageButton;
- importandroid.widget.ImageView;
- importandroid.widget.ListView;
- importandroid.widget.TextView;
- publicclassDeskClockMainActivityextendsActivityimplementsOnItemClickListener{
- staticfinalStringPREFERENCES="AlarmClock";
- /**Thismustbefalseforproduction.Iftrue,turnsonlogging,
- testcode,etc.*/
- staticfinalbooleanDEBUG=false;
- privateSharedPreferencesmPrefs;
- privateLayoutInflatermFactory;
- privateListViewmAlarmsList;
- privateCursormCursor;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- //取自定义布局的LayoutInflater
- mFactory=LayoutInflater.from(this);
- //取getSharedPreferences中key==“AlarmClock”的值
- mPrefs=getSharedPreferences(PREFERENCES,0);
- //获取闹钟的cursor
- mCursor=Alarms.getAlarmsCursor(getContentResolver());
- //更新布局界面
- updateLayout();
- }
- //加载更新界面布局
- privatevoidupdateLayout(){
- setContentView(R.layout.alarm_clock);
- mAlarmsList=(ListView)findViewById(R.id.alarms_list);
- AlarmTimeAdapteradapter=newAlarmTimeAdapter(this,mCursor);
- mAlarmsList.setAdapter(adapter);
- mAlarmsList.setVerticalScrollBarEnabled(true);
- mAlarmsList.setOnItemClickListener(this);
- mAlarmsList.setOnCreateContextMenuListener(this);
- ViewaddAlarm=findViewById(R.id.add_alarm);
- addAlarm.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewv){
- addNewAlarm();
- }
- });
- //Maketheentireviewselectedwhenfocused.
- addAlarm.setOnFocusChangeListener(newView.OnFocusChangeListener(){
- publicvoidonFocusChange(Viewv,booleanhasFocus){
- v.setSelected(hasFocus);
- }
- });
- ImageButtondeskClock=
- (ImageButton)findViewById(R.id.desk_clock_button);
- deskClock.setOnClickListener(newView.OnClickListener(){
- publicvoidonClick(Viewv){
- }
- });
- }
- privatevoidaddNewAlarm(){
- startActivity(newIntent(this,SetAlarm.class));
- }
- /**
- *listview的适配器继承CursorAdapter
- *@authorwangxianming
- *也可以使用BaseAdapter
- */
- privateclassAlarmTimeAdapterextendsCursorAdapter{
- publicAlarmTimeAdapter(Contextcontext,Cursorcursor){
- super(context,cursor);
- }
- publicViewnewView(Contextcontext,Cursorcursor,ViewGroupparent){
- Viewret=mFactory.inflate(R.layout.alarm_time,parent,false);
- DigitalClockdigitalClock=
- (DigitalClock)ret.findViewById(R.id.digitalClock);
- digitalClock.setLive(false);
- returnret;
- }
- //把view绑定cursor的每一项
- publicvoidbindView(Viewview,Contextcontext,Cursorcursor){
- 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"checkbox"
- finalCheckBoxclockOnOff=
- (CheckBox)indicator.findViewById(R.id.clock_onoff);
- clockOnOff.setChecked(alarm.enabled);
- //Clickingoutsidethe"checkbox"shouldalsochangethestate.
- //对checkbox设置监听,使里外一致
- indicator.setOnClickListener(newOnClickListener(){
- publicvoidonClick(Viewv){
- clockOnOff.toggle();
- updateIndicatorAndAlarm(clockOnOff.isChecked(),
- barOnOff,alarm);
- }
- });
- 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(DeskClockMainActivity.this,false);
- if(daysOfWeekStr!=null&&daysOfWeekStr.length()!=0){
- daysOfWeekView.setText(daysOfWeekStr);
- daysOfWeekView.setVisibility(View.VISIBLE);
- }else{
- daysOfWeekView.setVisibility(View.GONE);
- }
- //Displaythelabel
- TextViewlabelView=
- (TextView)view.findViewById(R.id.label);
- if(alarm.label!=null&&alarm.label.length()!=0){
- labelView.setText(alarm.label);
- labelView.setVisibility(View.VISIBLE);
- }else{
- labelView.setVisibility(View.GONE);
- }
- }
- };
- //更新checkbox
- privatevoidupdateIndicatorAndAlarm(booleanenabled,ImageViewbar,
- Alarmalarm){
- bar.setImageResource(enabled?R.drawable.ic_indicator_on
- :R.drawable.ic_indicator_off);
- Alarms.enableAlarm(this,alarm.id,enabled);
- if(enabled){
- SetAlarm.popAlarmSetToast(this,alarm.hour,alarm.minutes,
- alarm.daysOfWeek);
- }
- }
- /*
- *(non-Javadoc)
- *@seeandroid.app.Activity#onContextItemSelected(android.view.MenuItem)
- *创建上下文菜单
- */
- @Override
- publicbooleanonContextItemSelected(finalMenuItemitem){
- finalAdapterContextMenuInfoinfo=
- (AdapterContextMenuInfo)item.getMenuInfo();
- finalintid=(int)info.id;
- //Errorcheckjustincase.
- if(id==-1){
- returnsuper.onContextItemSelected(item);
- }
- switch(item.getItemId()){
- caseR.id.delete_alarm:
- //Confirmthatthealarmwillbedeleted.
- newAlertDialog.Builder(this)
- .setTitle(getString(R.string.delete_alarm))
- .setMessage(getString(R.string.delete_alarm_confirm))
- .setPositiveButton(android.R.string.ok,
- newDialogInterface.OnClickListener(){
- publicvoidonClick(DialogInterfaced,
- intw){
- Alarms.deleteAlarm(DeskClockMainActivity.this,id);
- }
- })
- .setNegativeButton(android.R.string.cancel,null)
- .show();
- returntrue;
- caseR.id.enable_alarm:
- finalCursorc=(Cursor)mAlarmsList.getAdapter()
- .getItem(info.position);
- finalAlarmalarm=newAlarm(c);
- Alarms.enableAlarm(this,alarm.id,!alarm.enabled);
- if(!alarm.enabled){
- SetAlarm.popAlarmSetToast(this,alarm.hour,alarm.minutes,
- alarm.daysOfWeek);
- }
- returntrue;
- caseR.id.edit_alarm:
- Intentintent=newIntent(this,SetAlarm.class);
- intent.putExtra(Alarms.ALARM_ID,id);
- startActivity(intent);
- returntrue;
- default:
- break;
- }
- returnsuper.onContextItemSelected(item);
- }
- /*
- *(non-Javadoc)
- *@seeandroid.app.Activity#onCreateContextMenu(android.view.ContextMenu,android.view.View,android.view.ContextMenu.ContextMenuInfo)
- *创建菜单
- */
- @Override
- publicvoidonCreateContextMenu(ContextMenumenu,Viewview,
- ContextMenuInfomenuInfo){
- //Inflatethemenufromxml.
- getMenuInflater().inflate(R.menu.context_menu,menu);
- //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);
- //Changethetextbasedonthestateofthealarm.
- if(alarm.enabled){
- menu.findItem(R.id.enable_alarm).setTitle(R.string.disable_alarm);
- }
- }
- /*
- *(non-Javadoc)
- *@seeandroid.app.Activity#onOptionsItemSelected(android.view.MenuItem)
- *设置菜单的点击事件的处理
- */
- @Override
- publicbooleanonOptionsItemSelected(MenuItemitem){
- switch(item.getItemId()){
- caseR.id.menu_item_settings:
- startActivity(newIntent(this,SettingsActivity.class));
- returntrue;
- caseR.id.menu_item_desk_clock:
- //modifybywangxianmingin2012-4-14
- //startActivity(newIntent(this,DeskClock.class));
- returntrue;
- caseR.id.menu_item_add_alarm:
- addNewAlarm();
- returntrue;
- default:
- break;
- }
- returnsuper.onOptionsItemSelected(item);
- }
- /*
- *(non-Javadoc)
- *@seeandroid.app.Activity#onCreateOptionsMenu(android.view.Menu)
- *创建菜单
- */
- @Override
- publicbooleanonCreateOptionsMenu(Menumenu){
- getMenuInflater().inflate(R.menu.alarm_list_menu,menu);
- returnsuper.onCreateOptionsMenu(menu);
- }
- /*
- *(non-Javadoc)
- *@seeandroid.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView,android.view.View,int,long)
- *创建菜单的点击事件响应
- */
- publicvoidonItemClick(AdapterView<?>adapterView,Viewv,intpos,longid){
- Intentintent=newIntent(this,SetAlarm.class);
- intent.putExtra(Alarms.ALARM_ID,(int)id);
- startActivity(intent);
- }
- @Override
- protectedvoidonDestroy(){
- super.onDestroy();
- ToastMaster.cancelToast();
- mCursor.close();
- }
- }</span>
也可以到我的csdn资源中下载:http://download.csdn.net/detail/wdaming1986/4226174
转载:http://blog.csdn.net/wdaming1986/article/details/7461043
更多相关文章
- ToolBar随ScrollView的滚动改变透明度
- Android编程: 界面组成、事件监听器
- android菜单中的见解
- Android实现短信验证码获取自动填写功能(详细版)
- Android实例练习-可爱的小闹钟
- Android(安卓)7.1 导航栏增加按键, 关机菜单增加休眠选项
- 基于XMPP协议的Android(安卓)IM研究
- Android(安卓)获得软键盘状态
- Android(安卓)DialogFragment底部弹出菜单