2010-05-07 5 views
16

Il est très important que mon service reste actif jusqu'à ce que quelqu'un avec un mot de passe arrête le service de mon écran d'interface utilisateur. Mon application fonctionne très bien, mais elle est conçue pour être activée/désactivée par les parents (avec un mot de passe) sur leurs téléphones pour enfants. J'ai réussi à tout faire fonctionner mais le problème que j'ai est que si l'enfant utilise un gestionnaire de tâches pour tuer mon service, alors mon application est inutile. Je vous serais reconnaissant à tous ceux qui connaît un moyen soitComment puis-je empêcher mon application/service Android d'être "tué" à partir d'un gestionnaire de tâches?

1) surveiller le service et commencer à revenir automatiquement si son « tué » ou 2) empêcher quelqu'un d'être en mesure de le tuer, sauf de l'activité (écran d'administration) qui a lancé le service. Ou les deux?

Je suis désolé si je ne suis pas très clair dans la description du problème, je suis un débutant. J'ai fait de grands progrès jusqu'ici mais je suis coincé à ce dernier obstacle.

Répondre

5

Il n'y a pas moyen d'empêcher cela directement, sans un périphérique enraciné. Le SDK empêche utilement ce genre de problèmes.

Vous pouvez faire le tour "vraiment mal" et avoir deux services dans deux applications. Chaque service surveille l'autre et le redémarre s'il s'arrête. C'est de la kludgie, mais dans la plupart des cas, même l'enfant le plus rapide n'a pas pu tuer les deux applications.

+3

Mais un programme peut! Tout programme pouvant exécuter l'équivalent de 'kill -KILL -1' peut entraîner la mort simultanée de toutes vos instances. –

+1

Si vous disposiez de privilèges système, comment signeriez-vous votre application pour la cacher ou la supprimer des utilisateurs? Y a-t-il une permission spécifique à définir? – rayman

+3

Je viens d'installer une application appelée Smart App Protector Free, elle vous demande si vous souhaitez installer un assistant que d'empêcher qu'il soit tué. Cela fonctionne et je me demande comment c'est. J'utilise le panneau du système pour tout tuer (y compris le processus du système) mais le protecteur revient toujours. Plus encore, je ne peux pas voir la trace de l'assistant en cours d'exécution, pas dans le panneau du système, et même je ps dans la console de l'appareil (thru adb), je ne peux toujours pas voir cette aide existe. Des indices? – xandy

10

Vous pouvez utiliser la méthode API: startForeground(). Voici l'explication de celui-ci:

Un est entré en service peut utiliser le startForeground (int, Notification) API pour mettre le service dans un état de premier plan, où le système considère pour être quelque chose que l'utilisateur est activement au courant de et donc pas un candidat à tuer quand faible en mémoire. (Il est encore théoriquement possible pour que le service soit tué sous la pression de mémoire extrême de l'application de premier plan en cours, mais dans la pratique, cela ne devrait pas être une préoccupation.)

Here vous pouvez trouver un exemple comment utilisez ceci. En ce qui concerne la question, vous ne pouvez pas empêcher la suppression d'un service. Il peut être tué par le système. Même les services système peuvent être détruits. Si cela arrive, ils sont redémarrés. Vous pouvez utiliser la même approche.

5

Vous pouvez écrire une application d'aide pour recevoir la diffusion Android "android.intent.action.PACKAGE_RESTARTED", lorsque votre application a été tué, votre assistant recevra cette diffusion et vous pouvez redémarrer votre application ou autre.

C'est ainsi que 'Smart App Protector Free' fait.

La mauvaise chose est que les utilisateurs doivent installer deux applications au lieu d'une.

3

Pour tous ceux qui cherchent toujours une réponse - celle-ci peut être correct:

vous ne pouvez pas: faire un service invulnérable, si vous travaillez sur une mémoire insuffisante du système sera toujours tuer votre service. BUT

Vous pouvez: Dire au système de redémarrer votre service lorsqu'il est tué.Regardez ce morceau de code:

public static final int START_REDELIVER_INTENT

Ajouté au niveau de l'API 5

constante pour revenir de onStartCommand (intention, int, int):

si le processus de ce service est tué pendant le démarrage (après retour de onStartCommand (Intent, int, int)), il sera planifié un redémarrage et le dernier message livré lui sera à nouveau livré via onStartCommand (Intent, int, int). Cette intention restera planifiée pour une nouvelle livraison jusqu'à ce que le service appelle stopSelf (int) avec l'ID de départ fourni à onStartCommand (Intent, int, int). Le service ne recevra pas d'appel onStartCommand (Intent, int, int) avec une intention nulle, car il ne sera redémarré que s'il n'a pas fini de traiter toutes les intentions qui lui ont été envoyées (et que de tels événements en attente seront livrés au point de redémarrage).

Valeur constante: 3 (0x00000003)

0

Il suffit de régler le type de retour comme START_TICKY.

Questions connexes