Как убить запущенную задачу в андроид - PullRequest
16 голосов
/ 11 января 2012

Я пытаюсь создать приложение типа убийцы задач в Android. Я могу показать список запущенных в данный момент задач, используя ActivityManager , но столкнувшись с проблемой уничтожения задачи.

Вот что я делаю, чтобы получить список текущих выполняемых задач:

ActivityManager am = (ActivityManager) context.
            getSystemService(Activity.ACTIVITY_SERVICE);


List<RunningTaskInfo> a=am.getRunningTasks(Integer.MAX_VALUE);

PackageManager pack=this.getPackageManager();

for(int i=0;i<a.size();i++){

            String packageName = a.get(i).topActivity.getPackageName();

            Drawable d=null;
            String appName="";

            try {
                d=pack.getApplicationIcon(packageName);

                appName=(String)     pack.getApplicationLabel(pack.getApplicationInfo(packageName,PackageManager.GET_META_DATA));

            } catch (NameNotFoundException e) {
                e.printStackTrace();
            }

                    packName.add(packageName);  //arraylist of package name 
                apps.add(appName);          // arraylist of app name
                icons.add(d);               //arraylist of icons
        }

Это сработало для меня Но сейчас, когда я пытаюсь убить задачу с помощью killBackgroundProcesses:

am.killBackgroundProcesses(package name);

Это не сработало. Также killBackgroundProcesses метод доступен на уровне API 2.2, тогда как я могу выполнить ту же задачу на предыдущем уровне API, например, 1.6 и т. Д.

Есть ли другой способ показать текущие активные приложения и убить их.

Пожалуйста, помогите.

Большое спасибо.

Ответы [ 3 ]

22 голосов
/ 13 января 2012

Никто не может убить процесс, кроме самой ОС Android.

Большинство убийц задач на рынке Android не убивают приложение, они просто перезапускают процесс

с помощью

public void restartPackage (String packageName)

когда этот метод вызывается вашей деятельностью, операционная система немедленно вызывает

savedInstanceState и сохраните состояние того действия, которое вы хотите убить. Теперь этот процесс

удален из памяти и ОС сохранила его состояние. Теперь, когда пользователь в следующий раз запустит это действие, он

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

диспетчер задач, что они не убивают процесс, потому что никто не может этого сделать. Этот метод также

работа в ICS.

для вышеуказанного метода вы можете посмотреть здесь . Насколько я знаю killBackgroundProcesses (String packageName) для API 8 и выше.

13 голосов
/ 11 января 2012

В двух словах, автоматические убийцы задач работают, опрашивая ОС на предмет списка текущих запущенных процессов и памяти, которую они потребляют. Затем либо с помощью интеллектуального алгоритма, либо с помощью пользовательского ввода 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

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

Надеюсь, это поможет.

6 голосов
/ 30 января 2013

Вы указали ниже разрешение в файле манифеста?

<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...