Android服务将对位置更改执行操作

Android服务将对位置更改执行操作,android,service,location,Android,Service,Location,我正在尝试创建一个服务,每隔几分钟检查一次用户的位置,并在位置更改时执行某些代码 这是我的服务的onCreate代码 public void onCreate() { super.onCreate(); Log.i(TAG, "Service creating"); //timer = new Timer("TweetCollectorTimer"); //timer.schedule(updateTask, 1000L, 60

我正在尝试创建一个服务,每隔几分钟检查一次用户的位置,并在位置更改时执行某些代码

这是我的服务的onCreate代码

public void onCreate() {
        super.onCreate();
        Log.i(TAG, "Service creating");

        //timer = new Timer("TweetCollectorTimer");
        //timer.schedule(updateTask, 1000L, 60 * 1000L);
        LocationManager lm = (LocationManager)getSystemService(Context.LOCATION_SERVICE); 
          lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
      }
当我的位置改变时,它能够做一些事情。然而,我在我的logcat中得到了以下警告“向死线程上的处理程序发送消息”


我想知道问题出在哪里,有没有更好的方法来实现我想做的事情?

你必须对你的位置和活动生命周期保持警惕

如果您在活动的
onCreate()
方法中请求位置更新,请务必稍后取消注册,例如
onDestroy()
,尽管我认为最好先注册
onStart()
,然后取消注册
onStop()

似乎您的位置侦听器正在调用一个可能已经停止的活动的方法

如果您计划在多个活动中实现位置检测,那么最好创建一个基类,其中包含一个在位置更新时调用抽象方法的侦听器。您可以通过覆盖
onStart()
来注册您的侦听器,并覆盖
onStop()
来注销您的侦听器,从而进一步推动它。尽管如此,不要忘记在抽象类和子类中调用超级构造函数

希望这会有帮助,而且不会太混乱

编辑:

代码示例如下所示:

public abstract class LocationActivity extends Activity {

    private LocationListener mLocationListener;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(final Location location) {
                updateLocation(location);
            }

            @Override
            public void onStatusChanged(final String provider,
                    final int status, final Bundle extras) {
            }

            @Override
            public void onProviderEnabled(final String provider) {
            }

            @Override
            public void onProviderDisabled(final String provider) {
            }
        };
    }

    @Override
    protected void onStart() {
        super.onStart();

        // register your listener with the location manager
    }

    @Override
    protected void onStop() {
        super.onStop();

        // unregister your listener from the location manager
    }

    protected abstract void updateLocation(Location location);
}

您必须对您的位置和活动生命周期保持警惕

如果您在活动的
onCreate()
方法中请求位置更新,请务必稍后取消注册,例如
onDestroy()
,尽管我认为最好先注册
onStart()
,然后取消注册
onStop()

似乎您的位置侦听器正在调用一个可能已经停止的活动的方法

如果您计划在多个活动中实现位置检测,那么最好创建一个基类,其中包含一个在位置更新时调用抽象方法的侦听器。您可以通过覆盖
onStart()
来注册您的侦听器,并覆盖
onStop()
来注销您的侦听器,从而进一步推动它。尽管如此,不要忘记在抽象类和子类中调用超级构造函数

希望这会有帮助,而且不会太混乱

编辑:

代码示例如下所示:

public abstract class LocationActivity extends Activity {

    private LocationListener mLocationListener;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        mLocationListener = new LocationListener() {
            @Override
            public void onLocationChanged(final Location location) {
                updateLocation(location);
            }

            @Override
            public void onStatusChanged(final String provider,
                    final int status, final Bundle extras) {
            }

            @Override
            public void onProviderEnabled(final String provider) {
            }

            @Override
            public void onProviderDisabled(final String provider) {
            }
        };
    }

    @Override
    protected void onStart() {
        super.onStart();

        // register your listener with the location manager
    }

    @Override
    protected void onStop() {
        super.onStop();

        // unregister your listener from the location manager
    }

    protected abstract void updateLocation(Location location);
}

请注意,此服务是后台服务位置更改时执行的代码是什么?请注意,此服务是后台服务位置更改时执行的代码是什么?很抱歉,由于我先在其他领域进行了开发,所以回复太晚。您提到创建基类。我对此不太确定,能否提供一个简单的例子,我将尝试从那里开始工作?谢谢。我添加了一个简短的代码示例。基本上,工作流程是,扩展这个类,创建一个监听器onCreate,在启动时注册监听器,在顶部注销监听器(您必须自己检查要注册和注销的代码,因为我无法通过head来理解它)。当有更新时,将触发updateLocation,扩展此LocationActivity的活动将必须实现此方法来处理新位置。希望它能为你指明正确的方向!基本上现在我不需要在这个基类中添加任何东西。假设我有两个活动需要实现它,我必须创建两个子活动,分别用实现扩展这个类。然后在这两个活动中我使用它们:locationListenerChild1 mlLocationListener=new LocationListener();在那之后,我不需要做任何其他事情,听者会注意在活动中改变位置后要做什么。如果我错了,请纠正我。很抱歉,由于我先在其他领域进行了开发,所以回复太晚。您提到创建基类。我对此不太确定,能否提供一个简单的例子,我将尝试从那里开始工作?谢谢。我添加了一个简短的代码示例。基本上,工作流程是,扩展这个类,创建一个监听器onCreate,在启动时注册监听器,在顶部注销监听器(您必须自己检查要注册和注销的代码,因为我无法通过head来理解它)。当有更新时,将触发updateLocation,扩展此LocationActivity的活动将必须实现此方法来处理新位置。希望它能为你指明正确的方向!基本上现在我不需要在这个基类中添加任何东西。假设我有两个活动需要实现它,我必须创建两个子活动,分别用实现扩展这个类。然后在这两个活动中我使用它们:locationListenerChild1 mlLocationListener=new LocationListener();在那之后,我不需要做任何其他事情,听者会注意在活动中改变位置后要做什么。如果我错了,请纠正我。