2017-09-16 74 views
1

我试图在我的Android应用程序中处于休眠模式时获取位置更新,这用于处理Android 5.x.随着android 6和瞌睡的到来,无论我做什么,更新都停止在某个时刻。在话题读了几篇文章和StackOverflow的答案后,我做了以下修改:在休眠模式下获取位置更新

  • 使我的服务前台服务
  • 所做的服务持部分唤醒锁
  • 我已经给我的应用程序的WAKE_LOCK权限
  • 取得了一个单独的进程(一些Android的错误的一种变通方法)的服务运行
  • 我已禁用电池优化我的应用程序

但仍然没有获得位置更新时,打瞌睡踢我已经验证,我的服务线程继续运行时打盹(通过定期记录消息),但不知何故位置管理器停止发送更新。关于doze和LocationManager的文档在这方面很少,所以我想知道是否有人知道如何让位置管理员保持活力? LocationManager上是否存在一些方法,如果定期调用将使LocationManager保持活动状态? 请注意,我只对GPS更新感兴趣,更新频率高,每秒一次。

回答

0

在我找到了问题的解决方法到底有没有打盹模式,通过com.android.internal.location.GpsLocationProvider的源代码,看完之后我注意到,在发送的com.android.internal.location.ALARM_WAKEUP意图防止位置提供者打瞌睡。因此,为了保持GPS从打瞌睡我转播意向每隔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"); 
    [...] 
} 
0

您的应用程序的行为正是doze旨在停止。 Android 6引入的打盹功能通过将活动推迟到维护时段来降低设备的用电量。全球定位系统是一个巨大的电力消耗,不允许在打盹模式下不断运行。如果允许这样做,电池可能会以类似于屏幕的速度运行;对网络流量的优化不会延长电池寿命。如果您希望每1秒更新一次GPS位置,则必须停止设备进入休眠模式。

有在Android的5

+0

我意识到什么打瞌睡是,但是它的_my_设备,我应该能够声明可以将我的电池用于对我有用的目的,在这种情况下记录GPS轨道。这也是一个不常见的用例,例如runkeeper和strava需要这样做。阻止设备进入休眠状态似乎是一种破解,并且不得不打开屏幕来打击旨在节省电池寿命的东西似乎倒退了回来。 –

+0

@KorneliusElstner如果您正在使用设备运行,它将不会进入休眠模式。 “只要用户通过移动设备来唤醒设备,......系统就会退出打盹状态,所有应用程序都会恢复正常活动。” – mattm