Android中的定时器AlarmManager简介

时间:2023-01-22 23:37:09

AlarmManager不仅可用于开发闹钟应用,还可以作为一个全局定时器使用,Android应用的程序中也是通过Context的getSystemService()方法来获取AlarmManager对象,一旦程序获取了AlarmManager对象之后,就可以调用它的如下方法来设置定时启动的组件。

set(int type, long triggerAtTime,PendingIntent operation);

设置triggerAtTime时间启动由operation参数指定的组件。其中第一个参数指定定时服务的类型,该参数不可接受如下值:--------------------------------

ELAPSED_REALTIME:指定从现在开始时间过了一定时间(相对于系统启动开始)后启动operation所对应的组件。状态值为:3。


ELAPSED_REALTIME_WAKEUP:指定从现在开始时间(也使用相对时间)过了一定时候后启动operation所对应的组件。即使系统挂机也会执行operation所对应的组件。状态值为:1。


TRC:指定当系统调用System.currentTimeMillis()方法返回值与triggerAtTime相等时启动operation所对应的组件。状态值为1。


RTC_WAKEUP:指定当系统调用System.currentTimeMillis()方法返回值与triggerAtTime相等时启动operation所对应的组件。即使系统关机也会执行operation所对应的组件。状态值为0。


----------------------------------------------------第二个参数表示闹钟执行时间,第三个参数表示闹钟响应动作。


setInexactRepeating(int type, longtriggerAtTime, long interval, PendingIntent operation):设置一个非精确的周期性任务。例如我们设置Alarm每个小时启动一次,但系统并不一定总在每小时的开始启动Alarm服务。第一个参数表示闹钟类型,第二个参数表示闹钟首次执行时间,第三个参数表示闹钟两次执行的间隔时间,第三个参数表示闹钟响应动作。


setRepeating(int type, long triggerArTime,long interval, PendingIntent operation);设置一个周期性执行的定时服务。与第二个方法相似,不过其两个闹钟执行的间隔时间不是固定的而已。

cancel(PendingIntent operation):取消AlarmManager的定时服务。


设置闹钟:

public class AlarmTest extends Activity {
Button setTime;
AlarmManager aManager;
Calendar currentTime = Calendar.getInstance();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取程序界面的按钮
setTime = (Button) findViewById(R.id.setTime);
// 获取AlarmManager对象
aManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
// 为“设置闹铃”按钮绑定监听器。
setTime.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View source) {
Calendar currentTime = Calendar.getInstance();
// 创建一个TimePickerDialog实例,并把它显示出来。
new TimePickerDialog(AlarmTest.this, 0, // 绑定监听器
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker tp, int hourOfDay,
int minute) {
// 指定启动AlarmActivity组件
Intent intent = new Intent(AlarmTest.this,
AlarmActivity.class);
// 创建PendingIntent对象
PendingIntent pi = PendingIntent.getActivity(
AlarmTest.this, 0, intent, 0);
Calendar c = Calendar.getInstance();
// 根据用户选择时间来设置Calendar对象
c.set(Calendar.HOUR, hourOfDay);
c.set(Calendar.MINUTE, minute);
// 设置AlarmManager将在Calendar对应的时间启动指定组件
aManager.set(AlarmManager.RTC_WAKEUP,
c.getTimeInMillis(), pi);
// 显示闹铃设置成功的提示信息
Toast.makeText(AlarmTest.this, "闹铃设置成功啦",
Toast.LENGTH_SHORT).show();
}
}, currentTime.get(Calendar.HOUR_OF_DAY), currentTime
.get(Calendar.MINUTE), false).show();
}
});
}
}


闹钟的提醒:


public class AlarmActivity extends Activity {
MediaPlayer alarmMusic;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 加载指定音乐,并为之创建MediaPlayer对象
alarmMusic = MediaPlayer.create(this, R.raw.alarm);
alarmMusic.setLooping(true);
// 播放音乐
alarmMusic.start();
// 创建一个对话框
new AlertDialog.Builder(AlarmActivity.this).setTitle("闹钟")
.setMessage("闹钟响了,Go!Go!Go!")
.setPositiveButton("确定", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 停止音乐
alarmMusic.stop();
// 结束该Activity
AlarmActivity.this.finish();
}
}).show();
}
}