http://book.51cto.com/art/201006/207068.htm
8.3.5 全局定时器AlarmManager(3)
本例使用BroadcastReceiver来处理定时提醒任务。BroadcastReceiver类的代码如下:
- packagenet.blogjava.mobile;
- importjava.util.Calendar;
- importandroid.app.Activity;
- importandroid.content.BroadcastReceiver;
- importandroid.content.Context;
- importandroid.content.Intent;
- importandroid.content.SharedPreferences;
- importandroid.media.MediaPlayer;
- publicclassAlarmReceiverextendsBroadcastReceiver
- {
- @Override
- publicvoidonReceive(Contextcontext,Intentintent)
- {
- SharedPreferencessharedPreferences=
context.getSharedPreferences(- "alarm_record",Activity.MODE_PRIVATE);
- Stringhour=String.valueOf(Calendar.
getInstance().get(Calendar.HOUR_OF_DAY));- Stringminute=String.valueOf(Calendar.
getInstance().get(Calendar.MINUTE));- //从XML文件中获得描述当前时间点的value
- Stringtime=sharedPreferences.
getString(hour+":"+minute,null);- if(time!=null)
- {
- //播放声音
- MediaPlayermediaPlayer=
MediaPlayer.create(context,R.raw.ring);- mediaPlayer.start();
- }
- }
- }
配置AlarmReceiver类的代码如下:
- <receiverandroid:name=".AlarmReceiver"android:enabled="true"/>
在主程序中每添加一个时间点,就会在XML文件中保存所添加的时间点,代码如下:
- packagenet.blogjava.mobile;
- importandroid.app.Activity;
- importandroid.app.AlarmManager;
- importandroid.app.AlertDialog;
- importandroid.app.PendingIntent;
- importandroid.content.Context;
- importandroid.content.DialogInterface;
- importandroid.content.Intent;
- importandroid.content.SharedPreferences;
- importandroid.os.Bundle;
- importandroid.view.View;
- importandroid.view.View.OnClickListener;
- importandroid.widget.Button;
- importandroid.widget.TextView;
- importandroid.widget.TimePicker;
- publicclassMainextendsActivityimplementsOnClickListener
- {
- privateTextViewtvAlarmRecord;
- privateSharedPreferencessharedPreferences;
- @Override
- publicvoidonClick(Viewv)
- {
- Viewview=getLayoutInflater().inflate(R.layout.alarm,null);
- finalTimePickertimePicker=(TimePicker)
view.findViewById(R.id.timepicker);- timePicker.setIs24HourView(true);
- //显示设置时间点的对话框
- newAlertDialog.Builder(this).setTitle("设置提醒时间").setView(view)
- .setPositiveButton("确定",new
DialogInterface.OnClickListener()- {
- @Override
- publicvoidonClick(DialogInterfacedialog,intwhich)
- {
- StringtimeStr=String.valueOf(timePicker
- .getCurrentHour())+":"
- +String.valueOf
(timePicker.getCurrentMinute());- //将时间点添加到TextView组件中
- tvAlarmRecord.setText
(tvAlarmRecord.getText().toString()+"\n"+timeStr);- //保存时间点
- sharedPreferences.edit().
putString(timeStr,timeStr).commit();- }
- }).setNegativeButton("取消",null).show();
- }
- @Override
- publicvoidonCreate(BundlesavedInstanceState)
- {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- ButtonbtnAddAlarm=(Button)findViewById(R.id.btnAddAlarm);
- tvAlarmRecord=(TextView)findViewById(R.id.tvAlarmRecord);
- btnAddAlarm.setOnClickListener(this);
- sharedPreferences=getSharedPreferences("alarm_record",
- Activity.MODE_PRIVATE);
- AlarmManageralarmManager=(AlarmManager)
getSystemService(Context.ALARM_SERVICE);- Intentintent=newIntent(this,AlarmReceiver.class);
- //创建封装BroadcastReceiver的pendingIntent对象
- PendingIntentpendingIntent=PendingIntent.
getBroadcast(this,0,intent,0);- //开始定时器,每1分钟执行一次
- alarmManager.setRepeating(AlarmManager.RTC,
0,60*1000,pendingIntent);- }
- }
在使用本例添加若干个时间点后,会在alarm_record.xml文件中看到类似下面的内容:
- <?xmlversion='1.0'encoding='utf-8'standalone='yes'?>
- <map>
- <stringname="18:52">18:52</string>
- <stringname="20:16">20:16</string>
- <stringname="19:11">19:11</string>
- <stringname="19:58">19:58</string>
- <stringname="22:51">22:51</string>
- <stringname="22:10">22:10</string>
- <stringname="22:11">22:11</string>
- <stringname="20:10">20:10</string>
- </map>
上面每个<string>元素都是一个时间点,定时器将每隔1分钟查一次alarm_record.xml文件。