2017-09-16 149 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