一旦 GPS 更新开始,Android GPSListener 就会收到通知

Posted

技术标签:

【中文标题】一旦 GPS 更新开始,Android GPSListener 就会收到通知【英文标题】:Android GPSListener get notified once GPS updates start 【发布时间】:2012-06-05 10:15:03 【问题描述】:

因此,众所周知的事实是 GPS 接收器需要一段时间(大约 10-12 秒)才能锁定卫星。使用 android LocationListener 我想在位置更新开始时收到通知。例如:

我有一个带有以下代码的活动来实例化和调用 LocationListener

public void startLocationUpdates() 
    try
    Common.locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
            listener = new LocListener();
            if(Common.locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
                Common.locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
             else if(Common.locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) 
                Common.locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
            
        catch(Exception e) 
            e.printStackTrace();
        
    

这是 LocationListener onLocationChanged 的​​实现。

public void onLocationChanged(Location location) 
        // TODO Auto-generated method stub
        try
            Common.currentLocation = new String(String.valueOf(location.getLatitude()) + "," + String.valueOf(location.getLongitude()));
            Log.i("LocListener",Common.currentLocation);
         catch(Exception e) 
                e.printStackTrace();
        

    

Common.currentLocation 字符串在 locationUpdates 开始后更新。但是,我想在我的主要活动中等待,直到该字段更新。

如果我在我的活动中放置一个 while 循环以等待更新 Common.currentLocation 字段,则线程将暂停并且不会调用 onLocationChanged 方法(不打印日志消息)。

一旦调用 onLocationChanged 并且纬度和经度值可用,从 onLocationChanged 方法获取更新到公共接口/活动的最佳方式是什么?任何帮助将不胜感激。

【问题讨论】:

您的位置监听器是否在您请求更新的同一活动中? 不,这是不同的课程。我应该在活动中将其设为私有内部类吗? 【参考方案1】:

如果您需要将侦听器放在一个类中以实现可重用性,那么有许多方法可以提供信息

要记住的重要一点是,Android 是一个事件驱动的系统,因此您需要创建一种方法,让类创建一个事件,然后响应任何对此感兴趣的方,而不是通过轮询来“等待”结果事件。

如果您不需要可重用性,最简单的做法是在同一个活动中简单地实现侦听器并在那里进行处理,例如

public class yourclass extends Activity implements LocationListener 
  ...

  public void onLocationChanged(Location location) 
     ...
  


下一个最简单的方法是在你的类中创建一个带有监听器的接口,所以,这不是没有错误并且来自内存,但你会得到一般的想法,实际上这只是在你的类和事件监听器之间放置一个层但它确实将你的听众隔离到一个可以很容易地被其他活动使用的类中,也不是我没有做任何事情来考虑多个活动注册注销等。

public mylistenerclass implements LocationListener 
   ...

   public interface LocationEvents  
      public abstract void onLocationEvent(Location location); 
   

   LocationEvents mListener = null; 

   public void registerForEvents(LocationEvents eventListener, ... any-params) 
      ... start listening for location stuff
      mListener = eventListener;

   

    public void unregisterForEvents(LocationEvents eventListener) 
      ... end listening for location stuff
      mListener = null;

     

    public void onLocationChanged(Location location) 
         ... 
         if (null != mListener)
            mListener.onLocationEvent(location); 
     

公共类 yourclass 扩展 Activity 实现 LocationEvents ...

  @Override
  public void onResume() 
      super.onResume();      
      registerForEvents(locationEvent, anyparams); 
  

  @Override
  public void onPause() 
      super.onPause();      
      unregisterForEvents(locationEvent); 
  


您还可以使用服务,或从您的班级广播意图。我建议,如果您的其他活动不需要该功能,则只需在现有活动中实现侦听器即可开始并去那里

【讨论】:

谢谢,我会尝试第一个选项并从那里获取。 对不起,老兄生病了一段时间。将得到这个工作并接受答案。 所以终于有时间做这个了。在主要活动中实现了 locationListener,一切看起来都不错。谢谢。【参考方案2】:

您不应该忙着等待(例如在循环中)位置更新。 LocationManager 实现了 requestSingleUpdate(String provider, PendingIntent intent) 方法。考虑使用PendingIntent 通知您的活动更新可用。 requestSingleUpdate 还有多种其他形式,请参阅此处了解更多信息: http://developer.android.com/reference/android/location/LocationManager.html

【讨论】:

知道了,但我不仅需要向一项活动发送通知,还需要向两项活动发送通知。找不到使用 PendingIntent 执行此操作的方法。如果有办法,请告诉我。 将通知(例如上面提到的 PendingIntent)发送到单个组件(例如 Activity)并从那里分发信息。为此,您可以使用 Android 提供的适合您情况的任何通信方法,例如广播或消息。

以上是关于一旦 GPS 更新开始,Android GPSListener 就会收到通知的主要内容,如果未能解决你的问题,请参考以下文章

在网络和 GPS 提供商之间切换

一般 Android GPS 行为

在 android 中获取更新位置和禁用 GPS 后如何获取?

应用程序空闲时如何在android中停止GPS更新?

Android Gps Tracker 没有及时更新

如何忽略 android 中的 irelevent gps 位置更新?