2015-09-17 54 views
0

我的應用程序獲得了處理位置更新的後臺服務,該服務可以在特定的時間間隔進行處理。我試圖停止服務以不同的時間間隔啓動一個新服務,但最終發生的情況是應用程序以不同的時間間隔發送兩個位置更新。基本上,我的第一個服務在使用stopService()後不會停止。使用stopService後,GPS服務仍在運行()

下面是啓動服務的代碼:

@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) 
      { 
       ... 
      } 
     } 

} 

這裏我的服務類onCreate方法:

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

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

Onstart命令方法:

@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方法已被調用,但即使運行它,該位置仍在更新。爲什麼??我如何徹底殺死這項服務?

+0

你是否也在'selectItem(int)'中重新啓動它? –

+0

服務在onCreate中開始,在點擊按鈕後停止。這兩個方法都包含在問題中。 –

+0

在selectItem(int)之後,我在不同的活動中一起啓動一項新服務。在此之前,我希望服務完全被殺死。 –

回答

-2

您的帖子有誤。如果它被打斷了,它就不會發出cha cking聲。中斷一個線程並不會阻止它,它會設置一個標誌,線程本身可以檢查它是否完成。 (由於各種原因,從任何地方停止線程本身是一個非常糟糕的主意)。在線程檢查isInterrupted中讓你的while循環,如果爲true,則從其運行函數返回。

+0

在我發送數據的線程中,我得到了使用返回的InterExceptionException。 在哪裏我需要添加中斷標誌? –

+0

Thread.sleep(...)如果線程在休眠時被中斷,或者在被調用時已被中斷,則拋出'InterruptedException'。 –