我正在使用下面的代码安排作业在有互联网时运行,但它只运行一次,我希望它在有可用的网络时运行。这可能吗?
我尝试定期进行工作并添加一个网络约束,认为只要一段时间过去就会睡眠和唤醒并检查可用的网络,如果有可用的网络,那么它将执行该作业,否则它将返回进入睡眠模式,但我没有得到想要的行为,因为每当周期结束时作业就会一直运行(好像没有网络约束)
这是日程安排代码
mJobScheduler = (JobScheduler)
getSystemService( Context.JOB_SCHEDULER_SERVICE );
JobInfo.Builder builder = new JobInfo.Builder( 1,
new ComponentName( getPackageName(),
JobSchedulerService.class.getName() ) );
// builder.setPeriodic( 3000 );
builder.setPersisted(true);
builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
mJobScheduler.schedule( builder.build() );
答案 0 :(得分:0)
最简单的解决方案是使用Firebase调度程序及其API,就像在README上报告一样,使用正确的Constraint
(我猜值可能是ON_ANY_NETWORK)
.setConstraints(
// only run on an unmetered network
Constraint.ON_UNMETERED_NETWORK,
// only run when the device is charging
Constraint.DEVICE_CHARGING
)
,广播解决方案无法运行,至少在Android 8中无效
答案 1 :(得分:-1)
您可以注册this来监听网络上的更改(可用/不可用),然后执行您的任务或安排BroadcastReceiver
的工作您必须向JobScheduler添加CONNECTIVITY_ACTION过滤条,如下所示:
IntentFilter filter = new IntentFilter();
filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
getActivity().registerReceiver(networkStateReceiver, filter);
并实施BroadcastReceiver类似的内容:
@Override
public void onReceive(Context context, Intent intent)
{
if (intent != null && intent.getExtras() != null)
{
ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = manager.getActiveNetworkInfo();
if (ni != null && ni.getState() == NetworkInfo.State.CONNECTED)
{
// conected
}
else if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, Boolean.FALSE))
{
// not connected
}
}
}