- 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);//參數:類型,觸發時間,操作
}
清單檔案添加樣式
效果如下