android之定时器AlarmManager用法详解

时间:2021-04-19 00:10:38
 

最终效果图:android之定时器AlarmManager用法详解

       当我们点击定时时,会弹出一个时间选择器,选定好时间之后,系统便可以进行定时了。注意,这里可不是会真的响铃,我们在定时的任务里并没有添加响铃的代码,只是在Logcat中做了个简单的打印。本例子重点在于讲解在android中AlarmManager的使用。

activity的代码:

 
 
  1. package cn.com.chenzheng_java;  
  2.   
  3. import java.util.Calendar;  
  4.   
  5. import android.app.Activity;  
  6. import android.app.AlarmManager;  
  7. import android.app.PendingIntent;  
  8. import android.app.TimePickerDialog;  
  9. import android.app.TimePickerDialog.OnTimeSetListener;  
  10. import android.content.Intent;  
  11. import android.os.Bundle;  
  12. import android.util.Log;  
  13. import android.view.View;  
  14. import android.view.View.OnClickListener;  
  15. import android.widget.Button;  
  16. import android.widget.CheckBox;  
  17. import android.widget.CompoundButton;  
  18. import android.widget.TimePicker;  
  19. import android.widget.CompoundButton.OnCheckedChangeListener;  
  20.   
  21. public class AlarmManagerActivity extends Activity implements OnClickListener,OnTimeSetListener,OnCheckedChangeListener{  
  22.     Calendar calendar = Calendar.getInstance();// 代表当前时间的日历  
  23.     Button button1 ;  
  24.     CheckBox checkBox;  
  25.     boolean flag = false ;// 是否只执行一次  
  26.       
  27.     @Override  
  28.     protected void onCreate(Bundle savedInstanceState) {  
  29.         super.onCreate(savedInstanceState);  
  30.         setContentView(R.layout.alarm);  
  31.           
  32.         button1 = (Button) findViewById(R.id.button_alarm1);  
  33.         checkBox = (CheckBox) findViewById(R.id.checkBox1_alarm);  
  34.         checkBox.setOnCheckedChangeListener(this);  
  35.           
  36.         button1.setOnClickListener(this);  
  37.     }  
  38.   
  39.     @Override  
  40.     public void onClick(View v) {  
  41.         if(v==button1){  
  42.             calendar.setTimeInMillis(System.currentTimeMillis());  
  43.             new TimePickerDialog(AlarmManagerActivity.thisthis,  
  44.                     calendar.get(Calendar.HOUR_OF_DAY),  
  45.                     calendar.get(Calendar.MINUTE), true).show();  
  46.         }  
  47.     }  
  48.   
  49.     /** 
  50.      * 当我们设置了新时间时触发。 
  51.      */  
  52.     @Override  
  53.     public void onTimeSet(TimePicker view, int hourOfDay, int minute) {  
  54.           
  55.         // 将时间设置为定时的时间  
  56.         calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);  
  57.         calendar.set(Calendar.MINUTE, minute);  
  58.           
  59.         Intent intent = new Intent(AlarmManagerActivity.this,MyAlarmBroadCast.class);  
  60.         PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);  
  61.           
  62.         /*** 
  63.          * 获取全局定时器的服务管理器 
  64.          */  
  65.         AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);  
  66.       
  67.         if(flag){  
  68.               
  69.           
  70.         /** 
  71.          * 指定的任务只会执行一次,如果该pendingIntent指定的任务已经被执行过了,那么该方法直接会被cancel掉。 
  72.          *  set(int type, long triggerAtTime, PendingIntent operation) 
  73.          *  type 指定定时模式。 
  74.          *  triggerAtTime 触发任务的时间。该参数和定时模式息息相关 
  75.          *  operation 该参数指定一个广播Intent,当时间到了时,系统会广播里面的intent,触发相应的广播接收者执行某些操作,比如响铃…… 
  76.          */  
  77.         alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);  
  78.         }  
  79.         else  
  80.         {  
  81.             /** 
  82.              * 通过该方法指定的任务会一直间隔执行,第三个参数就指定了执行的时间间隔 
  83.              * 如果我们想取消的话,请使用:alarmManager.cancel(pendingIntent); 
  84.              * 注意,这里的pendingIntent要和setRepeating方法中的一致哦。 
  85.              */  
  86.             alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), 5*1000, pendingIntent);    
  87.         }  
  88.         Log.i("通知""定时成功!");  
  89.           
  90.     }  
  91.       
  92.       
  93.       
  94.     @Override  
  95.     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {  
  96.         flag = !isChecked;  
  97.     }  
  98.       
  99.       
  100.       
  101.       
  102. }