【问题标题】:Android Service to perform action on location change对位置更改执行操作的 Android 服务
【发布时间】:2012-01-12 15:55:04
【问题描述】:

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

这是我的服务的 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 中收到以下警告“向死线程上的处理程序发送消息”

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

【问题讨论】:

  • 注意这个服务是后台服务
  • 你在位置改变时执行什么代码?

标签: android service location


【解决方案1】:

您必须警惕您的位置监听器和您的活动生命周期。

如果您在活动的 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,注册监听器 onStart,取消注册监听器 onStop(你必须自己检查注册和取消注册的代码,因为我无法弄清楚) .当有更新时,会触发 updateLocation 并且扩展此 LocationActivity 的 Activity 将必须实现此方法来处理新位置。希望它能为您指明正确的方向!
  • 好的,现在基本上我不需要在这个基类中添加任何东西。比方说,如果我有 2 个活动需要实现它,我必须创建 2 个子类来扩展这个类,并分别实现。然后在 2 个活动中使用它们: locationListenerChild1 mLocationListener = new LocationListener();之后,我不必做任何其他事情,听众将负责在该活动中做什么 onLocationChanged。如果我错了,请纠正我。
猜你喜欢
  • 2012-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2020-06-01
  • 1970-01-01
相关资源
最近更新 更多