2016-12-04 4 views
1

Ich suchte viel, aber ich kann nicht herausfinden, wie IntentService auf Knopfdruck zu stoppen. Ich habe eine Taste, die IntentService startet dann progressDialog zeigt Via ResultReceiver bekomme ich Daten zurück. Diese App sucht und zeigt Fotos vom Gerät an, also denke ich IntentService ist der richtige Weg, es zu tun. Aber ich möchte es auf Abbrechen abbrechen. Gibt es dafür ein Beispiel oder eine gute Praxis?Wie Stop IntentService

MainAcitivity:

@Override 
public final void onReceiveResult(final int resultCode, final Bundle resultData) { 
    switch (resultCode) { 
     case ScanService.STATUS_RUNNING: 
      progressDialog = new ProgressDialog(MainActivity.this); 
      progressDialog.setMessage("Loading..."); 
      progressDialog.setCancelable(false); 
      progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface dialog, int which) { 
        dialog.dismiss(); 
//something to stop 
       } 
      }); 
      progressDialog.show(); 

      break; 
     case ScanService.STATUS_FINISHED: 
      progressDialog.dismiss(); 
      listOfPictures = resultData.getParcelableArrayList(DATA_KEY); 
      break; 

     case ScanService.STATUS_ERROR: 
      final String error = resultData.getString(Intent.EXTRA_TEXT); 
      Toast.makeText(this, error, Toast.LENGTH_LONG).show(); 
      break; 
    } 
} 

Scan-Service:

@Override 
public int onStartCommand(final Intent intent, final int flags, final int startId) { 
    return super.onStartCommand(intent, flags, startId); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
} 

@Override 
protected void onHandleIntent(final Intent intent) { 
    final ResultReceiver scanResultReceiver = intent.getParcelableExtra(RECEIVER_KEY); 
    final Bundle bundle = new Bundle(); 
    scanResultReceiver.send(STATUS_RUNNING, bundle); 

// some work here 

    bundle.putParcelableArrayList(DATA_KEY, new ArrayList<>(listOfPictures)); 
    scanResultReceiver.send(STATUS_FINISHED, bundle); 
} 
+0

http://stackoverflow.com/questions/12112998/stoping-a-intentionservice-from-a-activity – Sangeeta

Antwort

1

Von außerhalb des Service: (z Taste klicken)

stopService(new Intent(context(), MyIntentService.class)); 

Aus dem Inneren des Service:

stopSelf(); 

Debugging-Tools:
Um Ihren Dienst zu überprüfen, ob/IntentService lebt Verwendung dieser ADB-Befehl (von der Kommandozeile):

adb shell service list |grep <my.app.packagename> 
+0

Gibt es eine Möglichkeit zu überprüfen, ob der Dienst vorzeitig beendet oder vollständig beendet wurde? – hyrulelink16

+0

Ja, der Dienst ruft stopSelf() auf, wenn onHandleIntent() beendet ist. Sie können ein Protokoll am Ende von onHandleIntent() hinzufügen und sehen, ob dieses Protokoll geschrieben ist oder nicht, wenn der Dienst nicht vorzeitig beendet wurde. –

+0

Ich habe stopService (mystent) hinzugefügt; in onClick Listener und stopSelf() in Ondestroy des Dienstes. Am Ende des handleIntent-Protokolls wird trotzdem protokolliert. Ich habe es versucht und es hört nicht auf den Service. – hyrulelink16