Slide 1

Slide 1 text

JobScheduler is the Unavoidable Better Future Eric Cochran Droidcon NYC September 29, 2016

Slide 2

Slide 2 text

Credit @volumedownpower

Slide 3

Slide 3 text

3 Some explanatory text to introduce the theme of the deck and such. AlarmManager AlarmManager manager = (AlarmManager) context.getSystemService(ALARM_SERVICE);
 Intent intent = new Intent(context, SyncJobService.class);
 manager.setInexactRepeating(ELAPSED_REALTIME,
 SystemClock.elapsedRealtime() + INTERVAL_MILLIS, INTERVAL_MILLIS,
 PendingIntent.getService(context, REQUEST_CODE, intent, FLAG_CANCEL_CURRENT));

Slide 4

Slide 4 text

4 Some explanatory text to introduce the theme of the deck and such. AlarmManager public final class RescheduleAlarmsReceiver extends BroadcastReceiver {
 @Override public void onReceive(Context context, Intent intent) {
 // Reschedule.
 }
 } 
 
 
 


Slide 5

Slide 5 text

5 AlarmManager Persistence? Failures and retries?

Slide 6

Slide 6 text

6 Some explanatory text to introduce the theme of the deck and such. Broadcasts android.net.conn.CONNECTIVITY_CHANGE android.hardware.action.NEW_PICTURE android.hardware.action.NEW_VIDEO and more…

Slide 7

Slide 7 text

7 Context-aware Reduce complexity JobScheduler

Slide 8

Slide 8 text

8 JobInfo.Builder exponential backoff persisted across reboots maximum delay charging network type device idle Creating a Job

Slide 9

Slide 9 text

9 JobInfo.Builder addTriggerContentUri (android.hardware.action.NEW_PICTURE) Creating a Job

Slide 10

Slide 10 text

10 JobScheduler scheduler = (JobScheduler) context.getSystemService(JOB_SCHEDULER_SERVICE);
 ComponentName jobService = new ComponentName(context, SyncJobService.class);
 JobInfo job = new JobInfo.Builder(jobId, jobService)
 /*
 More options here.
 */
 .build();
 scheduler.schedule(job); JobScheduler

Slide 11

Slide 11 text

11 public final class SyncJobService extends JobService {
 @Override public boolean onStartJob(final JobParameters params) {
 // Wakelock held.
 // Run on main thread.
 final AtomicBoolean moreWorkToBeDone = new AtomicBoolean(true);
 work.enqueue(new Callback() {
 @Override result(boolean success) {
 moreWorkToBeDone.set(false);
 boolean needsReschedule = !success; // Wakelock released.
 jobFinished(params, needsReschedule);
 }
 });
 return moreWorkToBeDone.get();
 }
 
 @Override public boolean onStopJob(JobParameters params) {
 // Wakelock released.
 boolean reschedule = true;
 return reschedule;
 }
 } JobScheduler

Slide 12

Slide 12 text

12 JobScheduler

Slide 13

Slide 13 text

13 For more than Lollipop GcmNetworkManager

Slide 14

Slide 14 text

14 new PeriodicTask.Builder()
 .setService(SyncTaskService.class)
 .setTag(jobId)
 .setUpdateCurrent(true) // Override existing task with equal tag.
 .setPersisted(true) // Requires permission, of course.
 .setRequiredNetwork(NETWORK_STATE_UNMETERED)
 .setRequiresCharging(true)
 .setPeriod(INTERVAL_SECONDS) // Required. In seconds.
 .build(); GcmNetworkManager

Slide 15

Slide 15 text

15 new OneoffTask.Builder()
 .setService(SyncTaskService.class)
 .setTag(jobId)
 .setExecutionWindow(0, 60); // Required. In seconds. .build(); GcmNetworkManager

Slide 16

Slide 16 text

16 
 
 
 
 GcmNetworkManager

Slide 17

Slide 17 text

17 public final class SyncTaskService extends GcmTaskService {
 @Override public int onRunTask(TaskParams taskParams) {
 // Wake lock held for about three minutes.
 // Run on background thread. Must be thread-safe.
 boolean success = work.execute();
 if (success) {
 return RESULT_SUCCESS;
 }
 return useBackoffReschedule ? RESULT_RESCHEDULE : RESULT_FAILURE;
 }
 
 @Override public void onInitializeTasks() {
 // Run on main thread after GPS or app update.
 // Reschedule all Tasks.
 }
 } GcmNetworkManager

Slide 18

Slide 18 text

18 What about Firebase JobDispatcher? Pluggable Drivers to wrap GCM, JobScheduler, AlarmManager, etc. But, almost certainly abandoned without a DEPRECATED label.

Slide 19

Slide 19 text

19 JS JobScheduler vs GCM Network Manager GCM API 21+ Configurable initial backoff and linear or exponential backoff Persistent More configurable and suitable for wide range of usecases Devices with Google Play Services Exponential backoff Requires persistent backing data to reschedule after update Targeted at quick network requests

Slide 20

Slide 20 text

20 Great Abstraction for Tasks. Not a Perfect Transition from Broadcasts.

Slide 21

Slide 21 text

21 @Eric_Cochran github.com/NightlyNexus nightlynexus.com