您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關JobScheduler如何在Android5.0中使用,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
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; } }
當任務開始時會執行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; } } );
在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)方法。
@Override public boolean onStartJob(JobParameters params) { mJobHandler.sendMessage( Message.obtain( mJobHandler, 1, params ) ); return true; } @Override public boolean onStopJob(JobParameters params) { mJobHandler.removeMessages( 1 ); return false; }
一旦你在Java部分做了上述工作之后,你需要到AndroidManifest.xml中添加一個service節點讓你的應用擁有綁定和使用這個JobService的權限。
<service android:name=".JobSchedulerService" android:permission="android.permission.BIND_JOB_SERVICE" />
2. 創建一個JobScheduler對象
隨著JobSchedulerService構建完畢,我們可以開始研究你的應用如何與JobScheduler API進行交互了。第一件要做的事就是你需要創建一個JobScheduler對象,在實例代碼的MainActivity中我們通過getSystemService( Context.JOB_SCHEDULER_SERVICE )初始化了一個叫做mJobScheduler的JobScheduler對象。
mJobScheduler = (JobScheduler) getSystemService( Context.JOB_SCHEDULER_SERVICE );
當你想創建定時任務時,你可以使用JobInfo.Builder來構建一個JobInfo對象,然后傳遞給你的Service。JobInfo.Builder接收兩個參數,第一個參數是你要運行的任務的標識符,第二個是這個Service組件的類名。
JobInfo.Builder builder = new JobInfo.Builder( 1, new ComponentName( getPackageName(), JobSchedulerService.class.getName() ) );
這個builder允許你設置很多不同的選項來控制任務的執行。下面的代碼片段就是展示了如何設置以使得你的任務可以每隔三秒運行一次。
builder.setPeriodic( 3000 );
其他設置方法 :
•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 }
你可能注意到了,這個schedule方法會返回一個整型。如果schedule方法失敗了,它會返回一個小于0的錯誤碼。否則它會我們在JobInfo.Builder中定義的標識id。
如果你的應用想停止某個任務,你可以調用JobScheduler對象的cancel(int jobId)來實現;如果你想取消所有的任務,你可以調用JobScheduler對象的cancelAll()來實現。
mJobScheduler.cancelAll();
到了這里,你現在應該已經知道如何在你的應用中使用JobScheduler API來執行批量任務和后臺操作了。
上述就是小編為大家分享的JobScheduler如何在Android5.0中使用了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。