Предотвращение закрытия некоторых пользователей Android

Я делаю сервис на Android, где он будет установлен на телефоне/планшете. Многие люди могут использовать этот планшет, но только выбранные должны иметь право закрыть службу. Как я могу это достичь? Я googled и нашел некоторые варианты:

  • Создание учетных записей пользователей. Для этого существует множество приложений, но они не указывают, будет ли запущен сервис, запущенный в одной учетной записи, для других учетных записей.
  • Запрос пароля перед закрытием службы: Есть много stackoverflow Q.for это, но выглядит невозможным.
  • Перезапустите службу, когда пользователь ее закроет: перезапуск может привести к потере данных, поскольку моя служба постоянно обменивается данными с другими устройствами для сбора данных.

НОВЫЙ ВАРИАНТ:

У меня есть другая идея, чтобы заставить его работать: я сделаю это системное приложение, чтобы оно предупредило пользователя, когда он пытается его остановить. Для системных приложений, когда пользователь нажимает кнопку "Стоп" из настроек, появляется предупреждающее сообщение: "Закрытие этого приложения может привести к... (бла-бла)...". Знаете ли вы, какое намерение выбрано для всплытия этого сообщения? Я думаю, что могу использовать это намерение здесь и отключить опцию "ОК" в этом сообщении

I want to disable this "OK".

Ответ 1

Даже если пользователь не может остановить службу, телефон все равно может отключиться от питания, разрядиться от батареи или потерять сетевое подключение. Можно даже предположить, что Android может убить сервисный процесс, если он будет работать с ограниченными ресурсами. Поэтому код должен быть подготовлен для обработки потенциальной потери данных в этих событиях.

Я не уверен, как вы обнаруживаете, когда служба остановлена, но всегда AlarmManager для периодического опроса.

Ответ 2

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

Используйте startForeground. Как указано в документах:

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

Верните START_STICKY из onStartCommand, чтобы перезапустить службу, как только пользователь закроет вашу службу. В большинстве случаев ваша служба будет перезапущена в < 5s, однако это зависит от того, как часто ваша служба будет убита подряд.

Эти два метода сделают ваш сервис практически бесполезным.

Ответ 3

Вы хотите, чтобы отключить настройки?

Если это так, то в вашей службе вы можете отслеживать текущие потоки и убивать те, которые принадлежат параметрам (по имени пакета), или просто заставить систему вернуться к запуску, пользователь никогда не достигнет контекста, в котором можно закрыть процессы.

Это решение не искажает правильность (Google рекомендует не делать этого), но это не позволит пользователю даже увидеть этот вариант, а для локального (не целого рынка) приложения это может быть приемлемым.

В любом случае, если вы можете обрабатывать некоторую потерю данных (всего на несколько секунд), я бы сказал, что вы используете ответ RETURN_STICKY.