當前位置:編程學習大全網 - 源碼下載 - android 後臺運行 並定時觸發任務

android 後臺運行 並定時觸發任務

Android中的定時任務壹般有兩種實現方式,壹種是使用Java

API裏的Timer類,另壹種是使用Android的Alarm機制。

這兩種方式在多數情況下都能實現類似的效果,但Timer有壹個明顯的短板,它並不太適用與那些需要長期在後臺運行的定時任務。As we

know,為了能讓電池更加耐用,每種手機都會有自己的休眠策略:比如手機不用的時候智能的斷開wifi連接,根據光線強弱自動調節屏幕亮度,根據手機長時間無操作時自動的讓CPU進入到休眠狀態等,當進入休眠狀態時,這就有可能導致Timer中的定時任務無法正常運行。而Alarn機制則不存在這種情況,它具有喚醒CPU的功能,即可以保證每次需要執行定時任務的時候CPU都能正常工作。需要註意的是,這裏的喚醒CPU和喚醒屏幕不是同壹個概念,不能混淆。

這裏我們只說Alarm機制的方式,代碼如下:

public class AutoUpdateService extends Service {

@Override

public IBinder onBind(Intent intent) {

return null;

}

// 每次服務啟動的時候調用

@Override

public int onStartCommand(Intent intent, int flags, int startId) {

new Thread(new Runnable() {

@Override

public void run() {

doSomething();//這是定時所執行的任務

}

}).start();

AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);

int anHour =8 * 60 * 60 * 1000;// 這是8小時的毫秒數 為了少消耗流量和電量,8小時自動更新壹次

long triggerAtTime = SystemClock.elapsedRealtime() + anHour;

Intent intent2 = new Intent(this, AutoUpdateReceiver.class);

PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent2, 0);

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime, pi);</span>

return super.onStartCommand(intent, flags, startId);

}

註意這裏的AlarmManager manager = (AlarmManager) getSystemService(ALARM_SERVICE);此處實現了定時任務。

首先我們通過調用Context的getSystemService()方法來獲取AlarmManager的實例,這裏需要傳入的參數是ALARM_SERVICE.

接下來調用AlarmManager的set()方法就可以設置壹個定時任務了,比如設定壹個任務在5秒鐘後執行,就可以寫成 long

triggerAtTime = SystemClock.elapsedRealtime() + 5*1000;

manager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtTime,

pi);

其中第壹個參數是壹個整形參數,用於指定AlarmManager的工作類型,有四種值可以選,分別是

ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC和RTC_WAKEUP。其中ELAPSED_REALTIME表示讓定時任務的觸發時間從系統開機開始算起,但不會喚醒CPU。ELAPSED_REALTIME_WAKEUP同樣表示讓定時任務的觸發時間從系統開機開始算起,但會喚醒CPU。RTC表示讓定時任務的觸發時間從1970年1月1日0點開始算起,但不會喚醒CPU。RTC_WAKEUP同樣表示讓定時任務的觸發時間從1970年1月1日0點開始算起,但會喚醒CPU。使用SystemClock.elapsedRealtime()方法可以獲取到系統開機至今所經歷時間的毫秒數,使用System.currentTimeMillis()方法可以獲取到1970年1月1日0點至今所經歷時間的毫秒數。

然後看壹下第二個參數,這個參數就好理解多了,就是定時任務觸發的時間,以毫秒為單位。如果第壹個參數使用的是ELAPSED_REALTIME或ELAPSED_REALTIME_WAKEUP,則這裏傳入開機至今的時間再加上延遲執行的時間。如果第壹個參數使用的是RTC或RTC_WAKEUP,則這裏傳入1970年1月1日0點至今的時間再加上延遲執行的時間。

第三個參數是壹個PendingIntent,這裏我們壹般會調用getBroadcast()方法來獲取壹個能夠執行廣播的PendingIntent。這樣當定時任務被觸發的時候,廣播接收器的onReceive()方法就可以得到執行。

當然設定壹個任務在10秒鐘後執行還可以寫成:

longtriggerAtTime =

System.currentTimeMillis() + 10 * 1000;

manager.set(AlarmManager.RTC_WAKEUP,triggerAtTime,

pendingIntent);

然後創建PendingIntent指定處理定時任務的廣播接收器AutoUpdateReceiver。

import service.AutoUpdateService;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

public class AutoUpdateReceiver extends BroadcastReceiver {

@Override

public void onReceive(Context context, Intent intent) {

Intent i = new Intent(context, AutoUpdateService.class);

context.startService(i);

}

}

當啟動AutoUpdateService後,就會在onStartCommand()方法裏設定壹個定時任務,這樣每8個小時AutoUpdateReceiver的onReceive()方法就會得到執行,這樣就又會啟動AutoUpdateService服務,形成了永久的循環,保證服務每隔壹段時間就會啟動壹次,這樣就完成了壹個長期在後臺運行的服務。

我們在哪裏啟動服務呢,這要看具體的情況了,壹般的話,當我們打開程序的時候啟動壹次就好了

比如寫在Activity的onCrete()方法裏

Intent

intent =new Intent(this,AutoUpdateService.class);

startService(intent);

最後,既然我們用到了服務和廣播接收器,那麽就得在AndroidManifest.xml中註冊才行。

<service android:name="service.AutoUpdateService" ></service>

<receiver android:name="receiver.AutoUpdateReceiver"

></receiver>

本文

參考資料:

《第壹行代碼》

  • 上一篇:產品經理培訓課程學什麽?
  • 下一篇:Html源代碼暫停效果
  • copyright 2024編程學習大全網