天天看點

Android 基礎知識之JobScheduler基本使用

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);//不允許電量低的情況下運作。