2010-12-17 97 views
14

我對我的android應用程序有一個後臺服務,它獲取我的GPS位置並將其發送到遠程數據庫。它工作很好。stopService不會停止我的服務....爲什麼?

問題是當我想停止服務....它不停止:S。也沒有例外或logcat出現錯誤......它根本不停止。

這是開始我srvice代碼(一個按鈕):

startService(new Intent(GPSLoc.this, MyService.class)); //enciendo el service 

這是我阻止它(在onactivityresult方法)的代碼:

stopService(new Intent(GPSLoc.this, MyService.class)); 

我一直調試應用程序,我檢查了每次我調試stopService代碼行,但它不會停止......

我相信它不會停止導致我的數據庫我仍然REC當我按下按鈕停止服務時,從模擬器開始使用gps位置。

我在做什麼壞事?

回答

25

您是否實施了onDestroy()?如果不是,我相信這可能是解決方案 - 並且您會停止Timer或您在onDestroy()之內運行服務所用的任何內容。

服務可以通過調用其stopSelf()方法或通過調用Context.stopService()來停止。

有關更多信息,請參閱此link

+1

哦,我沒有實現的OnDestroy !!!!!!在服務上,我正在使用一個處理程序的線程和一個簡單的處理程序。 ¿如何阻止他們? – NullPointerException 2010-12-17 15:04:28

+0

它對我的作品,謝謝 – 2017-04-05 05:49:43

+1

我不明白爲什麼有必要實現onDestroy()。它只是一個生命週期回調方法。你能澄清一下嗎? – likejiujitsu 2017-06-17 21:59:04

0

也許您可能在每次調用停止服務時創建一個新的Intent。

stopService(new Intent(GPSLoc.this, MyService.class)); 

也許嘗試:

Intent intnet = new Intent(GPSLoc.this, MyService.class); // create el service 

startService(intenet); 
stopService(intent); 
+0

這段代碼不起作用,我試過了。 – user2580401 2013-11-30 20:57:42

8

我確信,它沒有停止的原因在我的數據庫,我仍然recive從模擬器GPS位置時,我都按按鈕停止該項服務。

您可能未註銷您的LocationListener

0

對於那些想定期向服務器發送請求的人,這是我的解決方案。你應該在你的活動或片段活動中有這個

{ 
private static final Long UPDATE_LOCATION_TIME = 30 * 60 * 1000l; // 30 minute 

private AlarmManager alarm; 
private PendingIntent pIntent; 
... 

@Override 
    protected void onResume() { 
     super.onResume(); 

     // Run background service in order to update users location 
     startUserLocationService(); 

     Log.e(TAG, "onResume"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 

     stopUserLocationService(); 

     Log.e(TAG, "onStop"); 
    } 

private void startUserLocationService() { 
     Log.i(TAG, "Starting service..."); 
     Intent intent = new Intent(MainFragmentHolder.this, ServiceUserLocation.class); 
     pIntent = PendingIntent.getService(this, 0, intent, 0); 

     alarm = (AlarmManager)getSystemService(Context.ALARM_SERVICE); 
     Calendar cal = Calendar.getInstance(); 
     alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), UPDATE_LOCATION_TIME, pIntent); 
    } 

    private void stopUserLocationService() { 
     alarm.cancel(pIntent); 
     Intent intent = new Intent(MainFragmentHolder.this, ServiceUserLocation.class); 
     stopService(intent); 
    } 

} 
2

這是非常普遍的情況,我需要在完成過程之前停止我的服務。在某些情況下,stopService(intent)是不夠的。你應該記住我的服務中的onDestroy()實現。例如:

public class MyIntentService extends IntentService { 

    // Defines and instantiates an object for handling status updates. 
    private BroadcastNotifier mBroadcaster = null; 
    private int progress = 0; //THIS IS MY COUNTER FOR EXAMPLE!!! 

    public MyIntentService() { 
     super("MyIntentService"); 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) { 

     progress = 0; 
     int tiempo_disponible = intent.getIntExtra("minutos_disponible", 0); 

     if (mBroadcaster == null){ 

      mBroadcaster = new BroadcastNotifier(this); 
     } 
     // Broadcasts an Intent indicating that processing has started. 
     mBroadcaster.broadcastIntentWithState(Constants.STATE_ACTION_STARTED); 

     mBroadcaster.broadcastIntentWithState(Constants.STATE_ACTION_RUNNING); 

     while (progress < tiempo_disponible) { 

      progress++; 
      try { 
       Log.i(Constants.TAG, "Procesing " + progress); 
       mBroadcaster.notifyProgress(progress); 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     // Reports that the feed retrieval is complete. 
     mBroadcaster.broadcastIntentWithState(Constants.STATE_ACTION_COMPLETE); 
    } 

    @Override 
    public void onDestroy() { 
     progress = 1000000; // WHITH THAT YOU FINISH THE CICLE IF tiempo_disponible NEVER IS MAYOR THAT 1000000, YOU CAN USE OTHER CONDITIONAL!!!!!! 
     super.onDestroy(); 
    } 
} 

這樣,當您使用stopService方法停止服務時,您也將停止進程o計數器。

public void stopService(){ 
     context.stopService(intent); 
     LocalBroadcastManager.getInstance(context).unregisterReceiver(responseReceiver); 
     responseReceiver = null; 
     intent = null; 
} 

保重! @yaircarreno

+1

您正在使用錯誤的服務類型。 IntentService是爲了管理其生命週期而設計的。 完成onHandleIntent方法的業務邏輯後 - IntentService將自行銷燬並釋放所有關聯的資源。 – 2014-12-11 11:32:11

1

如果你正在跟蹤GPS位置,你可能使用GoogleApiClient

的概念是,該服務不會停止,

如果GoogleApiClient實例中它仍然連接。

(或需要被銷燬/未註冊的第一任何其他問題)

因此,爲了使它的工作原理,你的服務中實現onDestroy()

@Override 
public void onDestroy() 
{ 
    // Unregistered or disconnect what you need to 
    // For example: mGoogleApiClient.disconnect(); 
    super.onDestroy(); 
} 
+1

我實際上是試圖停止使用谷歌API的服務,我忘了斷開API的OnDestroy ...!案例關閉.. – 2017-06-02 07:32:49

0

我的問題通過刪除添加視圖解決WindowManagerondestroy

public void onDestroy() { 
    isRunning = false; 
    super.onDestroy(); 
    if (checkBox!=null) { 
     windowManager.removeView(getlayoutparm(fabsetting,fabrateus,fabexit,true)); 
     windowManager.removeView(checkBox); 
    } 
} 
3

我有同樣的問題。我發現如果服務已連接GoogleApiClient並仍然獲取位置更新,則stopService()完全沒有影響,但該服務的行業()未被調用。 爲了解決這個問題,我創建了一個函數來停止服務代碼中的位置服務。從活動中調用stopLocationService(),然後調用stopService。下面是代碼示例:

public class myLocationService extends Service{ 
... 

    public void stopLocationUpdates() { 

     LocationService.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this);  
     mGoogleApiClient.disconnect(); 

    } 
    ... 
} 

在活動中,

{ 
    ... 
    if(mService != null && isBound) { 

     mService.stopLocationUpdates(); 
     doUnbindService(); 
     stopService(new Intent(this, myLocationService.class)); 

    } 
    ... 
} 
0

在我的情況下stopService被稱爲與startService幾乎同時所以沒有服務是有停止。嘗試延遲stopService幾秒鐘。 :)

0

@覆蓋

public void onDestroy() { 

    Log.d(TAG, "onDestroy"); 
    super.onDestroy(); 
    if (mLocationManager != null) { 

     for (int i = 0; i < mLocationListeners.length; i++) { 

      try { 

       mLocationManager.removeUpdates(mLocationListeners[i]); 

      } catch (Exception ex) { 

       Log.d(TAG, "fail to remove location listners, ignore", ex); 

      } 

     } 

    } 

} 
+0

在公共類MyService extends Service中嘗試此操作 – 2017-04-05 05:51:25