不可阻挡的Android服务,即监听地理位置

时间:2012-04-04 12:08:23

标签: android service geolocation gps unbind

我为侦听用户位置实施了Android服务:

public class ListenLocationService extends Service {
    IBinder mBinder = new LocalBinder();      
    public interface ILocationService {     
          Location userLocation = new Location("");
          public void StartListenLocation();
          public void StopListenLocation();
          public Location getUserLocation();
        }
    LocationManager locationManager;
    LocationListener locationListener;
    public class LocalBinder extends Binder implements ILocationService{

        public void StopListenLocation(){
            //so many attempts to stop service and no one helped
            locationManager.removeUpdates(locationListener);
            locationListener = null;
            stopSelf();
        }

        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.set(location);
                }
            };
            //if I have only one requestLocationUpdates situation is the same

                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 
                        400, 1, locationListener);
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 
                        400, 1, locationListener);
            }

        public Location getUserLocation(){
            return userLocation;
        }
    }

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

}

我在两项活动中绑定了这项服务。在第一项活动中,我只是推出服务:

    private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className,
                IBinder service) {
            mService = (ILocationService) service; 
            mService.StartListenLocation();   
        }

        public void onServiceDisconnected(ComponentName arg0) {
            Log.d("LOG","onServiceDisconnected");
        }
    };

    public void onCreate(Bundle savedInstanceState) {
...
        Intent intent = new Intent(this, ListenLocationService.class);
        bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
...
}
    @Override 
    public void onStop(){
        super.onStop();
        unbindService(mConnection);
        mService.StopListenLocation();      
    }

如果我在我的应用程序中仅启动第一个活动并关闭它然后服务停止 - GPS标记从设备屏幕消失。

但是,如果我进入第二个活动(我正在获取userLocation)并且在此关闭之后(使用Android后退按钮),那么我的屏幕上仍然会有GPS标记!

第二项活动的代码:

    private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className,
                IBinder service) {
            mService = (ILocationService) service;             
            userLocation = mService.getUserLocation();              
        }

        public void onServiceDisconnected(ComponentName arg0) {
        }
    };

    @Override
    public void onCreate(Bundle savedInstanceState) {
...
    Intent intent = new Intent(this, ListenLocationService.class);
    bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
...
}
    @Override 
    public void onStop(){
        super.onStop();
            unbindService(mConnection);
            mService.StopListenLocation();          

    }

你可以看到我用两个onStop()方法写的不仅unbindService(最初我认为它已经足够了),但我用这段代码调用StopListenLocation函数:

locationManager.removeUpdates(locationListener);
locationListener = null;
stopSelf();

如果仅绑定了第一个活动,它将停止服务。但是,如果两个活动都绑定了,则onStop()之后服务不会停止。我使用Log.d来确保调用所有方法:onStop(), stopListenLocation(), onBind()等。唯一的问题是onServiceDisconnected()不会被调用。

我想情况是我的服务启动了另一个用于收听位置的系统服务。我停止了我的服务,但是这个控制GPS的系统服务继续工作,尽管locationManager.removeUpdates(locationListener);。也许我错误地提出了我的建议。

如何在停止两项活动的情况下停止GPS?

1 个答案:

答案 0 :(得分:2)

BIND_AUTO_CREATE并不一定意味着当没有连接时服务将自行终止,它只是意味着如果系统需要资源,它就是斩波块上的第一件事。如果系统不是资源不足,它将让您的服务继续运行,因为如果您的活动再次想要服务,那么绑定到现有实例的时间比从头创建它要便宜。

简而言之,它会继续“运行”,但不要担心 - 它不会消耗其他任何需要的东西。

编辑:另请注意,仅仅因为您已从服务中取消绑定并不意味着它将中断服务异步处理的任何正在运行的处理任务。发生的一切都是你告诉操作系统你不再对结果感兴趣了。您必须在断开与服务的连接之前显式停止任何正在运行的任务,否则该任务将继续消耗CPU时间