Cómo detener un servicio

¿Cómo parar un servicio a una hora específica del día?

He sido capaz de iniciar un servicio en el momento específico de cada día, pero quiero hacer exactamente lo mismo para detener, pero no sé cómo.


Este es el código que utilizo para iniciar el servicio con AlarmManager.
Nota: Soy nuevo al androide dev así proporcionando un código comentado completo será muy apreciado.

Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 9); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); PendingIntent pi = PendingIntent.getService(getApplicationContext(), 0, new Intent(getApplicationContext(), Service.class), PendingIntent.FLAG_NO_CREATE); AlarmManager am = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 

El servicio se puede detener desde cualquier clase en ejecución siempre y cuando tenga el contexto. De los siguientes pasos puede detener el servicio en ejecución en un momento específico utilizando el receptor .

1. Cree una clase WakefulBroadcastReceiver en su aplicación. En la acción de recepción, compruebe si el servicio está funcionando o no, si está funcionando, deje de usar Contexto .

 public class TestReceiver extends WakefulBroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equalsIgnoreCase("STOP_TEST_SERVICE")) { if (isMyServiceRunning(context, TestService.class)) { Toast.makeText(context,"Service is running!! Stopping...",Toast.LENGTH_LONG).show(); context.stopService(new Intent(context, TestService.class)); } else { Toast.makeText(context,"Service not running",Toast.LENGTH_LONG).show(); } } } private boolean isMyServiceRunning(Context context,Class<?> serviceClass) { ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (serviceClass.getName().equals(service.service.getClassName())) { return true; } } return false; } 

}

2. Registre el receptor en AndroidManifest.

 <receiver android:name=".TestReceiver"> <intent-filter> <action android:name="STOP_TEST_SERVICE" /> <action android:name="START_TEST_SERVICE" /> </intent-filter> </receiver> 

3.Create un PendingIntent con la acción deseada, luego establezca la acción programada usando AlarmManager en su clase de actividad.

  public void setStopServiceAlarm() { Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 15); calendar.set(Calendar.MINUTE, 59); calendar.set(Calendar.SECOND, 0); AlarmManager alarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, new Intent().setAction("STOP_TEST_SERVICE"), PendingIntent.FLAG_UPDATE_CURRENT); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { alarm.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { alarm.setExact(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } else { alarm.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); } } 

¡¡Espero que esto ayude!!

Del mismo modo.

Cuando inicie un Service con un Intent (o mediante un PendingIntent ) Android, inicie el servicio si es necesario, llamará onCreate() si ese es el caso, entonces el onStartCommand(intent, flags, startId) pasa el Intent y un startId .

Se supone que el Servicio maneja su propio ciclo de vida y llama a stopSelf() cuando se hace, cuando el servicio es destruido por Android se llama al método onDestroy() .

La única otra forma de iniciar un Servicio es vinculante para él desde una Activity . Esto no desencadena una llamada a onStartCommand() , llama a onBind() lugar.

Android finaliza el servicio si

  • La llamada de servicio stopSelf() y no hay Activity enlazada a ella
  • El servicio está desvinculado de una Actividad, no hay ningún otro bind ni otros comandos para los cuales el stopSelf() no ha sido llamado
  • Bajos recursos en el dispositivo (aquí es donde los indicadores START_STICKY y ese tipo de banderas entran en juego)

El método stopSelf() tiene una stopSelf(int) . Llamarlo sin parámetros significa: estoy hecho con todos, detenme ; Llamarlo con el entero significa: Estoy hecho si no se ha recibido otro comando después de éste ; El entero es uno de los startId que se obtiene en onStartCommand() . Si tiene una cola de operaciones ejecutándose una tras otra, es natural llamar a stopSelf(int) después de que se haya ejecutado cada operación; de lo contrario, su Service debe saber cuándo debe detenerse la llamada.

Por lo general, un Service debe "saber" qué es lo que está haciendo y detenerse cuando se hace, pero puede iniciar una Intent con una acción específica (diga "ACTION_STOP") para ese Service y manejar esa acción llamando stopSelf() . Si se estaba ejecutando esto se detendrá (su responsabilidad de cerrar cualquier hilo de fondo / liberar cualquier recurso, tal vez en onDestroy() ). Si no se estaba ejecutando, se iniciará y se detendrá inmediatamente.

Dicho esto, te invito a pensar en lo que estás haciendo. Usted no ha especificado pero su solicitud es un poco extraño, no puedo pensar en una razón por la que un cierre del servicio debe ser programado.

Por último, considere tener un vistazo a JobScheduler para Lollipop y más tarde. Es mejor para el uso de la batería.

Estoy de acuerdo con Daniele- su servicio debe saber cuándo detenerse y detenerlo en un temporizador es extraño. Dicho esto, para detener un servicio en un momento específico cada día simplemente podría enviar un extra a su servicio. Cuando el Servicio ve el extra, sabe parar.

Usando lo que es esencialmente su código,

 Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 9); calendar.set(Calendar.MINUTE, 0); calendar.set(Calendar.SECOND, 0); // set the time when youre supposed to stop Intent serviceIntent = new Intent(getApplicationContext(), Service.class); serviceIntent.setAction("stop"); PendingIntent pi = PendingIntent.getService(getApplicationContext(), 0, serviceIntent, PendingIntent.FLAG_NO_CREATE); AlarmManager am = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE); am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi); 

Y en el servicio onStartCommand de su servicio, simplemente haga algo como

 public void onStartCommand() { if("stop".equals(intent.getAction)) { stopSelf(); return; } else { // do whatever you were doing } } 

Trate de usar constantes en lugar de un literal como "stop", aunque ya que es una buena práctica.

Cómo detengo un servicio.

  Intent intent = new Intent(getAppContext(), MyService.class); getAppContext().stopService(intent); 
  • Supervisar el estado del Hotspot en Android
  • Longitud máxima del método PutExtra de Intención? (Cierre de la fuerza)
  • Haz que el botón "arriba" se comporte como el botón "volver" de Android
  • Android: abra una aplicación externa y luego llame a un URI de intención
  • Android: "La acción completa" sigue mostrándose incluso después de seleccionar "Siempre"
  • ¿Cuáles son los tipos de intenciones posibles para el tipo de intención.setType?
  • ¿Qué hace Intent.putExtra?
  • Cuando su BroadcastReceiver se invoca a través de un Intent, ¿en qué proceso se ejecuta?
  • Android TV no está iniciando LAUNCH_LEANBACK Actividad
  • No se ha encontrado actividad para manejar Intent with action.DIAL
  • Llamar al método MainActivity de otras clases (que amplían el receptor de difusión)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.