¿Hay alguna manera de obligar a una aplicación a permanecer ejecutándose en segundo plano sin importar qué?


12

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 utiliza para determinar qué aplicación se cierra primero cuando se queda sin memoria.

¿Alguno de ustedes se molestó, digamos que abrió un temporizador para ejecutarse en segundo plano para medir el tiempo transcurrido de algo, luego abrió algunas aplicaciones más y regresó a su temporizador solo para ver que se restableció o cerró? Quiero decir, en serio, es realmente insoportablemente 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?


77
Esa es una señal de un código incorrecto por parte de la aplicación. Un usuario nunca debería tener que molestarse con 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). Debería enviar un informe de error al desarrollador de la aplicación.
Flujo

Respuestas:


8

La respuesta aceptada resultó incorrecta u obsoleta. El módulo "Configuración de la aplicación" para la aplicación Xposed le permite especificar en función de cada aplicación para evitar que las aplicaciones sean asesinadas o liberadas:

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 tener cuidado responsable cuando se juega con aplicaciones que cambian el comportamiento de bajo nivel.


Cabe señalar que esto requiere root y es la instalación de una gran modificación del sistema operativo Android.
sweisgerber.dev

5

Respuesta simple: No. Android siempre usa OOM (fuera de memoria) 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, efectivamente bloquea su teléfono hasta que se reinicie, y después de eso comienza 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 acaparan recursos mientras el temporizador está en segundo plano, eventualmente se matará.


1
No tiene por qué ser así, OMI. Deje que el sistema haga sus viejas formas de manera 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 el momento en que surja la necesidad, simplemente proporcione esa opción. No es necesario que tenga otra categoría de permisos, ya que los usuarios pueden "anclar" una aplicación según su criterio. No quiero que una aplicación sea permanentemente imparable una vez que se ejecuta. Solo quiero una opción para hacer esto cuando haya una necesidad como la que describí en mi pregunta.
supertonsky

1
@onik un desbordamiento de búfer no tiene nada que ver con acaparar memoria. ¿Sabes qué es un desbordamiento de búfer?

3
@onik, entonces la respuesta es no, no sabes qué es un desbordamiento de búfer. Entendido.

1
@onik también un bucle infinito en una lista enlazada sin duda podría llevarte a un OOM mucho antes de que hayas hecho un bucle Integer.MAX_VALUE. ¿Por qué crees que las cosas están limitadas de Integer.MAX_VALUEtodos modos?

1
@onik correcto: por definición, un desbordamiento de búfer no puede expandir el tamaño de memoria asignado. Si expande el tamaño de memoria asignado, no es un desbordamiento de búfer. Estás pensando en un bucle infinito, creo.
Mooing Duck

1

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 dará a las aplicaciones que hacen esto una prioridad más alta que otras. El segundo es guardar el tiempo de inicio para que cuando el temporizador se reinicie, no se restablezca.


1
Ejecutar aplicaciones sin motivo con prioridad de primer plano (es por eso que se necesita la notificación) se considera una mala práctica. Como se dijo antes: Android proporciona una buena Api 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
Flow

No dudo que exista tal API, pero ¿en qué parte de esta pregunta se ha mencionado antes?
Erik

1
Además, obviamente hay una razón para mantener la aplicación ejecutándose si es posible en este caso, a diferencia del ejemplo de juego que publicaste.
Erik

44
No, no hay razón para mantener una aplicación en funcionamiento 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 que podría usar AlarmManagerpara asegurarse de que se ejecute más tarde. La única razón por la que se debe utilizar el primer plano es: 1. Tiene alguna actividad real en primer plano, como reproducir música o mostrar un video. 2. Desea mantener abierta una conexión de datos (por ejemplo, IMAP IDLE (push)).
Flujo

0

1er método: - Si crea Sticky Thread en el programa, sí, puede mantener su programa forzosamente en ejecución. Sin embargo, recuerde que el usuario en el modo de configuración avanzada puede detener las aplicaciones en ejecución 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 es Android rooteado y quiere ejecutar una aplicación en segundo plano. use el script SL4 en segundo plano desde la aplicación. use una secuencia de comandos 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 juego esto está construido Se conectan a los servidores a pesar de que el usuario apagó la aplicación. La razón por la cual el motor crea múltiples scripts en el teléfono que se verifica aleatoriamente en cualquier evento en particular y que TRIGGER se usa para ejecutar su aplicación continuamente en el fondo del primer plano.

*** Perdón por el corrector ortográfico de TYPO .. no disponible. Espero que consigas lo que pretendías conseguir.


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 hacer 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 aquí porque no están desarrollando una aplicación. Si esto puede ser aplicable para los no desarrolladores, considere editar la respuesta para dejar en claro cómo hacerlo sin tocar el código fuente de la aplicación . Gracias.
Andrew T.

-1

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

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


2
El kernel realiza la eliminación de OOM y ninguna aplicación puede evitarlo o "bloquear" un proceso. La aplicación a la que te has vinculado es un asesino de tareas que mata las aplicaciones en sí. La función de bloqueo a la que te refieres solo evitará la muerte del asesino de tareas.
Erik
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.