意图服务的位置更新(永远不会调用onLocationChanged)

时间:2013-10-26 06:10:56

标签: android intentservice locationlistener

我的问题与此问题相同, Android LocationLister implemented in IntentService never execute the OnLocationChanged() method但不幸的是我无法理解这一点,我从Android设备获取位置的代码在活动中工作正常但是当涉及到意图服务时,onLocationChanged()方法永远不会被调用。

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

2 个答案:

答案 0 :(得分:2)

IntentService不会等待你的onLocationChangedListener,如果你的IntentService的最后一部分要取消注册你的位置改变的监听器,那么你的问题就出现了。

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

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 intent,但它将与上面的代码具有相同的效果。第三种方法是从OnLocationChangedListener向您的IntentService发布一个runnable(我个人还没有尝试过这个。)

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

答案 1 :(得分:0)

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

为您的代码添加一些密集的日志记录和异常处理以查找。

如果这是原因,那么就有办法创建并注册Looper。让我知道,我可以去搜索我的代码