【发布时间】:2019-05-03 13:08:51
【问题描述】:
首先,我是一个完全的 Android 菜鸟。一段时间以来一直在寻找解决方案,但到目前为止找不到任何有用的提示。这通常可能是由问题本身的性质引起的,非常小众。
下面的工作代码基于https://codelabs.developers.google.com/codelabs/realtime-asset-tracking 的代码实验室。
不过我想知道,由于现在有几个资源中提到它是首选方式,你如何基于 Android 的工作管理器而不是具有持续通知的服务来做类似的事情?
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 并提供相应的位置结果。
到目前为止,我对工作管理器的发现是,您可以一次或定期将具有工作管理器的 Worker 设置为 doWork()。实际上就像一个 cron 作业...
我不明白,如果后台没有正在运行的服务,那么 Worker 和位置更新请求会在哪里发起?他们将如何合作?
【问题讨论】:
-
让我们明确一点,您将在从 Worker 类扩展的类中发起位置更新请求,并且您将运行自己的 doWork 函数。看这个例子——codelabs.developers.google.com/codelabs/android-workmanager/#3
-
Thx @VadimEksler - 该代码会进入我的默认活动吗?如果我定期运行一个工作器,它不会注册多个回调来更新位置吗?
-
1) 扩展 Worker 的独立类 MyLocationWorker。你像
PeriodicWorkRequest myWorkRequest = new PeriodicWorkRequest.Builder(MyLocationWorker.class, 30, TimeUnit.MINUTES) .build();一样开始它 2) 当你得到你的位置结果时,你需要删除回调。
标签: android android-service android-fusedlocation android-workmanager google-location-services