Во-первых, я полный Android-новичок. Некоторое время искали решения, но пока не нашли никаких полезных советов в правильном направлении. Как правило, это может быть вызвано характером самой проблемы, поскольку она является нишевой.
Рабочий код, представленный ниже, основан на лаборатории кода на странице https://codelabs.developers.google.com/codelabs/realtime-asset-tracking.
Однако мне было интересно, поскольку сейчас он упоминался в нескольких ресурсах как предпочтительный способ, как бы вы сделали что-то подобное на основе Android Work Manager вместо службы с постоянным уведомлением?
public class TrackerService extends Service {
@Override
public void onCreate() {
super.onCreate();
requestLocationUpdates();
}
private void requestLocationUpdates() {
LocationRequest request = new LocationRequest();
request.setInterval(5 * 60 * 1000);
request.setFastestInterval(30 * 1000);
request.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
FusedLocationProviderClient client = LocationServices.getFusedLocationProviderClient(this);
int permission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
if (permission == PackageManager.PERMISSION_GRANTED) {
client.requestLocationUpdates(request, new LocationCallback() {
@Override
public void onLocationResult(LocationResult locationResult) {
Location location = locationResult.getLastLocation();
if (location != null) {
Log.d(TAG, "location update " + location);
}
}
}, null);
}
}
}
По моему опыту работы с веб-проектами, приведенный выше код устанавливает «слушателя» на основе FusedLocationProviderClient. Как только появится новое обновление местоположения, он вызовет onLocationResult
с соответствующим результатом местоположения.
Что я узнал о диспетчере работ, так это то, что вы можете настроить сотрудника с диспетчером работ для doWork()
один раз или периодически. Практически как работа cron ...
Чего я не понимаю, если в фоновом режиме нет работающей службы, где будет инициирован Worker и запрос обновлений местоположения? И как они будут работать вместе?
PeriodicWorkRequest myWorkRequest = new PeriodicWorkRequest.Builder(MyLocationWorker.class, 30, TimeUnit.MINUTES) .build();
2) Вам нужно удалить обратный вызов, когда вы получите результат своего местоположения. - person Vadim Eksler   schedule 02.12.2018