除了梅林的回答(当它出现时,我只是在记事本中输入了这个很多) - 我同意。我的建议是:
面对类似的问题,我决定最好的办法是通过服务将整个 GPS 与主要活动分离。
我的意思是有一个服务,它执行requestsLocationUpdates()
andremoveLocationUpdates()
并实现LocationListener
. 该服务提供了主要活动可以通过IBinder
接口调用的方法。它还向实现 a 的 Activity 发送广播以BroadcastReceiver
收听这些消息。
因此,您的主要活动可以调用的服务方法之一是(比如说)
mLocnServ.startGPS(int timeout, float requiredAccuracy, int minUpdatePeriod, int minResendDistance)
mLocnServ
服务公开的活页夹接口在哪里。
最后两个参数是作为参数传递给服务中 requestLocationUpdates 的参数。(我个人认为这些对 GPS 何时关闭没有任何影响,据我所知,它一直运行直到removeUpdates()
被调用)。无论如何,第一个参数(超时)应该是您准备等待修复所需精度的时间(参数 2)。
因此,在您的服务中,您将需要一个 Runnable 作为计时器,如果超时,它将发送一个类型的广播TIMED_OUT
(比如)和 removeUpdates 以停止 GPS。在您的 onLocationChanged 中,您可以根据所需的准确度测试您获得的位置,如果足够好,发送类型的广播GOT_A_FIX
(例如)并将位置(纬度/经度和准确度)作为广播中的附加信息传递,然后 removeUpdates 停止 GPS . (TIMED_OUT
并且GOT_A_FIX
只是枚举的示例名称,您可以编造这些名称以区分广播消息类型)
主要活动可以在其BroadcastReceiver onReceive() 中决定接下来要做什么,即是否在收到TIMED_OUT
广播时重试或如何处理从GOT_A_FIX
消息中获得的数据。
您可能还需要一个mLocnServ.stopGPS
活页夹,以便无论服务在做什么,您都可以关闭 GPS