首先,我是一个完全的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);
}
}
}
根据我在Web项目中的经验,上述代码基于FusedLocationProviderClient建立了一个“监听器”。一旦有新的位置更新,就会调用onLocationResult
并返回相应的位置结果。
目前我了解到的关于Work Manager的情况是,你可以使用Work Manager设置一个Worker去执行doWork()
,可以执行一次或定期执行,类似于cron job(定时任务管理工具)...
我不明白的是,如果没有后台运行的服务,那么Worker和请求位置更新的功能将在哪里初始化?它们如何协同工作?
PeriodicWorkRequest myWorkRequest = new PeriodicWorkRequest.Builder(MyLocationWorker.class, 30, TimeUnit.MINUTES).build();