IntentService onHandleIntent () sigue funcionando después de onDestroy () despedido

En mi pantalla de preferencia, quiero iniciar un servicio para descargar archivos desde Internet cuando se hace clic en una de las preferencias. Si el servicio ya se está ejecutando (descarga de archivos), el servicio debe detenerse (cancelar la descarga).

public class Setting extends PreferenceActivity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); downloadPref.setOnPreferenceClickListener(new OnPreferenceClickListener() { @Override public boolean onPreferenceClick(Preference pref) { if (DownloadService.isRunning) { Setting.this.stopService(new Intent(Setting.this, DownloadService.class)); } else { Setting.this.startService(new Intent(Setting.this, DownloadService.class)); } return false; } }); } } 

La clase de servicio:

 public class DownloadService extends IntentService { public static final int DOWNLOAD_SUCCESS = 0; public static final int DOWNLOAD_FAIL = 1; public static final int DOWNLOAD_CANCELLED = 2; public static final int SERVER_FAIL = 3; public static boolean isRunning = false; private int result; public DownloadService() { super("DownloadService"); } @Override public void onCreate() { super.onCreate(); isRunning = true; } @Override protected void onHandleIntent(Intent intent) { if (NetworkStateUtils.isInternetConnected(getApplicationContext())) result = downloadFiles(getApplicationContext()); } @Override public void onDestroy() { super.onDestroy(); switch (result) { case DOWNLOAD_SUCCESS: Toast.makeText(getApplicationContext(), R.string.download_finished, Toast.LENGTH_SHORT).show(); break; case DOWNLOAD_CANCELLED: Toast.makeText(getApplicationContext(), R.string.download_canceled, Toast.LENGTH_SHORT).show(); break; case DOWNLOAD_FAIL: Toast.makeText(getApplicationContext(), R.string.download_failed, Toast.LENGTH_SHORT).show(); break; } isRunning = false; } } 

Este servicio está destinado a ejecutarse hasta que la descarga haya finalizado. La función downloadFiles() no utiliza AsyncTask . Guarda la HttpURLConnection con un FileOutputStream directamente.

El servicio se inició correctamente cuando hice clic en la preferencia. Ahora el problema es, cuando hago clic para detener el servicio con stopService() , DownloadService activado onDestroy() inmediatamente; sin embargo, según los registros, onHandleIntent() sigue funcionando porque todavía puedo ver las solicitudes HTTP continuamente. ¿Esto es porque el Service funciona en un hilo él mismo, o estoy haciendo algo mal? ¿Cómo puedo asegurarme de que todo en onHandleIntent() detenga inmediatamente (o al menos sea capaz de detenerlo) cuando stopService() esté siendo llamado?

Finalmente averiguó cómo hacerlo funcionar.

Como dije en mi pregunta, de alguna manera onHandleIntent () creará un hilo para hacer el trabajo. Así que incluso cuando el servicio en sí es destoryed, el hilo sigue funcionando. Alcancé mi objetivo añadiendo una variable global

 private static boolean isStopped = false; 

a la clase DownloadService .

Para cancelar mi servicio, en lugar de llamar

 Setting.this.stopService(new Intent(Setting.this, DownloadService.class)); 

acaba de establecer DownloadService.isStopped = true .

Por último, al hacer las cosas en onHandleIntent() , compruebe este booleano periódicamente para ver si debe detener la descarga. Si isStopped = true , devuelve inmediatamente y el servicio se detendrá.

Espero que esto ayude a alguien que se encuentra con este problema también. Y gracias por su tiempo leyendo esta pregunta.

Tiene un hilo separado para hacer el trabajo, y dependiendo de lo que está haciendo puede que no sea posible detenerlo inmediatamente. Si está bloqueando en E / S, la interrupción probablemente no tendrá ningún efecto.

  • Suscripción o vinculación a un servicio de Intent existente
  • Android: Uso de WebView fuera de un contexto de actividad
  • WakefulIntentService aclaraciones de implementación
  • ¿Cómo forzar a un IntentService a detenerse inmediatamente con un botón de cancelación de una actividad?
  • ¿Por qué no funciona LocalBroadcastManager en lugar de Context.registerReceiver?
  • Esperando la devolución de llamada asincrónica en IntentService de Android
  • Cómo utilizar Notification.deleteIntent
  • La notificación creada por IntentService utiliza siempre una intención incorrecta
  • ¿Cómo descargar el archivo con el servicio en android?
  • ¿Necesita ayuda para descargar imágenes de fondo en Android?
  • Capturar IntentService Intents antes onHandleIntent
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.