首先,我知道
我的问题是,当手机连接/断开网络时,我想执行一些代码。这应该在应用程序处于后台时发生。从Android O开始,如果要在后台运行服务,必须显示通知,而我想避免这种情况。我尝试使用
我的JobService:
ConnectivityManager.CONNECTIVITY_ACTION
已经被弃用,并且我知道如何使用connectivityManager.registerNetworkCallback
。此外,我也了解JobScheduler
,但我不确定自己是否理解正确。我的问题是,当手机连接/断开网络时,我想执行一些代码。这应该在应用程序处于后台时发生。从Android O开始,如果要在后台运行服务,必须显示通知,而我想避免这种情况。我尝试使用
JobScheduler/JobService
API获取手机连接/断开连接的信息,但它只在我安排它的时间执行。对我来说,似乎无法在此类事件发生时运行代码。有没有办法实现这一点?我可能只需要稍微调整一下我的代码吗?我的JobService:
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public class ConnectivityBackgroundServiceAPI21 extends JobService {
@Override
public boolean onStartJob(JobParameters jobParameters) {
LogFactory.writeMessage(this, LOG_TAG, "Job was started");
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetwork = connectivityManager.getActiveNetworkInfo();
if (activeNetwork == null) {
LogFactory.writeMessage(this, LOG_TAG, "No active network.");
}else{
// Here is some logic consuming whether the device is connected to a network (and to which type)
}
LogFactory.writeMessage(this, LOG_TAG, "Job is done. ");
return false;
}
}
@Override
public boolean onStopJob(JobParameters jobParameters) {
LogFactory.writeMessage(this, LOG_TAG, "Job was stopped");
return true;
}
我这样启动服务:
JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE);
ComponentName service = new ComponentName(context, ConnectivityBackgroundServiceAPI21.class);
JobInfo.Builder builder = new JobInfo.Builder(1, service).setPersisted(true)
.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY).setRequiresCharging(false);
jobScheduler.schedule(builder.build());
jobScheduler.schedule(builder.build()); //It runs when I call this - but doesn't re-run if the network changes
说明书(摘要):
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT" />
<uses-permission android:name="android.permission.VIBRATE" />
<application>
<service
android:name=".services.ConnectivityBackgroundServiceAPI21"
android:exported="true"
android:permission="android.permission.BIND_JOB_SERVICE" />
</application>
</manifest>
我想这个问题一定有简单的解决方案,但我找不到。
registerNetworkCallback()
方法时,传入了PendingIntent
参数而不是NetworkCallback
对象吗? - Pablo Baxter