El sistema Android eliminó mi servicio cuando borro todas las aplicaciones recientes
Ya uso startforeground () en mi servicio, pero el sistema android sigue matando a mi servicio cuando borro todas las aplicaciones recientes. Aquí está mi código:
@Override public int onStartCommand(Intent intent, int flags, int startId) { //Here's what my service do. Notification notification = new NotificationCompat.Builder(this) .setContentTitle("Text") .setTicker("Text") .setContentText("Text") .setSmallIcon(R.drawable.icon) .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon)) .build(); startForeground(100, notification); return START_STICKY; }
¿Hay algo mal que hice con este código? Gracias.
- Temporizador Se ralentiza en Servicio cuando se bloquea la pantalla del dispositivo
- Registrador de clave de Android
- Cómo detener / iniciar un servicio que contiene un bucle infinito en la creación
- ¿Cómo inicio un servicio basado en un objeto ServiceInfo?
- Android AlarmManager a veces tarde
- El oyente de ubicación funciona desde un servicio pero no es un servicio de IntentService
- Android: ¿Cómo determinar si IntentService se está ejecutando?
- START_STICKY para IntentService
- Android - Servicio periódico de fondo - Asesoramiento
- Android MediaProjectionManager en servicio
- Enfoque eficiente para comprobar continuamente si la conexión a Internet está disponible en Android
- Android: mantener vivo un servicio de fondo (prevenir la muerte del proceso)
- Error "No se puede iniciar el servicio de intención" al iniciar el servicio desde una actividad en Android
Un servicio de larga duración necesita lo siguiente para que sea menos probable que se termine:
-
Devolver
START_STICKY
desdeonStartCommand()
. Con esto, el sistema reiniciará el servicio incluso si tiene que ser detenido por limitaciones de recursos. -
Cuando el servicio no está vinculado a ningún componente de interfaz de usuario (por ejemplo, una actividad), el servicio debe ir en el modo de primer plano mostrando una notificación de primer plano. Los servicios de primer plano tienen menos probabilidades de ser terminados por el sistema.
-
Establezca el atributo
"stopWithTask"=false
en la correspondiente etiqueta<service>
del archivo de manifiesto.
Además, tenga en cuenta que los dispositivos de algunos fabricantes finalizarán los servicios incluso con las propiedades anteriores debido a la personalización:
- Administradores de tareas personalizados.
- Funciones de ahorro de batería que pueden prohibir servicios que no son del sistema.
Algunos servicios de aplicación necesitan permanecer en segundo plano y tienen que mantenerse vivos agresivamente. Aunque este método no se recomienda, pero se pueden realizar los siguientes pasos:
-
Agregue disparadores para el inicio del servicio: como Boot Complete y Network Connected.
-
Si el servicio recibe intenciones / emisiones
FLAG_RECEIVER_FOREGROUND
en la intención. -
Un recurso extremo es programar manualmente una intención pendiente para reiniciar el servicio , con
AlarmManager
, cuandoonTaskRemoved()
se llama.
Ver también:
- START_STICKY no funciona en Android KitKat
El sistema Android puede detener su servicio en cualquier momento cuando desee detenerse para mantener el rendimiento del dispositivo o el consumo de energía. Hay muchos situación donde el sistema androide puede detener su servicio como batería baja, la aplicación no está en estado activo durante mucho tiempo, el dispositivo está en modo de dormir, modo de ahorro de energía, etc
He desarrollado un truco o hack (que se puede decir que) mediante el uso de que nadie puede detener su servicio (sistema Android, aplicaciones de terceros, el usuario).
Nota: Al usar esto, su servicio nunca se detendrá y podría drenar su batería también.
Siga los pasos a continuación: –
1) Devolver START_STICKY en onStartCommand.
2) A continuación, modifique el método onDestroy () y onTaskRemoved () en su servicio como se indica a continuación:
@Override public void onDestroy() { super.onDestroy(); Toast.makeText(getApplicationContext(), "Service Task destroyed", Toast.LENGTH_LONG).show(); Intent myIntent = new Intent(getApplicationContext(), YourService.class); PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0); AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 10); alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show(); } @Override public void onTaskRemoved(Intent rootIntent) { super.onTaskRemoved(rootIntent); Intent myIntent = new Intent(getApplicationContext(), YourService.class); PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, myIntent, 0); AlarmManager alarmManager1 = (AlarmManager) getSystemService(ALARM_SERVICE); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 10); alarmManager1.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); Toast.makeText(getApplicationContext(), "Start Alarm", Toast.LENGTH_SHORT).show(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Toast.makeText(getApplicationContext(), "Service Starts", Toast.LENGTH_SHORT).show(); return START_STICKY; }
Aquí estoy fijando una alarma cada vez que el servicio es parada (por el sistema del androide o por el usuario mannually) y usando PendindIntent reanudan el servicio en el plazo de 10 segundos cada vez.
Puede utilizar START_REDELIVER_INTENT en lugar de START_STICKY
La explicación más simple de estos podría ser,
START_STICKY- le dice al sistema que cree una copia nueva del servicio, cuando haya suficiente memoria disponible, después de que se recupere de la memoria baja. Aquí perderás los resultados que pudieron haber calculado antes.
START_NOT_STICKY- le dice al sistema que no se moleste en reiniciar el servicio, incluso si tiene suficiente memoria.
START_REDELIVER_INTENT- le indica al sistema que reinicie el servicio después del bloqueo y también redeliver las intenciones que estaban presentes en el momento del bloqueo.
Espero que esto ayude. Gracias
Por favor, lea esto Haga clic aquí
Algunos de los dispositivos que tienen Android personalizada, no una prueba real de Android va a matar a su servicio cuando se borra la aplicación reciente
- Proveedor de red no funciona en android
- Cómo quitar la aplicación del lanzador (en un dispositivo arraigado) programáticamente