Подтвердить что ты не робот

Как я могу предотвратить "убить" приложение или службу Android из диспетчера задач?

Очень важно, чтобы мой сервис продолжал работать до тех пор, пока кто-то с паролем не остановит службу на моем экране пользовательского интерфейса. Мое приложение отлично работает, но оно предназначено для включения/выключения родителями (с паролем) на телефонах для детей. Мне удалось сделать все, но проблема заключается в том, что если ребенок использует диспетчер задач, чтобы убить мою службу, мое приложение бесполезно. Я был бы признателен всем, кто знает способ либо

1) следить за службой и запускать ее автоматически, если ее "убитый" или 2) препятствовать тому, чтобы кто-то мог его убить, кроме как из активности (экрана администрирования), запустившего службу. Или оба?

Прошу прощения, если я не очень четко описываю проблему, я новичок. Я до сих пор добился больших успехов, но я застрял в этом последнем препятствии.

4b9b3361

Ответ 1

Вы можете использовать метод API: startForeground(). Вот объяснение этого:

Начальная служба может использовать API startForeground (int, Notification) поставить службу в состояние переднего плана, где система учитывает это то, что пользователь активно осознает и, следовательно, не кандидат на убийство при низкой памяти. (Теоретически теоретически возможно, чтобы служба была убита при чрезвычайном давлении памяти от текущего приложения переднего плана, но на практике это должно не беспокойтесь.)

Здесь вы можете найти пример, как использовать это.

Что касается вопроса, вы не можете предотвратить убийство службы. Он может быть убит системой. Даже системные службы могут быть убиты. Если это произойдет, они будут перезапущены. Вы можете использовать тот же подход.

Ответ 2

Невозможно предотвратить это напрямую, без внедренного устройства. SDK помогает предотвратить эти проблемы.

Вы можете сделать "действительно злой" трюк и иметь две службы в двух приложениях. Каждая служба контролирует другую и перезапускает ее, если она останавливается. Это kludgy, но в большинстве случаев даже самый быстрый парень с пальцами не мог убить оба приложения.

Ответ 3

Вы можете написать вспомогательное приложение для приема широковещательной передачи Android "android.intent.action.PACKAGE_RESTARTED" , когда ваше приложение было убито, ваш помощник получит эту трансляцию, и вы можете перезапустить приложение или что-то еще.

Что такое "Умный защитник приложений бесплатно".

Плохая вещь - пользователи должны установить два приложения вместо одного.

Ответ 4

Для тех, кто все еще ищет ответ - этот может быть правильным:

Вы не можете: сделать службу неработоспособной, если при работе на малой памяти система всегда убьет вашу службу. НО

Вы можете: Сказать Системе перезапустить вашу службу, когда она будет убита. Посмотрите на этот кусок кода:

общедоступный статический финал int START_REDELIVER_INTENT

Добавлено на уровне API 5

Константа для возврата из onStartCommand(Intent, int, int):

если этот сервисный процесс будет прерван во время его запуска (после возвращения из onStartCommand(Intent, int, int))), то он будет запланирован для перезапуска, и последний доставленный Намерение будет повторно доставлен ему через onStartCommand(Intent, int, int). Это намерение будет оставаться запланированным для повторной доставки до тех пор, пока служба не вызовет stopSelf(int) с идентификатором запуска, предоставленным onStartCommand(Intent, int, int). Служба не получит вызов onStartCommand(Intent, int, int) с нулевым Намерением, потому что он будет перезапущен только в том случае, если он не завершит обработку всех отправленных ему Интентов (и любые такие ожидающие события будут доставлены в момент перезапуска).

Постоянное значение: 3 (0x00000003)

Ответ 6

Просто установите тип возврата START_STICKY.