我的问题与此问题相同, Android LocationLister implemented in IntentService never execute the OnLocationChanged() method但不幸的是我无法理解这一点,我从Android设备获取位置的代码在活动中工作正常但是当涉及到意图服务时,onLocationChanged()方法永远不会被调用。
该服务的其他部分运行良好,因为我还在同一服务中实现了通知管理器示例以跟踪各种变量的值,但是onLocationChanged()修改的变量永远不会被修改,描绘该方法没有被执行。 请帮忙
答案 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
。让我知道,我可以去搜索我的代码