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