2010-05-07 15 views
16

Es muy importante que mi servicio siga funcionando hasta que alguien con una contraseña detenga el servicio desde la pantalla de mi IU. Mi aplicación funciona bien pero está diseñada para que los padres la activen/desactiven (con una contraseña) en sus teléfonos para niños. Me las he arreglado para hacer que todo funcione, pero el problema que tengo es que si el chico usa un administrador de tareas para matar mi servicio, entonces mi aplicación es inútil. Le agradecería a cualquiera que conozca la forma de cualquiera¿Cómo puedo evitar que mi aplicación/servicio de Android sea "eliminado" de un administrador de tareas?

1) supervisar el servicio y empezar de nuevo automáticamente si su "muerto" o 2) evitar que alguien sea capaz de acabar con él, excepto de la actividad (pantalla de administración) que lanzó el servicio. ¿O ambos?

Lo siento si no soy muy claro al describir el problema, soy un principiante. Logré un gran progreso hasta ahora, pero estoy atrapado en este último obstáculo.

Respuesta

5

No hay forma de evitar esto directamente, sin un dispositivo rooteado. El SDK ayuda a prevenir este tipo de problemas.

Puede hacer el truco "verdaderamente malo" y tener dos servicios en dos aplicaciones. Cada servicio supervisa al otro y lo reinicia si se detiene. Esto es kludgy, pero en la mayoría de los casos incluso el niño con el dedo más rápido no pudo matar a ambas aplicaciones.

+3

¡Pero un programa puede! Cualquier programa que pueda ejecutar el equivalente de 'kill -KILL -1' puede causar que todas tus instancias mueran simultáneamente. –

+1

Si tuviera privilegios del sistema, ¿cómo firmaría su aplicación para ocultarla o eliminarla de los usuarios? ¿hay algún permiso específico que deba establecer? – rayman

+3

Acabo de instalar una aplicación llamada Smart App Protector Free, le pregunto si desea instalar un helper para evitar que lo maten. Funciona y me pregunto cómo es. Uso el Panel de sistema para matar todo (incluso el proceso del sistema) pero el protector aún regresa. Aún más, no puedo ver el rastro del helper ejecutándose, no en el Panel del sistema, e incluso el ps ps en la consola del dispositivo (a través de adb), todavía no puedo ver que exista el helper. ¿Algún consejo? – xandy

10

Puede utilizar el método API: startForeground(). Esta es la explicación de la misma:

Una inició el servicio puede utilizar el startForeground (int, de notificación) API para poner el servicio en un estado plano, en el que el sistema considera que sea algo que el usuario es activamente consciente de y por lo tanto no es un candidato para matar cuando baja de memoria. (Todavía es teóricamente posible que el servicio que se mató bajo presión de memoria extrema de la aplicación actual en primer plano, pero en la práctica esto debe no ser una preocupación.)

Here se puede encontrar un ejemplo de cómo utilizar esta.

En cuanto a la pregunta, no puede evitar la muerte de un servicio. Puede ser asesinado por el sistema. Incluso los servicios del sistema pueden ser asesinados. Si esto sucede, se reinician. Puede usar el mismo enfoque.

5

Puede escribir una aplicación de ayuda para recibir la transmisión de Android "android.intent.action.PACKAGE_RESTARTED", cuando su aplicación fue asesinada, su ayudante recibirá esa transmisión y puede reiniciar su aplicación o lo que sea.

Así es como lo hace 'Smart App Protector Free'.

Lo malo es que los usuarios deben instalar dos aplicaciones en lugar de una.

3

Para cualquier persona que todavía está en busca de una respuesta - éste puede ser correcta:

no se puede: realizar un servicio imposible de matar, si se ejecuta en memoria bajo el sistema siempre va a matar a su servicio. PERO

puede: Indique al sistema que reinicie su servicio cuando muera.Mira este pedazo de código:

público static final int START_REDELIVER_INTENT

añadido en el nivel 5 de la API

constante para volver de onStartCommand (Intención, int, int):

si el proceso de este servicio se cancela mientras se inicia (después de regresar de onStartCommand (Intent, int, int)), luego se programará para reiniciarse y el último Intent entregado se lo volverá a enviar nuevamente mediante onStartCommand (Intent, int, int). Esta intención permanecerá programada para volver a entregarse hasta que el servicio llame a stopSelf (int) con el ID de inicio proporcionado a onStartCommand (Intención, int, int). El servicio no recibirá una llamada onStartCommand (Intención, int, int) con un Intento nulo porque solo se reiniciará si no se termina de procesar todas las Intenciones enviadas a él (y cualquier evento pendiente se enviará a la punto de reinicio).

Constante Valor: 3 (0x00000003)

0

Sólo tienes que configurar el tipo de retorno como START_TICKY.

Cuestiones relacionadas