В двух словах, автоматические убийцы задач работают, опрашивая ОС на предмет списка текущих запущенных процессов и памяти, которую они потребляют. Затем либо с помощью интеллектуального алгоритма, либо с помощью пользовательского ввода Task Killers отправляет вызов системе, сообщая системе, что нужно завершить процесс. Есть два API, вы можете сделать это.
Они
- Process.sendSignal (pid, Process.SIGNAL_KILL);
- ActivityManager.killBackgroundProcesses (PACKAGENAME)
Это сначала работает, вызывая Process.killProcess (int pid), где pid является уникальным идентификатором для конкретного процесса. Android убивает процессы так же, как Linux; однако пользователь может уничтожать только те процессы, которые ему принадлежат. В Android каждое приложение запускается с уникальным UID, идентификатором пользователя. Таким образом, используя этот API, приложение может уничтожать только свои собственные процессы, поэтому в документах для Process.killProcess (int pid) приведено следующее объяснение :
Убить процесс с помощью данного PID. Обратите внимание, что, хотя этот API позволяет
мы просим убить любой процесс, основанный на его PID, ядро
по-прежнему накладывают стандартные ограничения на то, какие PID вы на самом деле можете
убить. Как правило, это означает, что только процесс, выполняющий вызывающую
пакеты / приложение и любые дополнительные процессы, созданные этим приложением;
пакеты с общим UID также смогут убивать друг друга
процессы.
Когда этот метод вызывается, сигналы генерируются ОС и задаются для процесса. Всякий раз, когда процесс получает сигнал от ОС, он должен либо обработать этот сигнал, либо сразу же умереть. Такие сигналы, как SIG_KILL
, не могут быть обработаны и приводят к немедленной смерти процесса получателя. Если вы хотите уничтожить процессы, для которых у вас нет привилегий, т. Е. Это не ваш процесс, вы должны повысить свои привилегии с помощью sudo (для этого потребуются привилегии root на устройстве).
Второй API работает, сообщая ActivityManager
, что вы хотите уничтожить процессы, связанные с конкретным Пакетом. Этот API обходит необходимость для вашего UID соответствовать UID процесса, потому что требует, чтобы пользователь принял разрешение KILL_BACKGROUND_PROCESSES. Это разрешение сигнализирует ОС, что приложение было одобрено пользователем как убийца задач. Когда убийца задач хочет убить приложение, он заставляет ОС сделать это, решая проблему, состоящую только в том, чтобы иметь возможность убивать процессы, которыми вы владеете.
В Android Docs говорится, что этот API фактически использует первый API-интерфейс Process.killProcess
Пусть система немедленно уничтожит все фоновые процессы, связанные
с данным пакетом. Это то же самое, что ядро, убивающее тех,
процессы, чтобы восстановить память; система позаботится о перезапуске
эти процессы в будущем по мере необходимости.
Надеюсь, это поможет.