这是我收听GPS位置更新的方式(使用LocationManager
和LocationListener
):
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
listener = new MyLocationistener(); // LocationListener
locationManager.requestLocationUpdates(
LocationManager.GPS_PROVIDER,
30000, // milliseconds (minTime)
20, // meters (minDistance)
listener );
但我想动态调整minTime
使用的minDistance
和LocationManager#requestLocationUpdates
参数。我的目标是根据几个使用政策节省电池,即:
我想知道:
LocationManager#removeUpdates
和LocationManager#requestLocationUpdates
。编辑:应用程序是一个跟踪系统,用于了解人员的位置,以便将任务分配给最接近给定人员的人员。实际上电池几乎不会持续8个小时,所以我想增加它。
答案 0 :(得分:4)
AFAIK您需要再次致电removeUpdates
和requestLocationUpdates
。
此外,您还可以通过其他方式查看手机是否正在移动,例如加速度计。阅读here和see this other question's answers
但是给你更多的想法,你需要提出问题本身。不要试图尽早优化,直到你没有问题。如果您需要发布有关它的详细信息。
答案 1 :(得分:1)
节省电池寿命真的是个好主意吗?
可能不是。 AFAIK,GPS收音机将是整个时间,这是你所描述的最大的电池消耗。节省电池的方法是删除更新,以便GPS无线电关闭。但是,下次请求位置更新时,GPS需要一些时间来获取其初始修复。
如果用户在室内(没有GPS覆盖),请同时增加
如果您无法获得GPS定位,请关闭无线电,稍后再尝试几分钟(或根据UI事件或其他事项)。没有任何意义,如果没有对你做任何好事,请打开GPS。
如果电池电量过低,请同时增加电池
如果电池电量过低,请关闭GPS。切换到低功耗提供商(使用Criteria
查找一个)或不使用位置数据。让用户通过偏好来决定什么是“太低”。
答案 2 :(得分:1)
我做过这样的事情:
我有一个LocationService(扩展Service
并实现LocationListener
)。我添加了
locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 1, 1, this);
并在onLocationChangedListener中:
public void onLocationChanged(Location location) {
AlarmManager aleManager = (AlarmManager) LocationService.context.getSystemService(ALARM_SERVICE);
//Change the values of MINIMIUM_TRIGGER_TIME and INTERVAL_TIME
Intent forceLoc = new Intent(LocationService.context,
ForceLocationService.class);
PendingIntent pendingForceLoc = PendingIntent.getService(
LocationService.context, 0, forceLoc,
PendingIntent.FLAG_ONE_SHOT);
// CANCEL PREVIOUS alarm and set new one
aleManager.cancel(pendingForceLoc);
aleManager.setInexactRepeating(AlarmManager.RTC_WAKEUP,
MINIMIUM_TRIGGER_TIME, INTERVAL_TIME, pendingForceLoc);
}
并在ForceLocationService(extends IntentService
)中触发常规位置监听器,如下所示:
locMan=(LocationManager)getSystemService(LOCATION_SERVICE);
locMan.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 1, locationService);
这让我做以下事情:
如果系统在alarmManager触发ForceLocationService之前获取任何位置更新,它会自动获取更新并重置警报。
如果在警报触发之前没有获得更新,则会强制触发警报,从而确保我们在需要时获得更新。
我唯一的问题是,如果位置没有变化,它就不起作用,因为在onLocationChanged()中完成了警报的重置。