1
稱爲在我的應用程序需要獲取用戶的位置,這是我迄今所做的:廣播接收器不被服務
我有一個界定的業務實現LocationListener的接口LocationActivity:
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方法。我真的不知道我做錯了什麼。
有人可以幫忙嗎?
感謝很多提前
感謝JohnCookie,我加入以下行爲意圖和過濾器,但沒有任何反應:org.goallabs.android.app.thedayafter.location.LOCATION_READY。任何其他想法?非常感謝 – pindleskin 2012-02-14 02:51:45
用於sendBroadcast的Intent不需要設置類,只是一個空的Intent。 Intent intent = new Intent(); intent.setAction(..); sendBroadcast(intent); – JohnCookie 2012-02-14 03:16:09
非常感謝你,它現在像一個魅力。 – pindleskin 2012-02-14 03:22:24