2012-02-14 6 views
1

В моем приложении я должен получить местоположение пользователя, и это то, что я сделал до сих пор:BroadcastReceiver не вызывается службой

У меня есть LocationActivity, ограничивающий в сервис, реализующего интерфейс LocationListener:

public class LocationActivity extends MapActivity { 

private MapView mMapView; 
private MapController mMapController; 

private List<Overlay> mMapOverlays; 
private Drawable drawable; 
private CustomItemizedOverlay mItemizedOverlay; 

private boolean mIsBound; 
private LocationService mBoundService; 

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.map); 

    this.mMapView = (MapView)findViewById(R.id.mapview);   
    this.mMapView.setBuiltInZoomControls(true); 
    this.mMapController = this.mMapView.getController(); 
    this.mMapController.setZoom(18); 
    this.mMapView.setClickable(true); 
    this.mMapView.setEnabled(true);  

    this.mMapOverlays = this.mMapView.getOverlays(); 
    this.drawable = this.getResources().getDrawable(R.drawable.map_pin); 
    this.mItemizedOverlay = new CustomItemizedOverlay(this.drawable); 
} 

@Override 
protected void onResume() { 
    super.onResume();  
    doBindService(); 
    this.registerReceiver(this.mBroadcastReceiver, new IntentFilter()); 
} 

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


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

@Override 
protected void onDestroy() { 
    super.onDestroy();  
    doUnbindService(); 
    this.unregisterReceiver(this.mBroadcastReceiver); 
} 

@Override 
protected boolean isRouteDisplayed() { 
    return false; 
} 

private ServiceConnection mConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     // This is called when the connection with the service has been 
     // established, giving us the service object we can use to 
     // interact with the service. Because we have bound to a explicit 
     // service that we know is running in our own process, we can 
     // cast its IBinder to a concrete class and directly access it. 
     mBoundService = ((LocationService.LocationBinder)service).getService(); 

     // Tell the user about this for our demo. 
     Toast.makeText(LocationActivity.this, R.string.local_service_connected, 
       Toast.LENGTH_SHORT).show(); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     // This is called when the connection with the service has been 
     // unexpectedly disconnected -- that is, its process crashed. 
     // Because it is running in our same process, we should never 
     // see this happen. 
     mBoundService = null; 
     Toast.makeText(LocationActivity.this, R.string.local_service_disconnected, 
       Toast.LENGTH_SHORT).show(); 
    } 
}; 

void doBindService() { 
    // Establish a connection with the service. We use an explicit 
    // class name because we want a specific service implementation that 
    // we know will be running in our own process (and thus won't be 
    // supporting component replacement by other applications). 
    bindService(new Intent(LocationActivity.this, 
      LocationService.class), mConnection, Context.BIND_AUTO_CREATE); 
    mIsBound = true; 
} 

void doUnbindService() { 
    if (mIsBound) { 
     // Detach our existing connection. 
     unbindService(mConnection); 
     mIsBound = false; 
    } 
}  

private BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     Toast.makeText(LocationActivity.this, "ooooooooo", Toast.LENGTH_SHORT).show(); 
     Location location = LocationActivity.this.mBoundService.getLocation(); 

     int lat = (int) (location.getLatitude() * 1E6); 
     int lng = (int) (location.getLongitude() * 1E6); 
     GeoPoint point = new GeoPoint(lat, lng); 
     mMapController.animateTo(point); 

     OverlayItem overlayitem = new OverlayItem(point, "", ""); 

     mItemizedOverlay.addOverlay(overlayitem); 
     mMapOverlays.add(mItemizedOverlay); 
    } 
}; 

} 

И мой LocationService:

public class LocationService extends Service implements LocationListener { 

private LocationManager mLocationManager; 
private Location mLocation; 

/** 
* Class for clients to access. Because we know this service always 
* runs in the same process as its clients, we don't need to deal with 
* IPC. 
*/ 
public class LocationBinder extends Binder { 
    public LocationService getService() { 
     return LocationService.this; 
    } 
} 

@Override 
public void onCreate() { 
    this.mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    this.mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this); 
} 

@Override 
public int onStartCommand(Intent intent, int flags, int startId) {   
    return START_STICKY; 
} 

@Override 
public void onDestroy() { 
    // Tell the user we stopped. 
    Toast.makeText(this, R.string.local_service_stopped, Toast.LENGTH_SHORT).show(); 
} 

@Override 
public IBinder onBind(Intent intent) { 
    return mBinder; 
} 

// This is the object that receives interactions from clients. See 
// RemoteService for a more complete example. 
private final IBinder mBinder = new LocationBinder(); 

public Location getLocation() { 
    return this.mLocation; 
} 

@Override 
public void onLocationChanged(Location location) { 
    // TODO Auto-generated method stub 
    this.mLocation = location; 
    Intent intent = new Intent(this, LocationActivity.class); 
    sendBroadcast(intent); 
} 

@Override 
public void onProviderDisabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onProviderEnabled(String provider) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onStatusChanged(String provider, int status, Bundle extras) { 
    // TODO Auto-generated method stub 

} 

} 

что я хочу добиться того, чтобы сказать, что деятельность местоположение изменилось, так что он может вызвать службу для размещения данные. Я называю sendBroadcast() в своей службе и имею BroadcastReceiver в своей деятельности.

Служба запускается и останавливается правильно, когда это необходимо. Также метод onLocationChanged в службе вызывается правильно, проблема в том, что я не могу получить вызванный метод onReceive. Я не знаю, что я делаю неправильно.

Может кто-нибудь помочь в этом?

спасибо заранее

ответ

2

В sendBroadcast, добавьте действие намерению:

intent.setAction("example.package.location"); 

и в деятельности добавить IntentFilter, а также:

filter.addAction("example.package.location"); 
+0

Спасибо JohnCookie, я добавил следующее действие для намерения и фильтра, но ничего не происходит: org.goallabs.android.app.thedayafter.location.LOCATION_READY. любая другая идея? спасибо заблаговременно – pindleskin

+0

Намерение, используемое для sendBroadcast, не нужно устанавливать класс, просто пустое намерение. Intent intent = new Intent(); intent.setAction (..); sendBroadcast (намерение); – JohnCookie

+0

Большое спасибо, сейчас он работает как шарм. – pindleskin

Смежные вопросы