Android: манипулируйте значением переменной в методах Service и извлекайте данные из разных Activity - PullRequest
0 голосов
/ 31 марта 2012

Я реализовал Сервис для прослушивания местоположения пользователя:

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 и получать ее там, где мне нужно?

1 Ответ

1 голос
/ 01 апреля 2012

Для достижения требуемого результата объявление Location userLocation должно быть перемещено в ListenLocationService класс.

Чтобы установить новое значение на userLocation, используйте этот код: userLocation.set(location);

потому что userLocation = new Location(location); вызывает удалить окончательный модификатор ошибка, даже если нет окончательного модификатора.

...