全局定时器 实现闹钟功能

http://book.51cto.com/art/201006/207068.htm

8.3.5  全局定时器AlarmManager(3)

本例使用BroadcastReceiver来处理定时提醒任务。BroadcastReceiver类的代码如下:

  1. package net.blogjava.mobile;  
  2.  
  3. import java.util.Calendar;  
  4. import android.app.Activity;  
  5. import android.content.BroadcastReceiver;  
  6. import android.content.Context;  
  7. import android.content.Intent;  
  8. import android.content.SharedPreferences;  
  9. import android.media.MediaPlayer;  
  10.  
  11. public class AlarmReceiver extends BroadcastReceiver  
  12. {  
  13.     @Override  
  14.     public void onReceive(Context context, Intent intent)  
  15.     {  
  16.         SharedPreferences sharedPreferences = 
    context.getSharedPreferences(  
  17.                 "alarm_record", Activity.MODE_PRIVATE);  
  18.         String hour = String.valueOf(Calendar.
    getInstance().get(Calendar.HOUR_OF_DAY));  
  19.         String minute = String.valueOf(Calendar.
    getInstance().get(Calendar.MINUTE));  
  20.         //  从XML文件中获得描述当前时间点的value  
  21.         String time = sharedPreferences.
    getString(hour + ":" + minute, null);  
  22.         if (time != null)  
  23.         {              
  24.             //  播放声音  
  25.             MediaPlayer mediaPlayer = 
    MediaPlayer.create(context, R.raw.ring);  
  26.             mediaPlayer.start();  
  27.         }  
  28.     }  

配置AlarmReceiver类的代码如下:

  1. <receiver android:name=".AlarmReceiver" android:enabled="true" /> 

在主程序中每添加一个时间点,就会在XML文件中保存所添加的时间点,代码如下:

  1. package net.blogjava.mobile;  
  2.  
  3. import android.app.Activity;  
  4. import android.app.AlarmManager;  
  5. import android.app.AlertDialog;  
  6. import android.app.PendingIntent;  
  7. import android.content.Context;  
  8. import android.content.DialogInterface;  
  9. import android.content.Intent;  
  10. import android.content.SharedPreferences;  
  11. import android.os.Bundle;  
  12. import android.view.View;  
  13. import android.view.View.OnClickListener;  
  14. import android.widget.Button;  
  15. import android.widget.TextView;  
  16. import android.widget.TimePicker;  
  17.  
  18. public class Main extends Activity implements OnClickListener  
  19. {  
  20.     private TextView tvAlarmRecord;  
  21.     private SharedPreferences sharedPreferences;  
  22.     @Override  
  23.     public void onClick(View v)  
  24.     {  
  25.         View view = getLayoutInflater().inflate(R.layout.alarm, null);  
  26.         final TimePicker timePicker = (TimePicker) 
    view.findViewById(R.id.timepicker);  
  27.         timePicker.setIs24HourView(true);  
  28.         //  显示设置时间点的对话框  
  29.         new AlertDialog.Builder(this).setTitle("设置提醒时间").setView(view)  
  30.                 .setPositiveButton("确定", new 
    DialogInterface.OnClickListener()  
  31.                 {  
  32.                     @Override  
  33.                     public void onClick(DialogInterface dialog, int which)  
  34.                     {  
  35.                         String timeStr = String.valueOf(timePicker  
  36.                                 .getCurrentHour()) + ":"  
  37.                                 + String.valueOf
    (timePicker.getCurrentMinute());  
  38.                         //  将时间点添加到TextView组件中  
  39.                         tvAlarmRecord.setText
    (tvAlarmRecord.getText().toString() + "\n" + timeStr);  
  40.                         //  保存时间点  
  41.                         sharedPreferences.edit().
    putString(timeStr, timeStr).commit();  
  42.                     }  
  43.                 }).setNegativeButton("取消", null).show();  
  44.     }  
  45.     @Override  
  46.     public void onCreate(Bundle savedInstanceState)  
  47.     {  
  48.         super.onCreate(savedInstanceState);  
  49.         setContentView(R.layout.main);  
  50.         Button btnAddAlarm = (Button) findViewById(R.id.btnAddAlarm);  
  51.         tvAlarmRecord = (TextView) findViewById(R.id.tvAlarmRecord);  
  52.         btnAddAlarm.setOnClickListener(this);  
  53.         sharedPreferences = getSharedPreferences("alarm_record",  
  54.                 Activity.MODE_PRIVATE);  
  55.         AlarmManager alarmManager = (AlarmManager)
    getSystemService(Context.ALARM_SERVICE);  
  56.         Intent intent = new Intent(this, AlarmReceiver.class);  
  57.         //  创建封装BroadcastReceiver的pendingIntent对象  
  58.         PendingIntent pendingIntent = PendingIntent.
    getBroadcast(this, 0,intent, 0);  
  59.         //  开始定时器,每1分钟执行一次  
  60.         alarmManager.setRepeating(AlarmManager.RTC,
    0, 60 * 1000, pendingIntent);  
  61.     }  

在使用本例添加若干个时间点后,会在alarm_record.xml文件中看到类似下面的内容:

  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
  2. <map> 
  3. <string name="18:52">18:52</string> 
  4. <string name="20:16">20:16</string> 
  5. <string name="19:11">19:11</string> 
  6. <string name="19:58">19:58</string> 
  7. <string name="22:51">22:51</string> 
  8. <string name="22:10">22:10</string> 
  9. <string name="22:11">22:11</string> 
  10. <string name="20:10">20:10</string> 
  11. </map> 

上面每个<string>元素都是一个时间点,定时器将每隔1分钟查一次alarm_record.xml文件。

posted @ 2012-05-02 18:40  sfshine  阅读(412)  评论(0编辑  收藏  举报