0

我的应用面向 Android 7,最低 SDK 为 Android 4。

因此,收听CONNECTIVITY_CHANGE(即使应用程序被杀死)不再起作用。我想做的是

  1. 即使我的主应用程序被杀死,当互联网连接从“不可用”变为“可用”时,我也想启动一个警报广播接收器。

我尝试使用以下代码来实现

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);
}

然而,

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;
    }
}

但是,上面的代码并不可靠。我如何测试是

  1. 退出我的应用程序。
  2. 使用“强制停止”通过设置明确终止我的应用程序。
  3. 关闭互联网。
  4. 打开互联网。
  5. 等待几分钟。MyJobService永远不会被执行。

有什么可靠的方法可以使用 FirebaseJobDispatcher 可靠地替换 CONNECTIVITY_CHANGE 吗?

我已经使用了Firebase JobDispatcher - 与以前的 API(JobScheduler 和 GcmTaskService)相比,它是如何工作的?,但我仍然找不到让它可靠工作的方法。

4

1 回答 1

0

不确定您是如何通过 FirebaseJobDispatcher 检测 CONNECTIVITY_CHANGE 但对于我使用广播的相同情况

public class ConnectivityStateReceiver extends BroadcastReceiver {
String TAG = "MyApp";

@Override
public void onReceive(Context context, Intent intent) {

    Intent serviceIntent = new Intent(context, NetworkService.class);

    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (cm == null) {
        return;
    } else if (cm.getActiveNetworkInfo() != null && cm.getActiveNetworkInfo().isConnected()) {
        Log.e(TAG, "Connected!");
        context.startService(serviceIntent);
    } else {
        Log.e(TAG, "Not Connected!");
        context.stopService(serviceIntent);
    }
}

}

于 2017-05-21T11:41:52.267 回答