1. 程式人生 > >在Android 5 0中使用JobScheduler

在Android 5 0中使用JobScheduler

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                       

在Android 5.0中使用JobScheduler

 

在這篇文章中,你會學習到在Android 5.0中如何使用JobScheduler API。JobScheduler API允許開發者在符合某些條件時建立執行在後臺的任務。

介紹

在Android開發中,會存在這麼些場景 : 你需要在稍後的某個時間點或者當滿足某個特定的條件時執行一個任務,例如當裝置接通電源介面卡或者連線到WIFI。幸運的是在API 21 ( Android 5.0,即Lollipop )中,google提供了一個新叫做JobScheduler API的元件來處理這樣的場景。

當一系列預置的條件被滿足時,JobScheduler API為你的應用執行一個操作。與AlarmManager不同的是這個執行時間是不確定的。除此之外,JobScheduler API允許同時執行多個任務。這允許你的應用執行某些指定的任務時不需要考慮時機控制引起的電池消耗。

這篇文章中,你會學到關於JobScheduler API更多的東西以及在你的應用中用於執行一個簡單的後臺任務的JobService,這篇文章中所展示的程式碼你都可以在github中找到。

1. 建立Job Service

首先,你需要建立一個API最低為21的Android專案,因此JobScheduler是最近的版本才加入Android的,在寫這篇文章的時候,它還沒有相容庫支援。

假定你使用的是Android Studio,當你點選了建立專案的完成按鈕之後,你會得到一個”hello world”的應用骨架。你要做的第一步就是建立一個新的java類。為了簡單起見,讓我們建立一個繼承自JobService且名字為JobSchedulerService的類,這個類必須實現兩個方法,分別是onStartJob(JobParameters params)onStopJob(JobParameters params)

public class JobSchedulerService extends JobService {    @Override    public boolean onStartJob(JobParameters params) {        return false;    }    @Override    public boolean onStopJob(JobParameters params) {        return false;    }}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

當任務開始時會執行onStartJob(JobParameters params)方法,因為這是系統用來觸發已經被執行的任務。正如你所看到的,這個方法返回一個boolean值。如果返回值是false,系統假設這個方法返回時任務已經執行完畢。如果返回值是true,那麼系統假定這個任務正要被執行,執行任務的重擔就落在了你的肩上。當任務執行完畢時你需要呼叫jobFinished(JobParameters params, boolean needsRescheduled)來通知系統。

當系統接收到一個取消請求時,系統會呼叫onStopJob(JobParameters params)方法取消正在等待執行的任務。很重要的一點是如果onStartJob(JobParameters params)返回false,那麼系統假定在接收到一個取消請求時已經沒有正在執行的任務。換句話說,onStopJob(JobParameters params)在這種情況下不會被呼叫。

需要注意的是這個job service執行在你的主執行緒,這意味著你需要使用子執行緒,handler, 或者一個非同步任務來執行耗時的操作以防止阻塞主執行緒。因為多執行緒技術已經超出了我們這篇文章的範圍,讓我們簡單實現一個Handlder來執行我們在JobSchedulerService定義的任務吧。

private Handler mJobHandler = new Handler( new Handler.Callback() {    @Override    public boolean handleMessage( Message msg ) {        Toast.makeText( getApplicationContext(),             "JobService task running", Toast.LENGTH_SHORT )            .show();        jobFinished( (JobParameters) msg.obj, false );        return true;    }} );
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在Handler中,你需要實現handleMessage(Message msg)方法來處理你的任務邏輯。在這個例子中,我們儘量保證例子簡單,因此我們只在handleMessage(Message msg)中顯示了一個Toast,這裡就是你要寫你的任務邏輯( 耗時操作 )的地方,比如同步資料等。

當任務執行完畢之後,你需要呼叫jobFinished(JobParameters params, boolean needsRescheduled)來讓系統知道這個任務已經結束,系統可以將下一個任務新增到佇列中。如果你沒有呼叫jobFinished(JobParameters params, boolean needsRescheduled),你的任務只會執行一次,而應用中的其他任務就不會被執行。

jobFinished(JobParameters params, boolean needsRescheduled)的兩個引數中的params引數是從JobService的onStartJob(JobParameters params)的params傳遞過來的,needsRescheduled引數是讓系統知道這個任務是否應該在最處的條件下被重複執行。這個boolean值很有用,因為它指明瞭你如何處理由於其他原因導致任務執行失敗的情況,例如一個失敗的網路請求呼叫。

建立了Handler例項之後,你就可以實現onStartJob(JobParameters params)onStopJob(JobParameters params)方法來控制你的任務了。你可能已經注意到在下面的程式碼片段中onStartJob(JobParameters params)返回了true。這是因為你要通過Handler例項來控制你的操作,

這意味著Handler的handleMessage方法的執行時間可能比onStartJob(JobParameters params)更長。返回true,你會讓系統知道你會手動地呼叫jobFinished(JobParameters params, boolean needsRescheduled)方法。

@Overridepublic boolean onStartJob(JobParameters params) {    mJobHandler.sendMessage( Message.obtain( mJobHandler, 1, params ) );    return true;}@Overridepublic boolean onStopJob(JobParameters params) {    mJobHandler.removeMessages( 1 );    return false;}
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

一旦你在Java部分做了上述工作之後,你需要到AndroidManifest.xml中新增一個service節點讓你的應用擁有繫結和使用這個JobService的許可權。

<service android:name=".JobSchedulerService"    android:permission="android.permission.BIND_JOB_SERVICE" />
   
  • 1
  • 2

2. 建立一個JobScheduler物件

隨著JobSchedulerService構建完畢,我們可以開始研究你的應用如何與JobScheduler API進行互動了。第一件要做的事就是你需要建立一個JobScheduler物件,在例項程式碼的MainActivity中我們通過getSystemService( Context.JOB_SCHEDULER_SERVICE )初始化了一個叫做mJobScheduler的JobScheduler物件。

mJobScheduler = (JobScheduler)     getSystemService( Context.JOB_SCHEDULER_SERVICE );
   
  • 1
  • 2

當你想建立定時任務時,你可以使用JobInfo.Builder來構建一個JobInfo物件,然後傳遞給你的Service。JobInfo.Builder接收兩個引數,第一個引數是你要執行的任務的識別符號,第二個是這個Service元件的類名。

JobInfo.Builder builder = new JobInfo.Builder( 1,        new ComponentName( getPackageName(),             JobSchedulerService.class.getName() ) );
   
  • 1
  • 2
  • 3

這個builder允許你設定很多不同的選項來控制任務的執行。下面的程式碼片段就是展示瞭如何設定以使得你的任務可以每隔三秒執行一次。

builder.setPeriodic( 3000 );
   
  • 1

其他設定方法 :

  • setMinimumLatency(long minLatencyMillis): 這個函式能讓你設定任務的延遲執行時間(單位是毫秒),這個函式與setPeriodic(long time)方法不相容,如果這兩個方法同時呼叫了就會引起異常;
  • setOverrideDeadline(long maxExecutionDelayMillis):
    這個方法讓你可以設定任務最晚的延遲時間。如果到了規定的時間時其他條件還未滿足,你的任務也會被啟動。與setMinimumLatency(long time)一樣,這個方法也會與setPeriodic(long time),同時呼叫這兩個方法會引發異常。
  • setPersisted(boolean isPersisted):
    這個方法告訴系統當你的裝置重啟之後你的任務是否還要繼續執行。
  • setRequiredNetworkType(int networkType):
    這個方法讓你這個任務只有在滿足指定的網路條件時才會被執行。預設條件是JobInfo.NETWORK_TYPE_NONE,這意味著不管是否有網路這個任務都會被執行。另外兩個可選型別,一種是JobInfo.NETWORK_TYPE_ANY,它表明需要任意一種網路才使得任務可以執行。另一種是JobInfo.NETWORK_TYPE_UNMETERED,它表示裝置不是蜂窩網路( 比如在WIFI連線時 )時任務才會被執行。
  • setRequiresCharging(boolean requiresCharging):
    這個方法告訴你的應用,只有當裝置在充電時這個任務才會被執行。
  • setRequiresDeviceIdle(boolean requiresDeviceIdle):
    這個方法告訴你的任務只有當用戶沒有在使用該裝置且有一段時間沒有使用時才會啟動該任務。

需要注意的是setRequiredNetworkType(int networkType), setRequiresCharging(boolean requireCharging) and setRequiresDeviceIdle(boolean requireIdle)者幾個方法可能會使得你的任務無法執行,除非呼叫setOverrideDeadline(long time)設定了最大延遲時間,使得你的任務在為滿足條件的情況下也會被執行。一旦你預置的條件被設定,你就可以構建一個JobInfo物件,然後通過如下所示的程式碼將它傳送到你的JobScheduler中。

if( mJobScheduler.schedule( builder.build() ) <= 0 ) {    //If something goes wrong}
   
  • 1
  • 2
  • 3

你可能注意到了,這個schedule方法會返回一個整型。如果schedule方法失敗了,它會返回一個小於0的錯誤碼。否則它會我們在JobInfo.Builder中定義的標識id。

如果你的應用想停止某個任務,你可以呼叫JobScheduler物件的cancel(int jobId)來實現;如果你想取消所有的任務,你可以呼叫JobScheduler物件的cancelAll()來實現。

mJobScheduler.cancelAll();
   
  • 1

到了這裡,你現在應該已經知道如何在你的應用中使用JobScheduler API來執行批量任務和後臺操作了。

結論

這篇文章中,你學會了怎麼實現一個使用Handler物件來執行後臺任務的JobService子類,你也學會了如何使用JobInfo.Builder來設定JobService。掌握了這些之後,你可以在減少資源消耗的同時提升應用的效率。

更多文章

更多優秀文章請猛擊android-tech-frontier

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述 你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。

新的改變

我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:

  1. 全新的介面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支援甘特圖的mermaid語法1 功能;
  6. 增加了 多螢幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G

合理的建立標題,有助於目錄的生成

直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC語法後生成一個完美的目錄。

如何改變文字的樣式

強調文字 強調文字

加粗文字 加粗文字

標記文字

刪除文字

引用文字

H2O is是液體。

210 運算結果是 1024.

插入連結與圖片

連結: link.

圖片: Alt

帶尺寸的圖片: Alt

當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的程式碼片

部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片.

// An highlighted block var foo = 'bar'; 

生成一個適合你的列表

  • 專案
    • 專案
      • 專案
  1. 專案1
  2. 專案2
  3. 專案3
  • 計劃任務
  • 完成任務

建立一個表格

一個簡單的表格是這麼建立的:

專案 Value
電腦 $1600
手機 $12
導管 $1

設定內容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列 第二列 第三列
第一列文字居中 第二列文字居右 第三列文字居左

SmartyPants

SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:

TYPE ASCII HTML
Single backticks 'Isn't this fun?' ‘Isn’t this fun?’
Quotes "Isn't this fun?" “Isn’t this fun?”
Dashes -- is en-dash, --- is em-dash – is en-dash, — is em-dash

建立一個自定義列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何建立一個註腳

一個具有註腳的文字。2

註釋也是必不可少的

Markdown將文字轉換為 HTML

KaTeX數學公式

您可以使用渲染LaTeX數學表示式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過尤拉積分

Γ ( z ) = 0 t z 1 e t d t &ThinSpace; . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的資訊 LaTeX 數學表示式here.

新的甘特圖功能,豐富你的文章

gantt
        dateFormat  YYYY-MM-DD
        title Adding GANTT diagram functionality to mermaid
        section 現有任務
        已完成               :done,    des1, 2014-01-06,2014-01-08
        進行中               :active,  des2, 2014-01-09, 3d
        計劃一               :         des3, after des2, 5d
        計劃二               :         des4, after des3, 5d
  • 關於 甘特圖 語法,參考 這兒,

UML 圖表

可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::

這將產生一個流程圖。:

  • 關於 Mermaid 語法,參考 這兒,

FLowchart流程圖

我們依舊會支援flowchart的流程圖:

  • 關於 Flowchart流程圖 語法,參考 這兒.

匯出與匯入

匯出

如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。

匯入

如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎