0

我的问题与这个问题相同, 在 IntentService 中实现的 Android LocationLister 从不执行 OnLocationChanged() 方法,但不幸的是我无法理解这一点,我用于从 android 设备获取位置的代码在活动中运行良好,但是当涉及到意图服务,永远不会调用 onLocationChanged() 方法。

该服务的其他部分运行良好,因为我还在同一服务中实现了通知管理器示例以跟踪各种变量的值,但由 onLocationChanged() 修改的变量永远不会被修改,描述了该方法没有被执行。请帮忙

4

2 回答 2

2

IntentService 不会等待您的 onLocationChangedListener ,如果您的 IntentService 的最后一部分是取消注册您的位置更改侦听器,那么这就是您的问题。

您可以做的是将您的 IntentService 转换为常规服务。检查不同的操作,其中一个是您收到新位置时的下一步。

IE

private class MyLocationListener implements LocationListener {
    public void onLocationChanged(Location location) {
        Intent intent = new Intent(this,MyService.class);
        intent.setAction("LOCATION_RECEIVED");
        intent.putExtra("locationUpdate",location);
        locationManager.removeUpdates(this);
        this.startService(intent);
    }
    public void onStatusChanged(String s, int i, Bundle bundle) {}
    public void onProviderEnabled(String s) {}
    public void onProviderDisabled(String s) {}
}

并在您的服务上...

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    if (intent!=null) {
        String action = intent.getAction();
            if (action!= null) {
                if (action.equals("LOCATION_RECEIVED")) {
                    Location location = null;
                    if (intent.hasExtra("locationUpdate")) {
                        location = intent.getExtras().getParcelable("locationUpdate");
                        //Process new location updates here
                    }

另一种方法是在 LocationListener 上使用 Pending 意图,但它的效果与上面的代码相同。第三种方法是从 OnLocationChangedListener 向您的 IntentService 发布一个可运行的(我个人没有尝试过这个。)

如果您可以在这里分享一些代码,将不胜感激。如果您还有其他问题。当我正在从事类似的项目时,我可能会有所帮助,从服务获取位置。

于 2013-11-26T08:54:20.623 回答
0

据我记得,位置传感器需要在 UI 线程中运行。一个活动在那里运行,但一个服务在后台运行。

在您的代码中添加一些密集的日志记录和异常处理以找出答案。

如果这是原因,那么有一种方法可以创建和注册一个Looper. 让我知道,我可以去我的代码中搜索

于 2013-10-26T08:30:43.113 回答