在打ze模式时获取位置更新



我正在尝试在Android应用程序中获取在DOZE模式时在Android应用中获取位置更新。随着Android 6和Doze的出现,无论我做什么,更新都在某个时候停止。在阅读了几篇文章和关于该主题的堆叠答案之后,我进行了以下更改:

  • 使我的服务成为前景服务
  • 使该服务保持部分唤醒锁
  • 我已将我的应用程序wake_lock许可
  • 使服务在单独的过程中运行(对于某些Android错误的解决方法)
  • 我已经禁用了我的应用程序的电池优化

但是,在打ze启动时,我还没有得到位置更新。我已经验证了在打ze启动时(通过定期记录消息)时我的服务线程不断运行,但是以某种方式,位置管理器停止发送更新。在这方面,关于打ze和LocationManager的文档很少,所以我想知道是否有人知道使位置经理在上bo中活着的方法?LocationManager上是否有一些方法,如果定期调用将保持位置管理器的活动?请注意,我只对GPS更新感兴趣,每秒一次。

最后,我在阅读了com.android.internal.location.gpslocation.gpslocation.provider的源代码后找到了解决问题的解决方法,我注意到将其发送为com.android.internal。位置。Alarm_wakeup意图阻止了位置提供商打zing。因此,要防止GPS打zing,我每10秒钟播放意图,我在服务类中添加以下内容:

[...]
private Handler handler;
private PowerManager powerManager;
private PendingIntent wakeupIntent;
private final Runnable heartbeat = new Runnable() {
    public void run() {
        try {
            if (isRecording && powerManager != null && powerManager.isDeviceIdleMode()) {
                LOG.trace("Poking location service");
                try {
                    wakeupIntent.send();
                } catch (SecurityException | PendingIntent.CanceledException e) {
                    LOG.info("Heartbeat location manager keep-alive failed", e);
                }
            }
        } finally {
            if (handler != null) {
                handler.postDelayed(this, 10000);
            }
        }
    }
};
@Override
public void onCreate() {
    handler = new Handler();
    wakeupIntent = PendingIntent.getBroadcast(getBaseContext(), 0,
        new Intent("com.android.internal.location.ALARM_WAKEUP"), 0);
    locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
    powerManager = (PowerManager) getSystemService(POWER_SERVICE);
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TrackService");
    [...]
}

如果您在模拟器上测试位置和打zhode模式,则带有" ADB Shell Dumpsys devulsidle force-idle"等命令。

但是...作为"文档"代表:

"一旦用户将其移动,打开屏幕或连接充电器,系统exits exits dozit ,所有应用程序返回正常活动"

来源:https://developer.android.com/training/monitoring-device-state/doze-standby

所以...使用GPS操纵杆应用或类似的模拟器移动模拟器,您会注意到位置从Doze Mode醒来。

您的应用程序的行为恰恰是DORE旨在停止的。在Android 6中引入的Doze通过将活动推迟到维护窗口来减少设备的功能。GPS是一种巨大的动力,不允许在打ze舞模式下不断运行。如果允许这样做,电池可能会以类似于屏幕的速率下降。网络流量的优化将无法提高电池寿命。如果您希望GPS位置每1秒更新一次,则必须阻止设备输入DOZE模式。

Android 5中没有打击模式。

最新更新