1. 程式人生 > >APP開發實戰163-JobScheduler介紹

APP開發實戰163-JobScheduler介紹

許多APP都需要定期執行某個或某幾項任務,如在聯網狀態下,每隔一段時間上傳日誌資料給伺服器,或在手機處於Idle狀態時,定期清理手機的儲存空間等。

以往實現這樣的功能時,往往需要啟動一個定時器不斷的輪詢執行任務的條件是否滿足,如果滿足還需啟動定時器定期執行任務,這種機制的實現方式比較麻煩。

34.13.1 JobScheduler介紹

在Android5.0(API 21)中,Google提供了一個叫做JobScheduler的功能元件來處理這種場景;在JobScheduler功能類中,有一個JobService類,它是使用JobScheduler回撥的入口點。

JobService類中包含以下幾個函式:

    voidjobFinished (JobParameters params, boolean needsReschedule)

這個函式是在任務完成之後被呼叫

params---這個引數是從onStartJob函式傳遞過來的

needsReschedule---如為true,此任務只會被執行一次;false則會被反覆執行。

booleanonStartJob (JobParametersparams)

在JobService的子類中,必需重寫這個函式。

params---傳遞此任務的相關資訊

返回值為true,此service必須在一個單獨的子執行緒中處理工作;返回值為false,此任務沒有工作要做。

    booleanonStopJob (JobParametersparams)

當系統確定必須停止執行任務時,會呼叫此函式;甚至會在呼叫jobFinished函式之前被呼叫。

如果在設定的時間,任務執行的條件不再滿足時,此函式就會被呼叫:如要求的是裝置要連線WiFi,但在執行任務的時候,使用者把WiFi切換掉了;或者任務需要在Idle狀態下執行,但手機進入了非Idle狀態。

params---傳遞此任務的相關資訊

返回值為true時,告訴JobManager根據建立Job時的設定,是否重新安排此任務執行;返回值為false時,退出Job。

不管返回值是什麼,Job都必須停止執行。

具體程式碼如下:

private JobScheduler mJobScheduler;

//宣告Job的任務Id數值
public static final int MY_BACKGROUND_JOB = 0;

//初始化JobScheduler物件

public void initVariables() {

...
    mJobScheduler = (JobScheduler)getSystemService(Context.JOB_SCHEDULER_SERVICE );


}

//設定執行此任務需滿足的條件、間隔時間和關機重啟後是否繼續執行

public static void scheduleJob(Contextcontext) {
    JobScheduler js =
            (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
    JobInfo job = new JobInfo.Builder(
            MY_BACKGROUND_JOB,

           //在JobSchedulerService類中執行任務
            new ComponentName(context,JobSchedulerService.class))

//設定在聯網狀態下執行此任務
           .setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY)

//設定在裝置處於Idle狀態時執行此任務
            .setRequiresDeviceIdle(true)

//設定在裝置處於充電狀態時執行此任務
            .setRequiresCharging(true)

//設定任務的執行間隔時間為10秒
            .setPeriodic(10*1000)

//設定裝置關機重啟後,還是繼續按上述要求執行此任務
            .setPersisted(true)
            .build();
    js.schedule(job);
}

Google的官方文件中描述是必須滿足執行任務的條件後,任務才會被執行,實際驗證,即使條件不滿足,任務也會被執行,也就是如下程式碼和上述程式碼的實際執行結果一樣:

public static void scheduleJob(Contextcontext) {
    JobScheduler js =
            (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
    JobInfo job = new JobInfo.Builder(
            MY_BACKGROUND_JOB,
            new ComponentName(context,JobSchedulerService.class))

//設定任務的執行間隔時間為10秒
            .setPeriodic(10*1000)

//設定裝置關機重啟後,還是繼續按上述要求執行此任務
            .setPersisted(true)
            .build();
    js.schedule(job);
}

//取消Job

private void cancelJob(){
    mJobScheduler.cancelAll();
}

public class JobSchedulerService extendsJobService {

    public static final intMY_JOB_MESSAGE = 0;

    private Handler mJobHandler = newHandler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg ) {
            Toast.makeText(getApplicationContext(), "JobService task running",Toast.LENGTH_LONG).show();


            jobFinished( (JobParameters)msg.obj, false);
            return true;
        }
    } );

    @Override
    public booleanonStartJob(JobParameters params ) {
        mJobHandler.sendMessage(Message.obtain( mJobHandler, MY_JOB_MESSAGE, params ) );


        return false;
    }

    @Override
    public boolean onStopJob(JobParameters params ) {
        Toast.makeText(getApplicationContext(), "JobService task stop", Toast.LENGTH_SHORT).show();


       mJobHandler.removeMessages(MY_JOB_MESSAGE);
        return false;
    }

}

在AndroidManifest.xml中增加如下宣告:

<uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED" />

<serviceandroid:name=".service.JobSchedulerService"
   android:permission="android.permission.BIND_JOB_SERVICE" />

相關推薦

APP開發實戰163-JobScheduler介紹

許多APP都需要定期執行某個或某幾項任務,如在聯網狀態下,每隔一段時間上傳日誌資料給伺服器,或在手機處於Idle狀態時,定期清理手機的儲存空間等。 以往實現這樣的功能時,往往需要啟動一個定時器不斷的輪詢執行任務的條件是否滿足,如果滿足還需啟動定時器定期執行任務,這種機制的實

APP開發實戰34-HTTPS介紹

8 HTTPS介紹 8.1協議簡介 HTTPS(Hyper Text Transfer Protocol over Secure Socket Layer),是HTTP的安全版,在HTTP和TCP層間加入SSL\TLS層,以實現內容加密、身份認證和保證資料完整性。 (SSL

APP開發實戰40-MD5介紹

12 加密介紹 12.1MD5簡介 MD5即Message-Digest Algorithm5(資訊-摘要演算法5),用於確保資訊傳輸完整一致。是計算機廣泛使用的雜湊演算法之一(又譯摘要演算法、雜湊演算法)。MD5的作用是讓大容量資訊在用數字簽名軟體簽署私人金鑰前被"壓縮"

APP開發實戰39-Session介紹

11 Session介紹 11.1Session簡介 Session在網路應用中,稱為“會話控制”。Session物件儲存特定使用者會話所需的屬性及配置資訊,如登入資訊等(Session是一個容器,可以存放會話過程中的任何物件)。Session機制採用的是在伺服器端保持狀態

APP開發實戰38-Cookie介紹

10 Cookie介紹 10.1Cookie簡介 HTTP是一種無狀態性的協議。這是因為此種協議不要求瀏覽器在每次請求中標明它自己的身份,並且瀏覽器以及伺服器之間並沒有保持一個永續性的連線用於多個頁面之間的訪問。 當用戶訪問http://example.com這個域名的時

APP開發實戰45-設計模式介紹3

13.3.5策略模式 策略模式定義一系列的演算法,並把每一個演算法封裝起來, 且使它們可相互替換,使得演算法的變化可獨立於使用它的客戶。 此模式的使用場景:  (1)針對同一類問題的多種處理方式,僅僅是具體行為有差別時。 (2)需要安全地封裝多種同一型別操作時。 (3)出

APP開發實戰46-設計模式介紹4

13.3.9備忘錄模式 備忘錄模式在不破壞封裝性的前提下,捕獲一個物件的內部狀態,並在該物件之外儲存這個狀態。這樣以後就可將該物件恢復到儲存的狀態。 此模式的使用場景: (1)需要儲存一個物件在某一時刻的狀態或部分狀態。 (2)如果用一個介面來讓其他物件得到這些狀態,將會暴

APP開發實戰90-向量圖介紹

23.2向量圖介紹 向量圖,也叫做向量圖,簡單的說,就是縮放不失真的影象格式。向量圖是通過多個物件的組合生成的,對其中的每一個物件的紀錄方式,都是以數學函式來實現的;一幅圖可以解為一系列由點、線、面等到組成的子圖,向量圖記錄的是物件的幾何形狀、線條粗細和色彩等,並不是象點陣

APP開發實戰47-設計模式介紹5

13.3.12代理模式 代理模式為其他物件提供一個代理以控制對這個物件的訪問。 當無法或不想直接訪問某個物件或訪問某個物件粗耨困難時可以通過一個代理物件來間接訪問,為了保證客戶端使用的透明性,委託物件與代理物件需要實現相同的介面。      iOS在不同介面間的傳值、And

APP開發實戰15-字元編碼介紹

5 字元編碼介紹 5.1 簡介 5.1.1字元 字元是抽象的最小文字單位。它沒有固定的形狀(可能是一個字形),而且沒有值。“A”是一個字元,“€”(德國、法國和許多其他歐洲國家通用貨幣的標誌)也是一個字元。“中”“國”這是兩個漢字字元。字元僅僅代表一個符號,沒有任何實際值的

APP開發實戰43-設計模式介紹1

13 設計模式介紹 13.1設計模式簡介     設計模式(Design pattern)是一套被反覆使用、多數人知曉的、經過分類編目的、程式碼設計經驗的總結。使用設計模式是為了可重用程式碼、讓程式碼更容易被他人理解、保證程式碼可靠性。 13.2面向物件設計原則     面

APP開發實戰132-Git命令介紹

33.2Git命令介紹 一、 Git 常用命令速查 gitbranch 檢視本地所有分支 git status 檢視當前狀態 git commit 提交 git branch -a 檢視所有的分支 git branch -r 檢視遠端所有分支 git commit -a

APP開發實戰164-Evernote的JobScheduler方案

34.13.2 JobScheduler的替代方案     前面提到,使用JobScheduler時,即使執行任務的條件不滿足,任務也會被執行;為了規避這個缺陷,可以使用Evernote提供的庫讓APP定期執行任務,以下是具體的實現方式。 在build.gradle檔案中

(頭條新聞)Cordova+React+OnsenUI+Redux新聞App開發實戰教程

持續集成 fonts itl webp ebo 如何 out yar 方便 前言 伴隨著HTML5技術的普及力度與日俱增, 混合應用開發已經備受關註, 百家爭鳴的技術框架,如何做好技術選型,搭建最穩健的架構,快速的持續集成,是一個跨平臺App開發的關鍵所在,所以本套視頻教

眾幫傳媒APP開發的規則簡單介紹

眾幫傳媒系統開發找【李132-9795-9832微/電】眾幫傳媒發朋友圈返傭系統專業開發、眾幫傳媒朋友圈賺錢平臺系統開發、眾幫傳媒租圈發廣告返利系統開發、眾幫傳媒朋友圈廣告分銷系統開發、眾幫傳媒髮圈分銷返利模式系統開發 ----------特別提示:專業開發公司,非平臺運營方,玩家勿擾!!!--------

最新Android手把手打造一個萬能框架完成電商App開發實戰視訊教程

從零開始手把手教你打造一個通用app框架,兼具靈活性和複用性,並用該框架快速開發一個完整電商App,  讓您領略框架設計的魅力,提高程式碼修為,在工作中能更加高效的開發!!第1回 課程大綱及APP效果展示'第2回 專案初始化第3回 框架主配置入口的設計與實踐第4回 單Activi

最新仿映客直播APP開發實戰專案IOS開發實戰8天

第 1 章:直播準備 1: 【錄播】 課程大綱介紹 09:56   2: 【錄播】 瞭解直播技術和騰訊雲直播 09:54   3: 【錄播】 基礎封裝 23:13   4: 【錄播】 網路封裝講解 12:42   5: 【錄播】 介面協議 18:34   6: 【錄播】 MV

APP開發實戰16-字符集和編碼

5.2字符集 ASCII及其擴充套件字符集 作用:表語英語及西歐語言。 位數:ASCII是用7位表示的,能表示128個字元;其擴充套件使用8位表示,表示256個字元。 範圍:ASCII從00到7F,擴充套件從00到FF。 ISO-8859-1字符集 作用:擴充

手機開發實戰90——WAP介紹3

WML介紹 和HTML語言一樣,WML是為了顯示資料的,而XML的目的則是描述資料,我們定義了一系列的標記並組織成為語法規範把它稱為DTD(Document Type Definition)。

(頭條)Cordova+React+OnsenUI+Redux新聞App開發實戰教程

前言 伴隨著HTML5技術的普及力度與日俱增, 混合應用開發已經備受關注, 百家爭鳴的技術框架,如何做好技術選型,搭建最穩健的架構,快速的持續整合,是一個跨平臺App開發的關鍵所在,所以本套視訊教程憑藉實戰App開發做實驗講解,帶您共同學習基於Cord