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.
- ¿Por qué Intent.createChooser () necesita un BroadcastReceiver y cómo implementarlo?
- Cómo capturar el nuevo intento en onNewIntent ()?
- Intent.setData vs Intent.putExtra
- ¿Por qué la aplicación de mensajería recibe mensajes cuando se detiene la aplicación?
- Haga clic en la notificación de Android mediante programación
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);
- ¿qué sucede memoria-sabio cuando putExtra () se llama?
- ¿Cómo identificar si mi aplicación está configurada como predeterminada por el usuario?
- El intento de correo electrónico no funciona
- Obtención de un contexto para la geolocalización dentro de un IntentService
- ¿Cómo obtener Intención de la actividad de lanzamiento principal de una actividad diferente?
- La celebración de la conexión Bluetooth bluetooth a través de múltiples actividades
- Android google play juegos seleccionar actividad para iniciar cuando se hace clic en la notificación
- Android PendingIntent. El botón Atrás cierra la aplicación en lugar de restaurar la actividad anterior de la pila
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 hayActivity
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);
- IOS / Android: diseño de aplicaciones, todo-nativo o PhoneGap?
- Explicación básica de Contexto en android