Как я могу предотвратить "убивание" моего приложения / службы Android из диспетчера задач? - PullRequest
17 голосов
/ 07 мая 2010

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

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

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

Ответы [ 6 ]

10 голосов
/ 27 июля 2012

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

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

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

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

5 голосов
/ 13 марта 2013

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

Вот как это делает Smart App Protector Free.

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

5 голосов
/ 07 мая 2010

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

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

3 голосов
/ 21 февраля 2014

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

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

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

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

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

Константа, возвращаемая из onStartCommand (Intent, int, int):

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

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

1 голос
/ 04 мая 2018

Если у вас есть разрешения системного уровня, используйте persistent:true через разрешения манифеста.

https://developer.android.com/guide/topics/manifest/application-element

0 голосов
/ 02 августа 2015

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

...