gpt4 book ai didi

android - 从类访问 LocationManager/LocationListener

转载 作者:太空宇宙 更新时间:2023-11-03 11:52:48 25 4
gpt4 key购买 nike

我有点迷路了:在我的主要 Activity 中,我注册了一个 LocationManager 并将其连接到 LocationListener 以使用 myLocation.getLatitude() 等。

现在我需要使用另一个类中的 Location- 方法。

我无法使用其他类中的那些对象,因为我无法实例化主要 Activity 。我不能使用 getter 传递 L.Manager 或 L.Listener,因为它们又是非静态的。

那么,一般来说,我如何访问我在主要 Activity 中创建的对象?关于如何更好地组织这个的任何提示?主要 Activity 类中的 LocationListener 类通常是一件愚蠢的事情吗?

public class URNavActivity extends Activity

{
public LocationManager mlocManager;
public LocationListener mlocListener;
...
}

public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
mResourceProxy = new DefaultResourceProxyImpl(getApplicationContext());

actVar=this;

initGraph();
setMap();
gpsEnable();
initMyLocation();
getItems();
initOverlay();
}

public void gpsEnable ()
{
mlocManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);

mlocListener = new MyLocationListener();

mlocManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 0, 0, mlocListener);
}

public class MyLocationListener implements LocationListener

{

@Override

public void onLocationChanged(Location loc)

{

loc.getLatitude();
loc.getLongitude();
myMap.getController().setCenter(new GeoPoint(lati, longi));
}

最佳答案

首先,您的 LocationListener 不应成为 Activity 的一部分。 Activity 有一个明确定义的生命周期,可以根据需要由 Android 框架生成和销毁。因此,您的 Activity 的实例变量将需要在您的 Activity 的 onResume() 方法中重新初始化,使它们完全不适合长期存储。

所以。首先创建一个粘性服务来管理位置更新的启动和停止。粘性意味着服务实例在调用之间挂起,因此您可以可靠地使用实例变量并且知道它们将保留它们的值直到服务终止。该服务还应该实现 LocationListener 接口(interface),现在它可以存储调用 onLocationChanged 时通知给它的位置:

public class LocationService extends Service implements LocationListener {

private LocationManager locationManager;

private Location location;

@Override
public int onStartCommand(final Intent intent, final int flags, final int startId) {

Logging.i(CLAZZ, "onHandleIntent", "invoked");

if (intent.getAction().equals("startListening")) {
locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, this);
}
else {
if (intent.getAction().equals("stopListening")) {
locationManager.removeUpdates(this);
locationManager = null;
}
}

return START_STICKY;

}

@Override
public IBinder onBind(final Intent intent) {
return null;
}

public void onLocationChanged(final Location location) {
this.location = location;
// TODO this is where you'd do something like context.sendBroadcast()
}

public void onProviderDisabled(final String provider) {
}

public void onProviderEnabled(final String provider) {
}

public void onStatusChanged(final String arg0, final int arg1, final Bundle arg2) {
}

}

现在您有了一项服务,您可以根据需要启动和停止位置更新。这还允许您继续接收和处理位置更改,即使您的应用程序不在前台(如果您需要的话)。

关于如何使位置信息可用,您现在有两种选择:使用 context.sendBroadcast() 将新位置传播到(例如) Activity ,或使用绑定(bind)服务方法允许其他类调用公开的API并获取Location。参见 http://developer.android.com/guide/topics/fundamentals/bound-services.html有关创建绑定(bind)服务的更多详细信息。

请注意,为了清楚起见,我没有在此处包括许多其他方面的监听位置更新。

关于android - 从类访问 LocationManager/LocationListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7759504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com