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