天天看點

Android電量優化(3)——JobScheduler合并任務流JobScheduler合并任務流

JobScheduler合并任務流

在我們開發的過程中,我們會遇到這樣一種場景,如上傳定位資訊、同步個人資訊、同步聯系人,這些任務并不需要即時處理,需要在特定的場景調用,如連接配接wifi、充電時調用。還有一種場景是任務達到一定的數量之後再調用

這時候我們可以使用JobScheduler來實作合并工作流并在合适的時間執行

例子

這裡提供一個例子:https://github.com/ddssingsong/JobManager

源碼下載下傳:https://download.csdn.net/download/u011077027/11241799

開啟一個背景Service不停的調用定位,定位成功之後上傳到伺服器,這裡需要将多個定位結果合并起來并在連接配接wifi的時候進行上傳

開始

public class JobManager {
    public static final String TAG = "dds_JobManager";
    private static JobManager instance;
    private JobScheduler jobScheduler;
    private Context context;

    private static final int jobId = 0; // 任務ID

    public static JobManager getInstance() {
        if (null == instance)
            instance = new JobManager();
        return instance;
    }

    public void init(Context context) {
        this.context = context.getApplicationContext();
        jobScheduler = (JobScheduler)
                context.getSystemService(Context.JOB_SCHEDULER_SERVICE);

    }

    /**
     * 添加一個任務
     *
     * @param location 需要發送的内容
     */
    public void addJob(String location) {
        if (null == jobScheduler) {
            return;
        }
        JobInfo pendingJob = null;
        //整合多個job,7.0之上和之下不太一樣
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            pendingJob = jobScheduler.getPendingJob(jobId);
        } else {
            List<JobInfo> allPendingJobs = jobScheduler.getAllPendingJobs();
            for (JobInfo info : allPendingJobs) {
                if (info.getId() == jobId) {
                    pendingJob = info;
                    break;
                }
            }
        }
        //找到待執行的job
        if (null != pendingJob) {
            //多個坐标資訊拼到一起 上傳
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                //資料 與Intent 一樣
                PersistableBundle extras = pendingJob.getExtras();
                //獲得上一次設定的location資料
                String data = extras.getString("DATA");
                //比如 多條坐标資料用@隔開
                location = data + "@" + location;
                jobScheduler.cancel(jobId);
            }
        }
        PersistableBundle extras = new PersistableBundle();
        extras.putString("DATA", location);
        //建立一個job
        JobInfo jobInfo = new
                JobInfo.Builder(jobId,
                new ComponentName(context, MyJobService.class))
                //隻在充電的時候
                .setRequiresCharging(true)
                //不是蜂窩網絡
                .setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED)
                .setExtras(extras).build();

        //送出任務
        Log.e(TAG, "送出任務");
        jobScheduler.schedule(jobInfo);
    }

}
           
public class MyJobService extends JobService {

    public static final String TAG = "dds_MyJobService";

    @Override
    public boolean onStartJob(JobParameters params) {
        new MyAsyncTask(this).execute(params);
        return true;
    }

    //當系統接收到一個取消請求時
    @Override
    public boolean onStopJob(JobParameters params) {
        //如果onStartJob傳回false,那麼onStopJob不會被調用
        // 傳回 true 則會重新計劃這個job
        return false;
    }

    static class MyAsyncTask extends AsyncTask<JobParameters, Void, Void> {
        private JobParameters jobParameters;
        private WeakReference<MyJobService> myJobServiceWeakReference;

        public MyAsyncTask(MyJobService myJobService) {
            myJobServiceWeakReference = new WeakReference<>(myJobService);
        }

        @Override
        protected Void doInBackground(JobParameters[] objects) {
            jobParameters = objects[0];
            Log.i(TAG, jobParameters.getJobId() + " 任務開始執行......");
            PersistableBundle extras = jobParameters.getExtras();
            String location = extras.getString("DATA");
            Log.i(TAG, jobParameters.getJobId() + " 上傳:" + location);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }

         */
        @Override
        protected void onPostExecute(Void s) {
            //true表示需要重複執行
            //false反之
            myJobServiceWeakReference.get().jobFinished(jobParameters, false);
            Log.i(TAG, jobParameters.getJobId() + "任務執行完成......");
        }
    }
           

繼續閱讀