Na verdade eu implementei uma lógica bem mais complexa...
Tenho um serviço GeoFencingService que roda das 9 da manhã até as 22:00, pois fora desse horário não temos interesse...
Durante o periodo ativo, eu configuro um LocationListener para wifi (se habilitado) e um para o PASSIVE_PROVIDER caso algum outro aplicativo use o GPS eu acabo consumindo essa informação também.
Esses listeners são desabilitados quando o device está sem internet, e reabilitados quando há conexão.
Controlo também o tempo e distancia minimos para o requestLocationUpdates conforme o status da tela do device... Se o device está com a tela ligada, diminuo o tempo e distancia minima para novos reports, tela desligada aumento esse tempo...
Ainda irei implementar o gerenciamento pela carga da bateria, dependendo da carga altero o tempo de refresh da localização, e caso o device esteja carregando, posso habilitar o GPS.
Controlo também o accuracy da localização reportada.
Caso a precisão seja maior que a metade do raio da minha regiao, e houver um overlap entre minha localização atual + accuracy e o centro da regiao de interesse + o raio da regiao, e não obtive uma localização precisa nos ultimos X minutos, eu disparo um pedido de localização via GPS.
for (SubRegion region : regions) {
Location area = new Location("GEOFENCE");
area.setLatitude(region.getLatitude());
area.setLongitude(region.getLongitude());
int radius = (int) (region.getRadius() * 1000);
float distance = location.distanceTo(area);
if (location.hasAccuracy()
&& location.getAccuracy() > (radius / 2)
&& distance < radius + location.getAccuracy()
&& !region.isInRegion()) {
log.log("Overlaping Region with my position: "
+ region + " - " + location);
probeGps = true;
}
}
Bom, basicamente é isso...