天天看點

安卓學習日記——AlarmManager系統服務

  • 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);//參數:類型,第一次觸發時間,之後每次循環觸發間隔,操作

    }
           

效果圖

安卓學習日記——AlarmManager系統服務

模拟鬧鐘界面

建立一個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);//參數:類型,觸發時間,操作
    }
           

清單檔案添加樣式

安卓學習日記——AlarmManager系統服務

效果如下

安卓學習日記——AlarmManager系統服務

繼續閱讀