Я реализовал Сервис для прослушивания местоположения пользователя:
public class ListenLocationService extends Service {
private final IBinder mBinder = new LocalBinder();
public interface ILocationService {
public void StartListenLocation();
public Location getUserLocation();
}
public class LocalBinder extends Binder implements ILocationService{
LocationManager locationManager;
LocationListener locationListener;
Location userLocation = null;
public void StartListenLocation()
{
locationManager = (LocationManager)ListenLocationService.this.getSystemService(Context.LOCATION_SERVICE);
locationListener = new LocationListener() {
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
public void onLocationChanged(Location location) {
userLocation = location;
Log.d("Service", "Location changed at: "+userLocation.toString());
}
};
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0, locationListener);
}
public Location getUserLocation(){
Log.d("Service", "return location: "+userLocation.toString());
return userLocation;
}
public void onPause() {
//super.onPause();
locationManager.removeUpdates(locationListener);
}
public void onResume() {
//super.onResume();
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
0, 0, locationListener);
}
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
В классе LocalBinder
есть переменная Location userLocation
.
Я поместил Log.d
в onLocationChanged
функцию, так что я увидел, что значение userLocation в порядке.
В первом занятии я связываю его с моей службой и вызываю StartListenLocation
метод:
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
mService = (ILocationService) service;
mService.StartListenLocation();
}
public void onServiceDisconnected(ComponentName arg0) {
}
};
public void onCreate(Bundle savedInstanceState) {
...
Intent intent = new Intent(this, ListenLocationService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
...
}
Во втором упражнении я также связываюсь со службой и вызываю getUserLocation()
метод:
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
mService = (ILocationService) service;
Location userLocation = mService.getUserLocation();
showUserLocation(userLocation);
}
public void onServiceDisconnected(ComponentName arg0) {
}
};
public void onCreate(Bundle savedInstanceState) {
...
Intent intent = new Intent(this, ListenLocationService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
...
}
Однако здесь userLocation
переменная равна нулю, несмотря на ненулевое значение в выводе из вызова метода из первой операции.
Мне нужно запустить Сервис с моей первой Деятельности и начать обновление userLocation
с этого момента и во время всех других работ в Деятельности.
В следующем задании я пытаюсь получить userLocation
, но я получаю ноль. Почему это происходит?
Почему я не могу манипулировать переменной внутри методов Service и получать ее там, где мне нужно?