5

我需要在 Android 手机上进行后台 GPS 跟踪,我目前计划有两种情况:

  1. 当手机连接到(车载)充电器时,获取频繁的 GPS 位置(每分钟)。
  2. 当手机未连接充电器时,仅每 5-30 分钟轮询一次位置,具体取决于电池受影响的程度。

我知道我需要在服务中实现跟踪,并且可能会显示通知以保持服务处于活动状态。但是,我认为手机可能随时进入睡眠模式,这将停止 GPS 跟踪。

对于这些场景,在不让手机进入睡眠状态且不会消耗太多电量的情况下,进行持续的后台 GPS 跟踪的最佳方法是什么?

到目前为止,我收集了以下内容:

对于场景 1,我可能需要获取 WakeLock,并始终保持 CPU 唤醒(但屏幕可能会休眠)。MyTracks 应用程序似乎在TrackRecordingService中执行此操作。OpenGPSTracking 似乎也是如此

对于场景 2,我可以使用 AlarmManager 安排每 x 分钟检查一次。我的服务需要获取一个临时的 WakeLock,等待一个 GPS 位置,然后停止并再次释放 WakeLock。

这两种方法(永久 WakeLock 与 AlarmManager)的功耗比较如何?如果每 30 分钟检查一次,GPS 能否在合理的时间内接收到准确的位置?

StackOverflow 上有一些相关的问题,但没有一个令人满意的答案。一些半有用的:

4

2 回答 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 providerwakelock如果需要,请使用。

于 2011-10-14T09:10:23.300 回答
5
  1. 当手机连接到充电器时,您可以获得唤醒锁,因为您计划获得频繁的 GPS 位置,在这种情况下,AlarmManager 似乎不是一个好主意。

  2. 当手机未连接到充电器时,您可以使用警报管理器,因为您只会每 5-30 分钟轮询一次位置。获取唤醒锁将显着影响您的电池寿命。

实施取决于你。

干杯....!!

于 2011-10-14T08:58:55.567 回答