1.導讀
在實際的開發過程中,你可能需要滿足特定情況下,比如聯網,充電,執行相應的操作
2.綁定服務
JobService 繼承于service ,是以也需要在manifest中綁定。在綁定時要加上找個權限
<service
android:name=".MyJob"
android:permission="android.permission.BIND_JOB_SERVICE" />
否則會報錯下面的錯誤。
Caused by: java.lang.IllegalArgumentException: Scheduled service ComponentInfo{iflytek.com.jobschedulertest/iflytek.com.jobschedulertest.MyJob} does not require android.permission.BIND_JOB_SERVICE permission
3.實作
-
建立一個JobService,當任務開始時會執行onStartJob,參數是通過JobScheduler傳過來的,傳回值時Boolean型,傳回為true,表示找個job繼續執行,除非不滿條件或者調用jobFinished,傳回false表示結束job。傳回值在設定時還有比較有迷惑性的,若是你想設定每個5s執行一次,找個傳回值就要設定false,為什麼呢?因為傳回false說明目前任務完成了,需要進行下次的job。
MyJobService類
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
Toast.makeText(getApplicationContext(), "JobService task running " + params.getExtras().getString("key"), Toast.LENGTH_SHORT).show();
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
@RequiresApi(api = Build.VERSION_CODES.O)
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startS();
}
@TargetApi(Build.VERSION_CODES.O)
private void startS() {
JobScheduler mJobScheduler = (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
JobInfo.Builder jobInfo = new JobInfo.Builder(1, new ComponentName(getPackageName(), MyJobService.class.getName()));
PersistableBundle persistableBundle = new PersistableBundle();
persistableBundle.putString("key", "JobService");
jobInfo.setPeriodic(1000 * 6);//每個6s發送一次
jobInfo.setPersisted(true);//重新開機後保留任務
jobInfo.setExtras(persistableBundle);//傳輸資料
jobInfo.setRequiresCharging(false);//不充電
jobInfo.etRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);//任意網絡
mJobScheduler.schedule(jobInfo.build());
}
}
JobScheduler 是通過系統服務來擷取的 getSystemService(Context.JOB_SCHEDULER_SERVICE),通過JobInfo來設定相應的配置資訊,來完成任務。
在Android 8.0時,需要設定 jobInfo.setPeriodic(1000 * 60*15),必須設定15分鐘才行能執行,從源碼中可以看出來,否則不執行。
jobInfo.setPeriodic(1000 * 6);//每個6s發送一次
jobInfo.setPersisted(true);//重新開機後保留任務
jobInfo.setExtras(persistableBundle);//傳輸資料
jobInfo.setRequiresCharging(false);//不充電
jobInfo.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);//任意網絡
jobInfo.setsetRequiresDeviceIdle(true);//設定是否空閑使用
jobInfo.setRequiresBatteryNotLow(true);//不允許電量低的情況下運作。
…