| /* |
| * Copyright 2014 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.example.android.jobscheduler.service; |
| |
| import android.app.job.JobParameters; |
| import android.app.job.JobService; |
| import android.content.Intent; |
| import android.os.Handler; |
| import android.os.Message; |
| import android.os.Messenger; |
| import android.os.RemoteException; |
| import android.support.annotation.Nullable; |
| import android.util.Log; |
| |
| |
| import static com.example.android.jobscheduler.MainActivity.MESSENGER_INTENT_KEY; |
| import static com.example.android.jobscheduler.MainActivity.MSG_COLOR_START; |
| import static com.example.android.jobscheduler.MainActivity.MSG_COLOR_STOP; |
| import static com.example.android.jobscheduler.MainActivity.WORK_DURATION_KEY; |
| |
| |
| /** |
| * Service to handle callbacks from the JobScheduler. Requests scheduled with the JobScheduler |
| * ultimately land on this service's "onStartJob" method. It runs jobs for a specific amount of time |
| * and finishes them. It keeps the activity updated with changes via a Messenger. |
| */ |
| public class MyJobService extends JobService { |
| |
| private static final String TAG = MyJobService.class.getSimpleName(); |
| |
| private Messenger mActivityMessenger; |
| |
| @Override |
| public void onCreate() { |
| super.onCreate(); |
| Log.i(TAG, "Service created"); |
| } |
| |
| @Override |
| public void onDestroy() { |
| super.onDestroy(); |
| Log.i(TAG, "Service destroyed"); |
| } |
| |
| /** |
| * When the app's MainActivity is created, it starts this service. This is so that the |
| * activity and this service can communicate back and forth. See "setUiCallback()" |
| */ |
| @Override |
| public int onStartCommand(Intent intent, int flags, int startId) { |
| mActivityMessenger = intent.getParcelableExtra(MESSENGER_INTENT_KEY); |
| return START_NOT_STICKY; |
| } |
| |
| @Override |
| public boolean onStartJob(final JobParameters params) { |
| // The work that this service "does" is simply wait for a certain duration and finish |
| // the job (on another thread). |
| |
| sendMessage(MSG_COLOR_START, params.getJobId()); |
| |
| long duration = params.getExtras().getLong(WORK_DURATION_KEY); |
| |
| // Uses a handler to delay the execution of jobFinished(). |
| Handler handler = new Handler(); |
| handler.postDelayed(new Runnable() { |
| @Override |
| public void run() { |
| sendMessage(MSG_COLOR_STOP, params.getJobId()); |
| jobFinished(params, false); |
| } |
| }, duration); |
| Log.i(TAG, "on start job: " + params.getJobId()); |
| |
| // Return true as there's more work to be done with this job. |
| return true; |
| } |
| |
| @Override |
| public boolean onStopJob(JobParameters params) { |
| // Stop tracking these job parameters, as we've 'finished' executing. |
| sendMessage(MSG_COLOR_STOP, params.getJobId()); |
| Log.i(TAG, "on stop job: " + params.getJobId()); |
| |
| // Return false to drop the job. |
| return false; |
| } |
| |
| private void sendMessage(int messageID, @Nullable Object params) { |
| // If this service is launched by the JobScheduler, there's no callback Messenger. It |
| // only exists when the MainActivity calls startService() with the callback in the Intent. |
| if (mActivityMessenger == null) { |
| Log.d(TAG, "Service is bound, not started. There's no callback to send a message to."); |
| return; |
| } |
| Message m = Message.obtain(); |
| m.what = messageID; |
| m.obj = params; |
| try { |
| mActivityMessenger.send(m); |
| } catch (RemoteException e) { |
| Log.e(TAG, "Error passing service object back to activity."); |
| } |
| } |
| } |