android要實現定時的功能那確定就要用到鬧鈴相關的技術,java
那麼android鬧鈴實現是基於 AlarmManager 這個類的,首先咱們來看一下它的幾個主要的方法。android
兩個核心的方法 :ide
private final IAlarmManager mService;
public void set(int type, long triggerAtMillis, PendingIntent operation) { try { mService.set(type, triggerAtMillis, operation); } catch (RemoteException ex) { } }
和this
public void setRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation) { try { mService.setRepeating(type, triggerAtMillis, intervalMillis, operation); } catch (RemoteException ex) { } }
第一個方法主要功能是註冊一個比較簡單的鬧鈴,第二個方法是註冊一個重複的鬧鈴,這裏重複的意思是指:設置5s, 那麼每隔5s會執行一次 。spa
咱們看到這裏具體的實現都是基於IAlarmManager的,而IAlarmManager是一個aidl(Android Interface definition language),具體的就不詳細介紹了,你們有興趣的能夠本身研究一下。.net
下面我來看下set(int type, long triggerAtMillis, PendingIntent operation)方法是如何調用的:orm
// 進行鬧鈴註冊 Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); // 過10s 執行這個鬧鈴 Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 10); AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE); manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
看一下AlarmReceiver 的源碼:xml
/** * * @ClassName: AlarmReceiver * @Description: 鬧鈴時間到了會進入這個廣播,這個時候能夠作一些該作的業務。 * @author HuHood * @date 2013-11-25 下午4:44:30 * */ public class AlarmReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "鬧鈴響了, 能夠作點事情了~~", Toast.LENGTH_LONG).show(); } }
還有別忘了,AndroidManifest.xml中須要加入:blog
<receiver android:name="com.example.alarmmanagerdemo.AlarmReceiver" android:process=":remote">
運行以後,過10s 彈出 "鬧鈴響了,能夠作點事情了~~", 說明成功了。事件
ok,這個結果確定不是咱們想要的,咱們想要的功能是天天定時提醒的功能,那麼須要基於
setRepeating(int type, long triggerAtMillis,long intervalMillis, PendingIntent operation)
這個方法來實現,代碼以下:
Intent intent = new Intent(MainActivity.this, AlarmReceiver.class); PendingIntent sender = PendingIntent.getBroadcast(MainActivity.this, 0, intent, 0); long firstTime = SystemClock.elapsedRealtime(); // 開機以後到如今的運行時間(包括睡眠時間) long systemTime = System.currentTimeMillis(); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); // 這裏時區須要設置一下,否則會有8個小時的時間差 calendar.setTimeZone(TimeZone.getTimeZone("GMT+8")); calendar.set(Calendar.MINUTE, mMinute); calendar.set(Calendar.HOUR_OF_DAY, mHour); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.MILLISECOND, 0); // 選擇的定時時間 long selectTime = calendar.getTimeInMillis(); // 若是當前時間大於設置的時間,那麼就從次日的設定時間開始 if(systemTime > selectTime) { Toast.makeText(MainActivity.this,"設置的時間小於當前時間", Toast.LENGTH_SHORT).show(); calendar.add(Calendar.DAY_OF_MONTH, 1); selectTime = calendar.getTimeInMillis(); } // 計算如今時間到設定時間的時間差 long time = selectTime - systemTime; firstTime += time; // 進行鬧鈴註冊 AlarmManager manager = (AlarmManager)getSystemService(ALARM_SERVICE); manager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime, DAY, sender); Log.i(TAG,"time ==== " + time +", selectTime ===== " + selectTime + ", systemTime ==== " + systemTime +", firstTime === " + firstTime); Toast.makeText(MainActivity.this,"設置重複鬧鈴成功! ", Toast.LENGTH_LONG).show();
以上的思路大體是這樣的,首先根據設置的時間,算出當前時間離設置時間的時間差,加上這個時間差,咱們就知道第一次提醒的時間,而後再設定重複的時間間隔,咱們這裏設置1天就能夠了。
如今解釋一下setRepeating中第一個參數:
AlarmManager.RTC,硬件鬧鐘,不喚醒手機(也多是其它設備)休眠;當手機休眠時不發射鬧鐘。
AlarmManager.RTC_WAKEUP,硬件鬧鐘,當鬧鐘發躰時喚醒手機休眠;
AlarmManager.ELAPSED_REALTIME,真實時間流逝鬧鐘,不喚醒手機休眠;當手機休眠時不發射鬧鐘。
AlarmManager.ELAPSED_REALTIME_WAKEUP,真實時間流逝鬧鐘,當鬧鐘發躰時喚醒手機休眠;
RTC鬧鐘和ELAPSED_REALTIME最大的差異就是前者能夠經過修改手機時間觸發鬧鐘事件,後者要經過真實時間的流逝,即便在休眠狀態,時間也會被計算。
以上摘自:http://hualang.iteye.com/blog/1304054
還有,咱們這裏是調用廣播的形式來實現的,也能夠用service的方式來進行實現,只要把PendingIntent改動一下便可,相關代碼:
PendingIntent.getService(MainActivity.this, 0,new Intent(MainActivity.this,AlarmService.class), 0);
其餘的均相同。
完整Demo下載:
http://download.csdn.net/detail/jakend/6612033
轉自:http://jakend.iteye.com/blog/1980842