安卓GPS跟踪和WakeLock

5
我需要在Android手机上进行后台GPS跟踪,目前我计划有两种情况:
1.当手机连接到(汽车)充电器时,获取频繁的GPS位置(每分钟一次)。
2.当手机未连接到充电器时,根据电池受影响程度每5-30分钟轮询一次位置。
我知道我需要在服务中实现跟踪,并可能显示通知以保持服务活动。但是,我了解到手机随时可能进入睡眠模式,这将停止GPS跟踪。
对于这些情况,最好的方法是什么,可以实现连续的后台GPS跟踪,而不会让手机进入睡眠状态,也不会耗费太多电量?
到目前为止,我收集了以下信息:
对于方案1,我可能需要获取一个WakeLock,并一直保持CPU处于唤醒状态(但屏幕可以休眠)。MyTracks应用程序似乎在TrackRecordingService中执行此操作。OpenGPSTracking似乎也是这样做的the same
对于方案2,我可以使用AlarmManager每隔x分钟安排一个检查。我的服务将需要获取临时WakeLock,等待单个GPS位置,然后停止并释放WakeLock。
这两种方法(永久WakeLock vs AlarmManager)的功耗如何比较?当每30分钟只进行一次检查时,GPS能否在合理的时间内接收到准确的位置?
StackOverflow上有一些相关问题,但没有令人满意的答案。其中一些半有用:
2个回答

7
您可以使用广播接收器来判断电源是否连接并根据情况执行操作。
对于电源连接情况:
public class PowerConnected extends BroadcastReceiver{
   @Override
   public void onReceive(Context context, Intent intent) {
   // TODO Auto-generated method stub
   if(intent.getAction().equalsIgnoreCase("android.intent.action.ACTION_POWER_CONNECTED")){
      //Initialize your listener here...
   }
   }

}

在您的清单文件中:

<receiver android:name=".receiver.PowerConnected" >
<intent-filter >
     <action android:name="android.intent.action.ACTION_POWER_CONNECTED" />
</intent-filter>
</receiver>

当电源被拔掉时:

public class PowerDisconnected extends BroadcastReceiver{
  @Override
  public void onReceive(Context context, Intent intent) {
  if(intent.getAction().equalsIgnoreCase("android.intent.action.ACTION_POWER_DISCONNECTED")){
    //Do your task here...      
  }
 }
}

在您的清单文件中:
<receiver android:name=".receiver.PowerDisconnected" >
<intent-filter >
   <action android:name="android.intent.action.ACTION_POWER_DISCONNECTED" />
</intent-filter>
</receiver>

现在您应该使用service并在那里初始化您的GPS。当电源连接时,请使用GPS_Provider,否则请使用network provider。如有需要,请使用wakelock

2
虽然我肯定会使用它,但我觉得它没有回答我关于GPS跟踪的最佳策略是什么的核心问题。 - Ralf
你不应该在使用GPS_Provider或网络提供者之间做出选择。你可以同时包含两者,让Android自动选择可用的那一个。 - Johann

5
  1. 当手机连接到充电器时,如果您想获取频繁的GPS位置信息,可以获取唤醒锁定,但在这种情况下,AlarmManager并不是一个好的选择。
  2. 当手机未连接到充电器时,您可以使用AlarmManager,因为您每5-30分钟只会轮询一次位置。获取唤醒锁将显着影响您的电池寿命。

具体实现由您决定。

干杯....!!


你有没有想过wakelock会对电池产生多大的影响?如果只是每隔几分钟获取一次位置,需要多长时间才能完成? - Ralf
使用此API将会显著影响设备电池寿命。除非确实需要,否则不要获取WakeLocks,尽可能使用最低级别,并确保尽快释放它。http://developer.android.com/reference/android/os/PowerManager.html#ACQUIRE_CAUSES_WAKEUP - Rohit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接