我的应用以 Android 7 为目标平台,最低为 SDK Android 4。
因此,收听CONNECTIVITY_CHANGE
(即使应用程序被杀死)不再有效。我想做的是
- 即使我的主要应用程序被杀死,当互联网连接从"不可用"变为"可用"时,我也想启动警报广播接收器。
我尝试使用以下代码实现
主要活动.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);
}
然而
我的就业服务.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;
}
}
但是,上面的代码并不可靠。我如何测试是
- 退出我的应用。
- 使用"强制停止"通过"设置"明确终止我的应用程序。
- 关闭互联网。
- 打开互联网。
- 等待几分钟。
MyJobService
永远不会执行。
有没有可靠的方法,使用FirebaseJobDispatcher可靠地替换CONNECTIVITY_CHANGE?
我曾经使用过Firebase JobDispatcher - 与以前的API(JobScheduler和GcmTaskService)相比,它是如何工作的?但我仍然找不到一种方法来使其可靠地工作。
不确定您如何通过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);
}
}
}