How to use FirebaseJobDispatcher to replace CONNECTIVITY_CHANGE reliably

303 views
Skip to first unread message

Yan Cheng Cheok

unread,
May 21, 2017, 10:26:14 AM5/21/17
to Firebase Google Group

My app is targeting Android 7, with minimum SDK Android 4.


Hence, listening to CONNECTIVITY_CHANGE (Even when the app is killed) no longer work anymore. What I wish to do is

  1. Even when my main app is killed, when the internet connectivity change from "not available" to "available", I would like to start an alarm broadcast receiver.

I try to achieve with the following code


MainActivity.java


@Override
public void onPause() {
    super.onPause();
    installJobService();
}

private void installJobService() {
    // Create a new dispatcher using the Google Play driver.
    FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(this));

    Job myJob = dispatcher.newJobBuilder()
            // the JobService that will be called
            .setService(MyJobService.class)
            // uniquely identifies the job
            .setTag("my-unique-tag")
            // one-off job
            .setRecurring(true)
            // persist forever
            .setLifetime(Lifetime.FOREVER)
            // start between 0 and 60 seconds from now
            .setTrigger(Trigger.executionWindow(0, 60))
            // overwrite an existing job with the same tag
            .setReplaceCurrent(true)
            // retry with exponential backoff
            .setRetryStrategy(RetryStrategy.DEFAULT_EXPONENTIAL)
            // constraints that need to be satisfied for the job to run
            .setConstraints(
                    // only run on any network
                    Constraint.ON_ANY_NETWORK
            )
            .build();

    dispatcher.mustSchedule(myJob);
}

However,


MyJobService.java


import android.content.Context;

import com.firebase.jobdispatcher.JobParameters;
import com.firebase.jobdispatcher.JobService;

import org.yccheok.jstock.gui.JStockApplication;

/**
 * Created by yccheok on 21/5/2017.
 */

public class MyJobService extends JobService {
    @Override
    public boolean onStartJob(JobParameters jobParameters) {
        Context context = this.getApplicationContext();

        android.util.Log.i("CHEOK", "Internet -> " + Utils.isInternetAvailable(context));

        // Answers the question: "Is there still work going on?"
        return false;
    }

    @Override
    public boolean onStopJob(JobParameters jobParameters) {
        // Answers the question: "Should this job be retried?"
        return true;
    }
}

However, the above code isn't reliable. How I test is

  1. Quit my app.
  2. Kill my app explicitly via Settings using "Force stop".
  3. Turn off internet.
  4. Turn on internet.
  5. Wait for few minutes. MyJobService is never executed.

Is there any reliable way, to use FirebaseJobDispatcher to replace CONNECTIVITY_CHANGE reliably?


I had gone through Firebase JobDispatcher - how does it work compared to previous APIs (JobScheduler and GcmTaskService)? , but I still can't find a way to make it work reliably.

Reply all
Reply to author
Forward
0 new messages