- AlarmManager简介
AlarmManager提供了一种系统级的提示服务,允许你安排在将来的某个时间执行一个服务。
AlarmManager对象一般不直接实例化,而是通过Content.getSystemService(Content.ALARM_SERVICE)方法获得
- AlarmManager常用属性和方法
AlarmManager.RTC 硬件闹钟,不唤醒手机(也可能其它设备)休眠;当手机休眠时不发射闹钟。
AlarmManager.RTC_WAKEUP 硬件闹钟,当闹钟发射时唤醒休眠手机。
AlarmManager.ELAPSED_REALTIME 真实时间流逝闹钟,不唤醒手机休眠;当手机休眠时不发射闹钟。
AlarmManager.ELAPSED_REALTIME_WAKEUP 真实时间流逝闹钟,当闹钟发射时唤醒手机休眠。
RTC闹钟和ELAPSED_REALTIME最大的差别就是前者可以通过修改手机时间触发闹钟事件,后者要通过真实时间的流逝,即使在休眠状态,时间也会被计算。
简易的闹钟实现(以Toast方式替代响铃操作)
自定义一个广播接收器,用来显示
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"起床了,起床了",Toast.LENGTH_SHORT).show();
}
}
闹钟事件
public void startAlarmClick(View v){
//获取到系统的闹钟服务
AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//触发闹钟的时间(毫秒)
long triggerTime=System.currentTimeMillis()+3000;
Intent intent=new Intent(this,AlarmReceiver.class);
PendingIntent op=PendingIntent.getBroadcast(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//只会执行一次的闹钟
// am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);//参数:类型,触发时间,操作
//指定时间重复执行闹钟
am.setRepeating(AlarmManager.RTC,triggerTime,5000,op);//参数:类型,第一次触发时间,之后每次循环触发间隔,操作
}
效果图
模拟闹钟界面
创建一个Activity用于显示闹钟界面
public class AlarmActivity extends Activity {
MediaPlayer mp;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//唤醒屏幕
Window win=getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD|
WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON|
WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
setContentView(R.layout.activity_alarm);
mp=new MediaPlayer();
try {
mp.setDataSource(this, Uri.parse("/sdcard/Music/zhh.mp3"));
mp.prepare();
} catch (IOException e) {
e.printStackTrace();
}
mp.setLooping(true);//重复
mp.start();
alarmDialog();
}
@Override
protected void onDestroy() {
super.onDestroy();
if(mp!=null){
if (mp.isPlaying()){
mp.stop();
}
mp.release();
}
}
public void alarmDialog(){
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setMessage("大哥赶紧起床啊!");
builder.setPositiveButton("再来一次", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
alarm();
finish();
}
});
builder.setNegativeButton("停止", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
finish();
}
});
builder.show();
}
private void alarm(){
//获取到系统的闹钟服务
AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//触发闹钟的时间(毫秒)
long triggerTime=System.currentTimeMillis()+5000;
Intent intent=new Intent(this,AlarmActivity.class);
PendingIntent op=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//只会执行一次的闹钟
am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);//参数:类型,触发时间,操作
}
启动闹钟的点击事件
public void startSetAlarmClick(View v){
//获取到系统的闹钟服务
AlarmManager am= (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//触发闹钟的时间(毫秒)
long triggerTime=System.currentTimeMillis()+3000;
Intent intent=new Intent(this,AlarmActivity.class);
PendingIntent op=PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);
//只会执行一次的闹钟
am.set(AlarmManager.RTC_WAKEUP,triggerTime,op);//参数:类型,触发时间,操作
}
清单文件添加样式
效果如下