AlarmManager

AlarmManager

簡介:此物是系統的一個服務,獨立於CPU。就是說即使手機關機了,AlarmManager依然是活動着的。

1.      如何取得實例:

alarmManager = (AlarmManager)  getSystemService(Context.ALARM_SERVICE);

2.      常用方法列表:

1.public void set(int  type, long triggerAtTime, PendingIntent operation);

       設置一個指定類型時間延期意圖的定時器。

2.public void cancel(PendingIntent  operation);

       取消所匹配延期意圖的定時器。

3.public void setRepeating(int  type, long triggerAtTime, long interval,PendingIntent operation);

       設置一個指定類型時間間隔延期意圖重複定時器。

4.public void setInexactRepeating(int  type, long triggerAtTime, long interval,PendingIntent operation);

       設置一個指定類型時間間隔延期意圖的不精準的重複定時器。效果與setRepeating方法一致。

3.      AlarmManagertype

RTC_WAKEUP

   基於絕對時間的,可以把睡眠中的系統喚醒。

RTC

   基於絕對時間的,不可以喚醒睡眠的系統,只能等到系統醒來才能執行。

ELAPSED_REALTIME_WAKEUP

   基於相對時間的,可以把睡眠中的系統喚醒。

ELAPSED_REALTIME

   基於相對時間的,不可以喚醒睡眠的系統,只能等到系統醒來才能執行。

問題:什麼是相對時間和絕對時間,該怎麼去用呢?

相對時間指手機待機時間,就是從手機開機到現在所經歷的毫秒值。

什麼叫做基於相對時間?現在我想用ELAPSED_REALTIME類型,然後1秒鐘後開始定時器任務,我就得這麼做:

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,SystemClock.elapsedRealtime()+1000,  operation);其中SystemClock.elapsedRealtime()就是獲取手機待機時間。

      絕對時間指手機的真是時間,可以從System.currentTimeMillis()獲取當前時間毫秒值。

什麼叫做基於絕對時間呢?現在我要用RTC_WAKEUP類型,然後1秒鐘後啓動定時器任務,我要這麼做:

       alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+1000,  operation);

 

 

4.      範例1:指定時間(xxxxxxxxxxxx秒)執行一個RTC_WAKEUP類型的任務

廣播接受者:

publicclass MyReceiver extends BroadcastReceiver {

 

   @Override

   publicvoid onReceive(Context context, Intent intent)  {

      Toast.makeText(context,  "I get  it", 0).show();

      System.out.println("I get it");

   }

 

}

任務開始:

publicclass MainActivity extends Activity {

 

   privatefinal String ACTION = "com.hwh.finish";

   private AlarmManager alarmManager;

    @Override

    publicvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        Intent intent = new Intent();

        intent.setAction(ACTION);

       

        Calendar can = Calendar.getInstance();

       int day=can.get(Calendar.DAY_OF_MONTH);

       can.set(Calendar.DAY_OF_MONTH, day);

       can.set(Calendar.HOUR_OF_DAY, 17);

       can.set(Calendar.MINUTE, 27);

       can.set(Calendar.SECOND, 0);

     

        PendingIntent operation =  PendingIntent.getBroadcast(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

        alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+(can.getTimeInMillis()-System.currentTimeMillis()),  operation);

}

}

 

 

 

 

範例2:指定時間(xxxxxxxxxxxx秒)執行一個ELAPSED_REALTIME類型的任務

publicclass MainActivity extends Activity {

 

   privatefinal String ACTION = "com.hwh.finish";

   private AlarmManager alarmManager;

    @Override

    publicvoid onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        Intent intent = new Intent();

        intent.setAction(ACTION);

       

        Calendar can = Calendar.getInstance();

       int day=can.get(Calendar.DAY_OF_MONTH);

       can.set(Calendar.DAY_OF_MONTH, day);

       can.set(Calendar.HOUR_OF_DAY, 17);

       can.set(Calendar.MINUTE, 27);

       can.set(Calendar.SECOND, 0);

     

        PendingIntent operation =  PendingIntent.getBroadcast(this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT);

        alarmManager.set(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime()+(can.getTimeInMillis()-System.currentTimeMillis()),  operation);

}

}

 

5.      其他

AlarmManager定時器和Timer有相同的作用,區別在於,Timer是基於程序和系統的,程序被殺掉、系統關機Timer就無法執行了。AlarmManager是單獨與系統CPU的一個東西,就算是CPU正在睡眠中(如關機)但是隻要AlarmManager中設置的時間到了,它也會喚醒系統,執行任務,前提是type得是WAKEUP類型。

另外,在客戶端和服務器交互中,有時候也要維持住一個長連接,在android平臺實現長連接就是每隔一定時間去請求一次服務器,不要讓鏈路中斷。可以使用Timer,但是它需要用 WakeLock CPU 保持喚醒狀態,這樣會大量消耗手機電量。所以使用AlarmManager就是最佳方案。關於長連接可以參考

http://blog.jpush.cn/index.php/jpush_wireless_push_principle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章