当gps提供程序花费很长时间获取位置时,使用pendingIntent的位置Manager.RequestLocationUpdates始终广播相同的位置

时间:2014-04-10 11:44:18

标签: java android gps android-pendingintent location-provider

我是Android开发新手,我希望我的设备在后台模式下每40秒获取一次GPS位置,即使在应用程序被杀之后也是如此。为此,在MyAlarm.class中,我每隔40秒设置一次重复警报,以调用" RepeatingAlarm.class(扩展BroadcastReceiver)"使用待定意图。在" RepeatingAlarm.class"的onReceive方法中每40秒调用一次,我创建了另一个挂起的意图来调用MyReceiver.class(它扩展了BroadcastReceiver)。我已经通过了在" RepeatingAlarm.class"中创建的这个待定意图。到requestLocationUpdate函数,获取GPS位置。

我的问题在于,有时候我会每隔40秒重复获得相同的纬度和长值,持续至少3分钟。

然后,我的MyReceiver.class的onReceive方法每秒调用一次,而不是在收到GPS位置后调用。我在下面粘贴了我的代码,请帮我解决。

MyAlarm.class

public void StartAlarm(Context context)
{
 AlarmManager alm=(AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
 Intent intent = new Intent(context, RepeatingAlarm.class);
 PendingIntent pi = PendingIntent.getBroadcast(context, 0, intent, 0);
 alm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 40000, pi);
}

RepeatingAlarm.class

public class RepeatingAlarm extends BroadcastReceiver
{
 public static LocationManager locationManager = null;
 public static PendingIntent pendingIntent = null;
 @Override
 public void onReceive(Context context, Intent intent) 
 {
   locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
   Intent intentp = new Intent(context, MyReceiver.class);
   pendingIntent = PendingIntent.getBroadcast(context, 0, intentp, PendingIntent.FLAG_UPDATE_CURRENT); 
   Criteria criteria = new Criteria(); 
   criteria.setAccuracy(Criteria.ACCURACY_FINE);
   provider = locationManager.getBestProvider(criteria, true);
   if(provider != null)
   {            
    locationManager.requestSingleUpdate(locationManager.GPS_PROVIDER, pendingIntent);
   }
 }
}

MyReceiver.class

public class MyReceiver extends BroadcastReceiver
{
 @Override
 public void onReceive(Context context, Intent intent) 
 {
  String locationKey = LocationManager.KEY_LOCATION_CHANGED;
  if (intent.hasExtra(locationKey)) 
  {

   Location location = (Location)intent.getExtras().get(locationKey);
   double mlatitude = location.getLatitude();
   double mlongitude = location.getLongitude();
   if(RepeatingAlarm.locationManager != null  && RepeatingAlarm.pendingIntent)
   {
     RepeatingAlarm.locationManager.removeUpdates(RepeatingAlarm.pendingIntent);
   }

  }
 }
}

在上面的代码中,GPS位置每40秒就会收到一次。但是,有时候,如果GPS需要很长时间才能让位置说15分钟,之后每隔40秒就会重复相同的位置,直到大约4分钟。这是我的主要问题。

然后,MyReceiver.class每秒都会频繁调用。请帮我一些代码行来解决这个问题。谢谢大家。

1 个答案:

答案 0 :(得分:0)

根据开发人员文档requestSingleUpdate()方法"使用指定的提供者和待处理的意图注册单个位置更新。"

您需要使用requestLocationUpdates()方法。

此方法的第二个参数minimum time interval between location updates, in milliseconds将允许您再次获取位置&试。