Android 在后台服务中连续获取位置更新

Android 在后台服务中连续获取位置更新,android,location,background-service,Android,Location,Background Service,我正在开发一个需要在后台服务中不断获取位置更新的应用程序。我使用了它正在使用的后台粘性服务。但是,即使我添加了引导广播并在那里启动了服务,引导完成后服务也不会启动。服务启动并立即停止 而且,这对奥利奥不起作用。服务在应用程序关闭几分钟后停止,在应用程序重新启动之前不会重新启动 我浏览了很多链接和博客,它们建议使用AlarmManager/JobScheduler/JobIntentService,但没有得到令人满意的解决方案。 因此,请建议使用工作策略/解决方案,该策略/解决方案可用于即使在启动

我正在开发一个需要在后台服务中不断获取位置更新的应用程序。我使用了它正在使用的后台粘性服务。但是,即使我添加了引导广播并在那里启动了服务,引导完成后服务也不会启动。服务启动并立即停止

而且,这对奥利奥不起作用。服务在应用程序关闭几分钟后停止,在应用程序重新启动之前不会重新启动

我浏览了很多链接和博客,它们建议使用AlarmManager/JobScheduler/JobIntentService,但没有得到令人满意的解决方案。
因此,请建议使用工作策略/解决方案,该策略/解决方案可用于即使在启动后仍在后台连续获取位置,并且应在Oreo上工作

,使用通知,您可以使您的服务处于活动状态。它适用于android 8.1。 下面是后台服务的代码

注:

1) 将startForegroundService用于上述生成版本。\u code.O

2) 使用targetSdkVersion 25

        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            mainActivity.startService(new Intent(getContext(), GpsServices.class));
        } else {
            mainActivity.startForegroundService(new Intent(getContext(), GpsServices.class));
        }
您可以使用定期获取设备的位置。有一种直接的方法可以向融合位置提供商请求定期更新。位置的准确性由提供程序、您请求的位置权限以及您在位置请求中设置的选项决定

请求位置更新

在请求位置更新之前,您的应用程序必须连接到位置服务并发出位置请求。有关更改位置设置的课程介绍了如何执行此操作。位置请求到位后,可以通过调用requestLocationUpdates()启动定期更新

根据请求的形式,融合位置提供程序要么调用LocationCallback.onLocationChanged()回调方法并向其传递位置对象列表,要么发出包含扩展数据中位置的PendingEvent。更新的准确性和频率受您请求的位置权限和在位置请求对象中设置的选项的影响

本课程介绍如何使用LocationCallback方法获取更新。调用requestLocationUpdates(),将LocationRequest对象的实例和LocationCallback传递给它。定义startLocationUpdates()方法,如以下代码示例所示:

@Override
protected void onResume() {
    super.onResume();
    if (mRequestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    mFusedLocationClient.requestLocationUpdates(mLocationRequest,
            mLocationCallback,
            null /* Looper */);
}
有关详细说明,请参阅


希望这有帮助。

请参考这个问题,我希望它能解决您的问题……您能解释一下发送通知中的代码是做什么的吗?我试过这个方法。后台位置提取正在工作。但我无法看到我的应用程序显示的任何通知。我可以看到系统“2个应用程序正在使用电池”及以下显示的通知,即我的应用程序名称。@Virat18使用compileSdkVersion 26和targetSdkVersion 25,然后您可以看到通知
@Override
protected void onResume() {
    super.onResume();
    if (mRequestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    mFusedLocationClient.requestLocationUpdates(mLocationRequest,
            mLocationCallback,
            null /* Looper */);
}