从我在AOSP代码中看到的内容中,在wakelock
期间或当Android触发调用已注册位置接收者的意图时,会抓取onLocationChanged
。因此,您不需要wakelock
进行处理,或者至少应该使用唤醒锁来执行onLocationChanged
中的异步操作,或者如果您从接收器启动intentService并且等等。现在我的问题是:gps是否唤醒了CPU?我的意思是:当操作系统收到gps触发器时,唤醒锁授予信息可以处理,但之前? gps会产生中断来唤醒CPU吗?即使您使用接收器版本,它也不会授予您gps唤醒CPU,或者像alarmManager
的警报那样是监听器/ pendignIntent,我们可以信任它吗?是否需要抓住wakelock
以保持系统接收信息?
答案 0 :(得分:4)
我想也许你正在考虑它有点倒退。通常,应用程序或用户将触发GPS,而不是触发唤醒锁定的GPS。
<强>标准强>
应用程序是否保持GPS唤醒取决于Criteria
根据LocationManager.requestLocationUpdates(long minTime, float minDistance, Criteria c, PendingIntent i)
方法文档:
可以使用minTime控制位置更新间隔 参数。位置更新之间经过的时间永远不会 小于minTime,虽然它可能更多取决于位置 提供程序实现和其他请求的更新间隔 应用。
有效提供商
GPS和网络提供商被视为“活跃的提供商”。两者都需要时间来启动并获得新的修复并消耗电池。
系统会尝试唤醒/使用有效提供商来满足您的条件,如果您使用的是BroadcastReceiver
,则onRecieve
方法可以保证完成
如果您每小时要求GPS,系统应该唤醒设备,运行GPS并在假设提供商已启用的情况下每小时检查一次GPS Criteria
。
如果用户禁用了提供程序,则更新将停止,并且a 将发送提供商可用性更新。提供者一旦 再次启用,位置更新将立即恢复和提供商 可用性更新发送。
其他问题&amp;触发器强>
这就是为什么他们建议在启用或禁用提供程序时考虑额外的侦听触发器。这些可以与提及的 @ danny177 相结合,例如充电状态和电池电量。即便是当前的网络国也可以在这里发挥作用。
提供商还可以发送状态更新 任何时候,特定于提供者的额外。如果回调是 然后提供状态和可用性更新 onProviderDisabled(String),onProviderEnabled(String)或 onStatusChanged(String,int,Bundle)。或者,如果是未决的意图 然后提供状态和可用性更新广播 意图使用KEY_PROVIDER_ENABLED或KEY_STATUS_CHANGED的额外键。
最后,您还可以使用被动提供程序。如果其他应用程序为您唤醒其中一个活动提供程序,则只会为您提供更新。
如果您的应用程序想要被动地观察位置更新 由其他应用程序触发,但不消耗任何额外的电源 否则,然后使用PASSIVE_PROVIDER此提供程序不 主动开启或修改有效位置提供商
位置策略
通常,您希望从最不准确到最高,最低功率到最高等等。例如,您可以使用PASSIVE_PROVIDER
来查看用户是否移动了超过100米。然后,如果他们有,请求网络提供商的有效位置更新,看他们是否接近特定位置,如果是真的,请使用GPS更具体的。
确定使用和信任哪个是一个权衡问题 精度,速度和电池效率。
Google Play服务
最后,您还可以使用Google Play服务作为位置提供商,并捎带其位置更新。这也为您提供“免费”地理围栏和地理编码。
答案 1 :(得分:1)
您不需要唤醒锁来处理onLocationChanged()
中收到的位置。
然而,长时间记录背景gps可能需要使用唤醒锁
在打开唤醒锁之前,请考虑电池电量,如果设备正在充电,则应该释放唤醒锁。
背景唤醒锁的通用假设。
编辑
请使用带唤醒锁的BroadcastReciver。
final IntentFilter theFilter = new IntentFilter();
theFilter.addAction(Intent.ACTION_BATTERY_LOW);
registerReceiver(yourReceiver, theFilter);
private static BroadcastReceiver yourReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null) {
String s = intent.getAction();
if (s != null) {
if (s.equals(LocationManager.PROVIDERS_BATTERY_LOW)) {
cancelMyWakeLock();
} }
}
}
};
记得在onStop中取消注册() 取消注册代码未显示。