Gps监听器/接收器唤醒CPU

时间:2014-09-07 20:05:43

标签: android gps

从我在AOSP代码中看到的内容中,在wakelock期间或当Android触发调用已注册位置接收者的意图时,会抓取onLocationChanged。因此,您不需要wakelock进行处理,或者至少应该使用唤醒锁来执行onLocationChanged中的异步操作,或者如果您从接收器启动intentService并且等等。现在我的问题是:gps是否唤醒了CPU?我的意思是:当操作系统收到gps触发器时,唤醒锁授予信息可以处理,但之前? gps会产生中断来唤醒CPU吗?即使您使用接收器版本,它也不会授予您gps唤醒CPU,或者像alarmManager的警报那样是监听器/ pendignIntent,我们可以信任它吗?是否需要抓住wakelock以保持系统接收信息?

2 个答案:

答案 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更具体的。

请参阅:Location Strategies

  

确定使用和信任哪个是一个权衡问题   精度,速度和电池效率。

Google Play服务

最后,您还可以使用Google Play服务作为位置提供商,并捎带其位置更新。这也为您提供“免费”地理围栏和地理编码。

答案 1 :(得分:1)

您不需要唤醒锁来处理onLocationChanged()中收到的位置。

然而,长时间记录背景gps可能需要使用唤醒锁

在打开唤醒锁之前,请考虑电池电量,如果设备正在充电,则应该释放唤醒锁。

背景唤醒锁的通用假设。

  • 设备正在充电然后唤醒锁。
  • 设备未充电且高于N%,然后唤醒其他人释放唤醒锁
  • 处理完成释放唤醒锁。

编辑

请使用带唤醒锁的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中取消注册()  取消注册代码未显示。