我有应用程序,应该定期将设备位置发送到服务器,即使没有使用手机。
有 AlarmManager 标记,它会启动与位置服务绑定一段时间(20秒)的IntentService,然后发送该服务收集的位置。
Intent intent = new Intent(getApplicationContext(), AlarmReceiver_.class);
PendingIntent sender = PendingIntent.getBroadcast(getApplicationContext(), 2, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+ALARM_TIME, ALARM_TIME, sender);
位置服务是服务(类型:START_STICKY),应该不断运行。它目前使用多个提供商
mFusedLocationClient = LocationServices.getFusedLocationProviderClient(this);
mLocationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
当它被某个组件绑定时,它启动提供程序(Activity或IntentService - 所以应用程序是前台或后台,而由警报启动的IntentService正在进行定期位置检查)
if (mIsBound) {
if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
provider = LocationManager.GPS_PROVIDER;
mLocationManager.requestLocationUpdates(provider, 1000, 0, LocationService.this);
}
if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
provider = LocationManager.NETWORK_PROVIDER;
mLocationManager.requestLocationUpdates(provider, 1000, 0, LocationService.this);
}
LocationRequest mLocationRequest = new LocationRequest();
mLocationRequest.setInterval(5000);
mLocationRequest.setFastestInterval(2500);
mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mFusedLocationClient.requestLocationUpdates(mLocationRequest,mLocationCallback,null);
}
当没有被任何组件绑定时,关闭提供者(应用程序在后台,并且现在没有出现警报)
mLocationManager.removeUpdates(LocationService.this);
mFusedLocationClient.removeLocationUpdates(mLocationCallback);
因此,当应用程序在后台并且警报时间间隔设置为60分钟时,大部分时间都不应该收集位置。
但该应用仍有非常大的电池使用量在背景上,几个小时后整个应用程序可能会被系统杀死 - 警报嘀嗒声停止发生我看不到应用程序或手机上正在运行的应用程序中的位置服务。系统是否因为电池使用率过高而导致死机?
以下是我在应用程序运行+ -2小时时收集的一些有趣的电池统计信息。它有很高的NlpWakeLock时间。执行相同任务的其他应用程序有这样的唤醒锁,如14分钟
Wifi Running: 39m 6s 460ms (29,7%)
Full Wifi Lock: 1h 22m 59s 653ms (63,1%)
Wifi Scan: 3s 663ms (0,0%)
Wake lock NlpCollectorWakeLock realtime
Wake lock *alarm*: 346ms partial (33 times) realtime
Wake lock NlpWakeLock: 1h 22m 1s 153ms partial (25 times) realtime