我正在开发基于位置的Android应用。为了测试LocationListener接口的onLocationChanged(),我创建了一个MockLocationProvider类,该类将一个名为MOCK_PROVIDER的测试提供程序添加到位置管理器实例中。在我的代码中添加MockLocationProvider类之前,位置管理器实例仅显示3个提供程序-GPS,Network和Passive。但是,当我运行代码以使用MockLocationProvider时,位置管理器实例将显示4个提供程序-GPS,网络,被动和MOCK_PROVIDER。因此,在将测试提供程序添加到位置管理器实例时,它抛出异常,表明MOCK_PROVIDER已经存在。我还创建了一个关闭方法,该方法将在应用程序终止时删除MOCK_PROVIDER。我不知道为什么MOCK_PROVIDER仍然存在于我的位置管理器实例中。现在,即使我不使用MockLocationProvider,位置管理器仍会显示4个提供程序。请告诉我为什么这是奇怪的行为。我做错什么了吗?
以下是MockLocationProvider类的代码段:
public class MockLocationProvider {
private String providerName;
private Context context;
private LocationManager locationManager;
public MockLocationProvider(LocationManager manager, String name, Context ctx) {
providerName = name;
context = ctx;
locationManager = manager;
for(String provider: locationManager.getAllProviders()) {
System.out.println("provider: " + provider);
}
locationManager.addTestProvider(providerName, false,false, false,
false, true, true, true, 0, 5);
locationManager.setTestProviderEnabled(providerName, true);
}
public void pushLocation(double latitude, double longitude) {
Location mockLocation = new Location(providerName);
mockLocation.setLatitude(latitude);
mockLocation.setLongitude(longitude);
mockLocation.setAltitude(0);
mockLocation.setAccuracy(1);
mockLocation.setElapsedRealtimeNanos(1000);
mockLocation.setTime(System.currentTimeMillis());
locationManager.setTestProviderLocation(providerName, mockLocation);
}
public void shutdown() {
locationManager.clearTestProviderEnabled(providerName);
locationManager.removeTestProvider(providerName);
}
}
以下是LocationService服务的onDestroy()代码,我们应该对其进行覆盖:
@Override
public void onDestroy() {
stopForeground(true);
if(mockLocationProvider != null) mockLocationProvider.shutdown();
if(mLocationManager != null && mLocationListener != null){
mLocationManager.removeUpdates(mLocationListener);
}
super.onDestroy();
}