在我找到了問題的解決方法到底有沒有打盹模式,通過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");
[...]
}
我意識到什麼打瞌睡是,但是它的_my_設備,我應該能夠聲明可以將我的電池用於對我有用的目的,在這種情況下記錄GPS軌道。這也是一個不常見的用例,例如runkeeper和strava需要這樣做。阻止設備進入休眠狀態似乎是一種破解,並且不得不打開屏幕來打擊旨在節省電池壽命的東西似乎倒退了回來。 –
@KorneliusElstner如果您正在使用設備運行,它將不會進入休眠模式。 「只要用戶通過移動設備來喚醒設備,......系統就會退出打盹狀態,所有應用程序都會恢復正常活動。」 – mattm