1 /* 2 * Copyright 2014 Google Inc. 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.example.android.jobscheduler.service; 18 19 import android.app.job.JobInfo; 20 import android.app.job.JobScheduler; 21 import android.app.job.JobParameters; 22 import android.app.job.JobService; 23 import android.content.Context; 24 import android.content.Intent; 25 import android.os.Message; 26 import android.os.Messenger; 27 import android.os.RemoteException; 28 import android.util.Log; 29 30 import com.example.android.jobscheduler.MainActivity; 31 32 import java.util.LinkedList; 33 34 35 /** 36 * Service to handle callbacks from the JobScheduler. Requests scheduled with the JobScheduler 37 * ultimately land on this service's "onStartJob" method. Currently all this does is post a message 38 * to the app's main activity to change the state of the UI. 39 */ 40 public class TestJobService extends JobService { 41 private static final String TAG = "SyncService"; 42 43 @Override onCreate()44 public void onCreate() { 45 super.onCreate(); 46 Log.i(TAG, "Service created"); 47 } 48 49 @Override onDestroy()50 public void onDestroy() { 51 super.onDestroy(); 52 Log.i(TAG, "Service destroyed"); 53 } 54 55 /** 56 * When the app's MainActivity is created, it starts this service. This is so that the 57 * activity and this service can communicate back and forth. See "setUiCalback()" 58 */ 59 @Override onStartCommand(Intent intent, int flags, int startId)60 public int onStartCommand(Intent intent, int flags, int startId) { 61 Messenger callback = intent.getParcelableExtra("messenger"); 62 Message m = Message.obtain(); 63 m.what = MainActivity.MSG_SERVICE_OBJ; 64 m.obj = this; 65 try { 66 callback.send(m); 67 } catch (RemoteException e) { 68 Log.e(TAG, "Error passing service object back to activity."); 69 } 70 return START_NOT_STICKY; 71 } 72 73 @Override onStartJob(JobParameters params)74 public boolean onStartJob(JobParameters params) { 75 // We don't do any real 'work' in this sample app. All we'll 76 // do is track which jobs have landed on our service, and 77 // update the UI accordingly. 78 jobParamsMap.add(params); 79 if (mActivity != null) { 80 mActivity.onReceivedStartJob(params); 81 } 82 Log.i(TAG, "on start job: " + params.getJobId()); 83 return true; 84 } 85 86 @Override onStopJob(JobParameters params)87 public boolean onStopJob(JobParameters params) { 88 // Stop tracking these job parameters, as we've 'finished' executing. 89 jobParamsMap.remove(params); 90 if (mActivity != null) { 91 mActivity.onReceivedStopJob(); 92 } 93 Log.i(TAG, "on stop job: " + params.getJobId()); 94 return true; 95 } 96 97 MainActivity mActivity; 98 private final LinkedList<JobParameters> jobParamsMap = new LinkedList<JobParameters>(); 99 setUiCallback(MainActivity activity)100 public void setUiCallback(MainActivity activity) { 101 mActivity = activity; 102 } 103 104 /** Send job to the JobScheduler. */ scheduleJob(JobInfo t)105 public void scheduleJob(JobInfo t) { 106 Log.d(TAG, "Scheduling job"); 107 JobScheduler tm = 108 (JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE); 109 tm.schedule(t); 110 } 111 112 /** 113 * Not currently used, but as an exercise you can hook this 114 * up to a button in the UI to finish a job that has landed 115 * in onStartJob(). 116 */ callJobFinished()117 public boolean callJobFinished() { 118 JobParameters params = jobParamsMap.poll(); 119 if (params == null) { 120 return false; 121 } else { 122 jobFinished(params, false); 123 return true; 124 } 125 } 126 127 } 128