我构建了一个这样的应用程序(因此,在办公时间问答中提出了有关如何测量LocationManager的功耗的问题),并且它确实运行良好.
我最初打算使用内置的接近警报,但在与您遇到的同一问题上苦苦挣扎,并认为它不够灵活.
相反,我构建了一个服务,该服务使用LocationProvider通过NETWORK_PROVIDER每五分钟轮询一次位置,计算到所需位置的距离,如果在邻近范围内,则发出通知.
在拥有许多Wifi网络的城市中,这使我(报告的)准确度达到了50米.
我还使用PASSIVE_PROVIDER从其他应用的位置请求中受益.
如果我在所需的位置附近,并且报告的精度太高而无法确定我是否在指定的邻近范围内,则我将使用单个GPS位置请求作为备用.如果NETWORK_PROVIDER超时,我还将使用单个GPS定位请求.为了不让GPS提供商在我乘坐地铁的同时耗尽电池电量,它还具有超时和指数退避功能.
当我连接到Wifi网络时,我假设我没有移动,因此在此期间禁用了位置提供程序.
我所做的最后一个更改是如果可以确定在15分钟内我将无法使其到达任何保存的位置,则对NETWORK_PROVIDER使用15分钟(“不重复重复”)计时器(因此,每5分钟间隔一次轮询)没有任何意义).这有助于节省功率.
我当时在考虑使用更长的时间间隔来节省更多电量,但是在这里找到一种启发式方法来确定我是否能够到达我保存的位置之一并不容易,因为我不能总是假设相同的行驶速度(步行,乘火车或汽车旅行).
但是由于我无法测量由我的应用程序引起的LocationManager的功耗,因此我不知道如何在每天的情况下评估功耗.
我不介意内置的API是否可以提供所有这些逻辑,但是我得出的结论是没有,所以我自己构建了这个逻辑.
希望这对您有所帮助.