2010-12-17 10 views
14

Ich habe einen Hintergrund-Service auf meiner Android APP, die meine GPS-Position bekommt und sie an eine entfernte Datenbank sendet. Es funktioniert gut.stopService hört nicht auf, mein Service .... warum?

Das Problem ist, wenn ich den Dienst stoppen möchte .... es hört nicht auf: S. Auch keine Ausnahme oder Fehler auf logcat sind erschienen ... es hört einfach nicht auf.

Dies ist der Code meine srvice zu starten (mit einer Taste):

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

Dies ist der Code, wo ich es nicht mehr (auf der onActivityResult-Methode):

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

ich gewesen sein debuggte die App, und ich überprüft, dass die StopService Codezeile jedes Mal aufgerufen wurde, wenn ich es debuggte, aber es hört nicht auf ......

Ich bin sicher, dass es nicht gestoppt wird Ursache auf meiner Datenbank ich noch Empf ie GPS-Positionen aus dem Emulator, wenn ich die Taste gedrückt habe, um den Dienst zu stoppen.

was mache ich schlecht?

Antwort

25

Haben Sie onDestroy() implementiert? Wenn nicht, glaube ich, dass das die Lösung sein könnte - und Sie stoppen Ihre Timer oder was auch immer Sie verwenden, um den Dienst innerhalb onDestroy() auszuführen.

Ein Dienst kann durch Aufrufen seiner stopSelf() - Methode oder durch Aufrufen von Context.stopService() beendet werden.

Weitere Informationen finden Sie unter link.

+1

oh, ich bin nicht der Umsetzung OnDestroy !!!!!! Auf dem Dienst verwende ich einen Thread mit einem Handler und einem einfachen Handler. Wie kann man sie aufhalten ?? – NullPointerException

+0

es funktioniert für mich, danke –

+1

Ich verstehe nicht, warum es notwendig ist, onDestroy() zu implementieren. Es ist nur eine Lebenszyklus-Callback-Methode. Können Sie bitte klarstellen? – likejiujitsu

0

könnte es sein, dass Sie jedes Mal einen neuen Intent erstellen, wenn Sie den Stop-Service anrufen.

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

vielleicht versuchen:

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

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

dieser Code funktioniert nicht, ich habe es versucht. – user2580401

8

Ich bin sicher, dass es Sache auf meine Datenbank nicht gestoppt ist i noch GPS-Positionen aus dem Emulator recive, wenn ich drücken Sie die Taste, um den Dienst zu beenden haben.

Sie werden wahrscheinlich Ihre LocationListener nicht abmelden.

0

Für diejenigen, die regelmäßig eine Anfrage an den Server senden möchten, ist dies meine Lösung. Sie sollten in Ihrer Aktivität oder Fragment Aktivität haben diese

{ 
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

Es ist sehr üblich, diese Situation, wo ich brauche, um meinen Dienst zu beenden, bevor Sie den Vorgang zu beenden. In einigen Fällen ist nicht genug mit stopService (Absicht). Sie sollten sich die onDestroy() Implementierung in meinem Dienst merken. Beispiel:

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(); 
    } 
} 

Auf diese Weise, wenn Sie den Dienst mit Stopservice-Methode aufgehört haben auch haben Sie den Prozess o Zähler gestoppt.

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

Vorsicht! @yaircarreno

+1

Sie verwenden den falschen Servicetyp. IntentService wurde entwickelt, um seinen Lebenszyklus selbst zu verwalten. Sobald die Geschäftslogik der Methode onHandleIntent abgeschlossen ist, wird IntentService selbst zerstört und alle zugehörigen Ressourcen werden freigegeben. –

1

Wenn Sie den GPS-Standort verfolgen, haben Sie wahrscheinlich GoogleApiClient verwendet.

Das Konzept ist, dass der Dienst nicht stoppen,

wenn eine GoogleApiClient Instanz noch in ihn verbunden ist.

(oder irgendeine andere Frage, die zerstört werden müssen/unregistrierte zuerst)

So funktioniert es zu machen, implementieren onDestroy() in Ihren Diensten:

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

Ich versuchte tatsächlich, einen Dienst zu stoppen, der Google API verwendet, ich habe vergessen, die API OnDestroy zu trennen ... !! Fall geschlossen .. –

0

mein Problem gelöst, indem die zusätzlichen Ansichten entfernen zu WindowManagerondestroy

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

hatte ich das gleiche Problem. Ich fand, dass, wenn der Dienst GoogleApiClient verbunden hat und immer noch Standortaktualisierung erhält, der stopService() völlig keine Wirkung hat, wurde der Service Industrie() nicht aufgerufen. Um das Problem zu beheben, habe ich eine Funktion erstellt, um den Ortungsdienst im Dienstcode zu stoppen. Rufen Sie die Aktivität stopLocationService() auf und rufen Sie dann stopService auf. Hier ist der Code Beispiel:

public class myLocationService extends Service{ 
... 

    public void stopLocationUpdates() { 

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

    } 
    ... 
} 

In Tätigkeit

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

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

    } 
    ... 
} 
0

In meinem Fall der stopService mit startService genannt wird, fast gleichzeitig, so dass kein Service dort angehalten werden soll. Versuchen Sie, die stopService für ein paar Sekunden zu verzögern. :)

0

@Override

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

versuchen Sie dies bei öffentlichen Klasse MyService erweitert Service –

Verwandte Themen