屏幕关闭时,Android后台位置更新不会出现

屏幕关闭时,Android后台位置更新不会出现,android,location,background-service,fusedlocationproviderapi,android-fusedlocation,Android,Location,Background Service,Fusedlocationproviderapi,Android Fusedlocation,我们正在开发移动跟踪应用程序。对于位置更新,优先使用高精度的融合位置API 即使屏幕关闭,也需要位置更新。因此,我们使用的是后台服务。后台服务也正在获取部分唤醒锁,以便设备不会进入睡眠状态。 在后台服务中,我们请求位置更新和服务的挂起更新 问题是,我们只在屏幕打开时接收位置更新。一旦屏幕关闭,位置更新就会停止。还有一个由服务运行的线程,它在任何时候都不会被杀死 通过BroadcastReceiver关闭屏幕时再次创建位置请求也不起作用 以下是后台服务类(路由执行): 广播接收机: public

我们正在开发移动跟踪应用程序。对于位置更新,优先使用高精度的融合位置API

即使屏幕关闭,也需要位置更新。因此,我们使用的是后台
服务
。后台
服务
也正在获取部分
唤醒锁
,以便设备不会进入睡眠状态。 在后台
服务
中,我们请求位置更新和
服务
的挂起更新

问题是,我们只在屏幕打开时接收位置更新。一旦屏幕关闭,位置更新就会停止。还有一个由
服务运行的
线程
,它在任何时候都不会被杀死

通过
BroadcastReceiver
关闭屏幕时再次创建位置请求也不起作用

以下是后台
服务
类(
路由执行
):

广播接收机

public class PowerButtonReceiver extends BroadcastReceiver {
    private static final String TAG = "PowerButton";

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d(TAG, "Power Button");
        if (RouteExecution.getRouteExecution() != null) {
            RouteExecution.getRouteExecution().createLocationListener();
        }
    }
}
如何在屏幕关闭时保持位置更新


谢谢您的帮助。

首先,在
服务中获得
唤醒锁
根本不可靠。在执行代码之前,设备可以返回睡眠状态

我将调用
pendingent.getBroadcast()
而不是
pendingent.getService()
,因为在
onReceive()
期间,从技术上保证了
WakeLock
,并从那里启动
服务

onReceive()
中获取
WakeLock
,启动
服务
,并在适当时从
服务
中释放
WakeLock

使用,基本上也是这样,而不必自己实现大部分逻辑

另一个可能的问题是在棉花糖设备上使用
AlarmManager.set()

如果此方法设置的警报处于活动状态,则不会在这些设备上触发


在API级别23+上使用
setandAllowHileId()
而不是
set()

您是如何启动
服务的?显示
服务
广播接收器
的代码。同时检查此问题
AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent updateServiceIntent = new Intent(context, RouteExecution.class);
PendingIntent pendingUpdateIntent = PendingIntent.getService(context, 0, updateServiceIntent, 0);
RouteExecution.setPendingIntent(pendingUpdateIntent);
alarmManager.set(AlarmManager.RTC_WAKEUP, 50000, pendingUpdateIntent);
public class PowerButtonReceiver extends BroadcastReceiver {
    private static final String TAG = "PowerButton";

    @Override
    public void onReceive(Context context, Intent intent) {

        Log.d(TAG, "Power Button");
        if (RouteExecution.getRouteExecution() != null) {
            RouteExecution.getRouteExecution().createLocationListener();
        }
    }
}