¿Hay alguna forma de obligar a una aplicación a permanecer ejecutándose en segundo plano pase lo que pase?

En Ice Cream Sandwich (ICS), el sistema operativo clasifica su aplicación y cada categoría tiene su propio umbral en el que el sistema operativo usa para determinar qué aplicación cerrar primero cuando se queda sin memoria.

¿Alguno de ustedes se ha molestado por decir que abrió un temporizador para que se ejecutara en segundo plano para medir el tiempo transcurrido de algo, luego abrió algunas aplicaciones más y volvió a su temporizador solo para ver que estaba reiniciado o cerrado? Quiero decir, en serio, es realmente terriblemente molesto.

¿Hay alguna manera de obligar a una aplicación a permanecer ejecutándose en segundo plano sin importar qué, incluso cuando el sistema operativo se queda sin memoria?

Esa es una señal de un código incorrecto de la aplicación. Un usuario nunca debería tener que preocuparse por esto y Android proporciona medios para que una aplicación pueda guardar su estado y restaurarlo más tarde (desde las primeras versiones de Android). Debe enviar un informe de error al desarrollador de la aplicación.

Respuestas (5)

La respuesta aceptada resultó incorrecta o desactualizada. El módulo "Configuración de la aplicación" para la aplicación Xposed le permite especificar por aplicación para evitar que las aplicaciones se eliminen o liberen:

http://repo.xposed.info/module/de.robv.android.xposed.installer

http://repo.xposed.info/module/de.robv.android.xposed.mods.appsettings

Por supuesto, se debe ejercer un cuidado responsable cuando se juega con aplicaciones que cambian un comportamiento de tan bajo nivel.

Se debe tener en cuenta que esto requiere root y es la instalación de una gran modificación del sistema operativo Android.

Respuesta simple: No. Android siempre usa OOM (Out-Of-Memory) priorizando para liberar memoria no utilizada. Puede cambiar las prioridades de las aplicaciones (al menos hasta que se reinicie) con algunos administradores de tareas, pero incluso si la memoria se agota, las aplicaciones en segundo plano comienzan a ser eliminadas.

Piense en este escenario: ha descargado una aplicación mal codificada que se ejecuta en el arranque, provoca un desbordamiento del búfer y acapara toda su memoria. Normalmente, esta aplicación se elimina, pero si está configurada para permanecer abierta, bloqueará efectivamente su teléfono hasta que se reinicie, y luego comenzará una y otra vez, etc.

Algunos temporizadores usan servicios con altas prioridades para evitar este problema, pero si inicia suficientes aplicaciones de alto rendimiento que consumen muchos recursos mientras el temporizador está en segundo plano, eventualmente se eliminará.

Parece que eso es todo. Me pregunto si hay alguna excepción a esa regla, ya sabes, aplicaciones del sistema como teléfono, contactos, alarmas, etc. Espero que Google brinde una opción en el futuro para que los usuarios "fijen" cualquier aplicación que el usuario haya iniciado manualmente. No es necesario hacerlo al inicio para evitar bloquear el teléfono. O tal vez al menos podrían dejar que el sistema intente bloquearlo durante un tiempo y, si el sistema no responde, dejar que el usuario lo cierre.
Si esto sucede alguna vez, lo mínimo que esperaría es una nueva categoría de permisos para tales aplicaciones. Esto ayudaría a las personas que valoran la duración de la batería y la estabilidad del sistema a evitar esas aplicaciones. Me gustaría.
No tiene por qué ser así, en mi opinión. Deje que el sistema siga sus viejas formas de forma predeterminada y, en caso de que el usuario tenga la intención de que una aplicación en particular se ejecute en segundo plano justo en ese momento en particular cuando surja la necesidad, simplemente proporcione esa opción. No es necesario que tenga otra categoría de permisos, ya que queda a discreción de los usuarios "fijar" una aplicación. No quiero que una aplicación sea permanentemente imparable una vez que se ejecuta. Solo quiero una opción para hacer esto cuando hay una necesidad como la que he descrito en mi pregunta.
@onik, un desbordamiento de búfer no tiene nada que ver con acaparar la memoria. ¿Sabes qué es un desbordamiento de búfer?
@dcow Sí, estoy familiarizado con los desbordamientos de búfer. Dado que Android tiene una asignación de memoria dinámica para sus sandboxes, un desbordamiento de búfer puede traspasar los límites de memoria actuales y hacer que crezca el sandbox. Por supuesto, debido al manejo de la memoria de Java, este fue quizás un ejemplo de nicho, uno mejor sería un bucle infinito en un LinkedList, que no está restringido Integer.MAX_VALUEpor su estructura y puede crecer dinámicamente.
@onik entonces la respuesta es no, no sabes qué es un desbordamiento de búfer. Entendido.
@onik aquí hay un enlace por cierto: en.wikipedia.org/wiki/Buffer_overflow
@onik también un ciclo infinito en una lista vinculada ciertamente podría llevarlo a un OOM mucho antes de que haya realizado un ciclo Integer.MAX_VALUE. ¿Por qué crees que las cosas están limitadas de Integer.MAX_VALUEtodos modos?
@dcow, ¿está diciendo que un desbordamiento de búfer no puede expandir el tamaño de la memoria asignada dinámicamente, o que no es la presentación habitual? Y el límite provino de la estructura interna de matrices y vectores, en lo que pensé primero en este caso. Ah, y gracias por el enlace, ¡nunca había oído hablar de Wikipedia! ;)
@onik correcto: por definición, un desbordamiento de búfer no puede expandir el tamaño de la memoria asignada. Si expande el tamaño de la memoria asignada, no es un desbordamiento de búfer. Estás pensando en un bucle infinito, creo.

No. Sin embargo, me vienen a la mente dos métodos para aliviar el problema, pero ambos solo pueden ser implementados por el desarrollador: el primero es mostrar una notificación, Android le dará a las aplicaciones que hacen esto una prioridad más alta que otras. El segundo es guardar la hora de inicio para que cuando el temporizador finalmente se reinicie, no se reinicie.

Ejecutar aplicaciones sin motivo con prioridad en primer plano (por eso se necesita la notificación) se considera una mala práctica. Como se dijo antes: Android proporciona una API agradable que incluso permite temporizadores/contadores que no se ven afectados por el asesino OOM. Hay una buena publicación de Dianne Hackborn sobre este tema.
No dudo que exista tal API, pero ¿dónde en esta pregunta se ha mencionado esto antes?
Además, obviamente hay una razón para mantener la aplicación en ejecución si es posible en este caso, a diferencia del ejemplo del juego que publicaste.
No, no hay razón para mantener una aplicación en ejecución solo por un temporizador. Simplemente use onSaveInstanceStatey onRestoreInstanceStatepara proteger el estado de la aplicación, incluida la información del temporizador. No es necesario ejecutar en primer plano. Incluso si es una alarma, podría usarla AlarmManagerpara asegurarse de que se ejecute más tarde. La única razón por la que se debe usar el primer plano es: 1. Tiene alguna actividad real en primer plano, como reproducir música o mostrar un video. 2. Quiere mantener abierta una conexión de datos (por ejemplo, IMAP IDLE (push)).

1er método: - Si crea Sticky Thread en el programa, sí, puede mantener su programa en ejecución a la fuerza. Sin embargo, recuerde que el usuario en el modo de configuración avanzada puede detener las aplicaciones que se ejecutan en segundo plano. Sin embargo, si escribe un hilo adhesivo de manera que comience en cualquier evento dado, entonces esto se puede lograr.

2do método: SI el usuario no está rooteado en Android y desea ejecutar una aplicación en segundo plano. use el script SL4 en segundo plano desde la aplicación. use un script que le haga verificaciones de antecedentes y programas y escriba el front-end para mostrar algo más.

Por ejemplo: en la mayoría de los motores de juegos, esto está integrado. Se conectan a los servidores aunque el usuario apagó la aplicación. La razón por la que el motor crea múltiples secuencias de comandos en el teléfono que se verifican aleatoriamente en cualquier evento en particular y que TRIGGER se usa para ejecutar su aplicación continuamente en el fondo del primer plano.

*** Lo siento por los errores tipográficos... el corrector ortográfico no está disponible. Espero que logres lo que pretendías obtener.

Bienvenido a Android Enthusiast, un sitio de preguntas y respuestas para usuarios finales de Android. Por lo que puedo entender, los 2 métodos que proporcionó solo se pueden realizar desde el lado del desarrollador, es decir, aquellos que tienen el código fuente de la aplicación. Desafortunadamente, eso podría no ser útil para la mayoría de los lectores porque no están desarrollando una aplicación. Si esto puede ser aplicable para personas que no son desarrolladores, considere editar la respuesta para aclarar cómo hacerlo sin tocar el código fuente de la aplicación . Gracias.

A veces hay una opción para bloquear la aplicación. Esto evita eliminar o detener esa aplicación en el teléfono.

La opción de bloqueo no está disponible en el sistema operativo en sí, el uso de algunas aplicaciones de terceros como GO Task Manager , etc., puede ayudar.

El kernel elimina OOM y ninguna aplicación puede evitarlo o "bloquear" un proceso. La aplicación a la que se ha vinculado es un asesino de tareas que elimina las aplicaciones en sí. La función de bloqueo a la que te refieres solo evitará que el asesino de tareas mate.