Следующий код работает нормально на устройствах Nougat, но в устройстве oreo он вызывает onStartJob()
после определенного интервала, но не выполняет onLocationChanged
.
Итак, Job Schedular частично выполняет свою работу в устройствах oreo, но кое-как, как onLocationChanged
никогда не вызывается.
Создание диспетчера заданий
Как только пользователь дает разрешение на местоположение, я выполняю следующий код.
FirebaseJobDispatcher dispatcher = new FirebaseJobDispatcher(new GooglePlayDriver(context));
Job job = createJob(dispatcher);
dispatcher.mustSchedule(job);
Job Builder
Job job = dispatcher.newJobBuilder()
.setLifetime(Lifetime.FOREVER)
.setService(LocationJobService.class)
.setTag("Location-Job-package")
.setReplaceCurrent(false)
.setRecurring(true)
.setTrigger(Trigger.executionWindow(200, 800))
.setRetryStrategy(RetryStrategy.DEFAULT_LINEAR)
.setConstraints(Constraint.ON_ANY_NETWORK, Constraint.DEVICE_CHARGING)
.build();
return job;
Класс обслуживания Loaction
public class LocationJobService extends JobService implements
LocationListener,
GoogleApiClient.ConnectionCallbacks,
GoogleApiClient.OnConnectionFailedListener{
@Override
public void onCreate() {
super.onCreate();
if (isGooglePlayServicesAvailable()) {
mGoogleApiClient = new GoogleApiClient.Builder(this)
.addApi(LocationServices.API)
.addConnectionCallbacks(this)
.addOnConnectionFailedListener(this)
.build();
mGoogleApiClient.connect();
}
}
@SuppressLint("MissingPermission")
@Override
public boolean onStartJob(JobParameters params) {
Log.i(TAG, "onStartCommand: ");
mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(BACKGROUND_INTERVAL);
mLocationRequest.setFastestInterval(BACKGROUND_INTERVAL);
mLocationRequest.setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY);
this.params = params;
return true;
}
@Override
public void onLocationChanged(Location location) {
String storedLat, storedLng;
//....
}