使用stopService()后GPS服务仍在运行

时间:2015-09-17 01:13:29

标签: java android service gps google-api-client

我的应用程序获得了一个后台服务,可以在一定的时间间隔内处理位置更新。我尝试停止服务以启动具有不同间隔的新服务,但最终发生的是应用程序以不同的间隔发送两个位置更新。基本上,我的第一个服务在使用stopService()后不会停止。

这是启动服务的代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login_activity_f);

        tiempoGPS = 25000;
        startService(new Intent(getBaseContext(), ServicioDeFondo.class).putExtra("TiempoGPS", Integer.toString(tiempoGPS)));

    }

这是我点击按钮后停止它的部分:

 private void selectItem(int position) {

...

        if(menus[position].equals("Configuracion"))
        {
            try {

                stopService(new Intent(getBaseContext(),ServicioDeFondo.class));

            }
            catch(Exception e)
            {
                ...
            }
        }

}

这是我的Service类onCreate方法:

 @Override
    public void onCreate()
    {
        mHandler = new Handler();
        TelephonyManager telephonyManager = (TelephonyManager)getSystemService(Context.TELEPHONY_SERVICE);
        telefonoID = telephonyManager.getDeviceId();
        telephonyManager = null;

        createLocationRequest();
        buildGoogleApiClient();
        mGoogleApiClient.connect();
    }

OnstartCommand方法:

@Override
    public int onStartCommand(Intent intent, int flags, int startId)
     {
         tiempoEntreActualizacion = Integer.parseInt((String)  intent.getExtras().get("TiempoGPS"));

        reportarGPS = new Thread(new Runnable() { public void run()
        {
            try
            {
                while(true)
                {
                    try {
                        Thread.sleep(tiempoEntreActualizacion);
                        new APISendClass().execute();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                        mGoogleApiClient.disconnect();
                        Thread.currentThread().interrupt();
                        return;
                    }
                }
            }
         catch (Exception e)
        {
            //TODO Auto-generated catch block
            e.printStackTrace();
        }
        } });

        reportarGPS.start();

        return START_NOT_STICKY;
    }

这是我的服务类onDestroy方法:

@Override
    public void onDestroy(){
    reportarGPS.interrupt();
    reportarGPS = null;
            LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient, (com.google.android.gms.location.LocationListener) this);
        mGoogleApiClient.disconnect();

    mGoogleApiClient = null;
    mHandler.removeCallbacksAndMessages(null);
    Thread.currentThread().interrupt();
    super.onDestroy();
}

最后但并非最不重要的是,我启动locationUpdates的方法:

@Override
    public void onConnected(Bundle bundle) {
        Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(
            mGoogleApiClient);
        if (mLastLocation != null) {
            latitude =String.valueOf(mLastLocation.getLatitude());
            longitude = String.valueOf(mLastLocation.getLongitude());
        }
        startLocationUpdates();
    }


    protected void startLocationUpdates() {
        LocationServices.FusedLocationApi.requestLocationUpdates(
            mGoogleApiClient, mLocationRequest, this);
    }

现在已经坚持了2天。我确定它有一些非常基本的错误,但我无法指出它,我的onDestroy方法已被调用,但即使在运行它之后,该位置仍在更新中。为什么??我如何完全杀死该服务?

1 个答案:

答案 0 :(得分:-2)

你的线程错了。如果它被打断,它永远不会出现问题。中断线程不会阻止它,它会设置一个标志,线程可以检查它是否完成。 (由于各种原因,从任何地方停止线程本身都是一个非常糟糕的主意)。在线程中使用while循环检查isInterrupted并从其run函数返回(如果为true)。