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

Как убить текущую задачу в android

Я пытаюсь создать приложение типа убийцы задачи в 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 и т.д.

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

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

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

4b9b3361

Ответ 1

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

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

используя

public void restartPackage (String packageName)

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

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

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

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

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

работает в ICS.

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

Ответ 2

Вкратце, автоматические убийцы задач работают, опросив ОС для списка текущих запущенных процессов и памяти, которую они потребляют. Затем либо с помощью интеллектуального алгоритма, либо с пользовательским вводом Task Killers вызывают вызов системе, сообщающей системе, чтобы убить процесс. Есть два примера, которые вы можете сделать.

Они

  • Process.sendSignal(pid, Process.SIGNAL_KILL);
  • ActivityManager.killBackgroundProcesses(Имя_пакет)

Это сначала работает, вызывая Process.killProcess(int pid), где pid - уникальный идентификатор для конкретного процесса. Android убивает процессы так же, как Linux; однако пользователь может только убивать процессы, которыми они владеют. В Android каждое приложение запускается с уникальным идентификатором пользователя, идентификатором пользователя. Таким образом, используя этот API, приложение может только убивать свои собственные процессы, следовательно, следующее объяснение в документах для Process.killProcess(int pid):

Убейте процесс с заданным PID. Обратите внимание, что хотя этот API позволяет нам, чтобы запросить убить любой процесс на основе его PID, ядро ​​будет все еще налагают стандартные ограничения, на основании которых вы действительно способны убить. Обычно это означает только процесс, выполняющий пакетов/приложений и любых дополнительных процессов, созданных этим приложением; пакеты, совместно использующие общий UID, также смогут убивать друг друга процессы.

Когда этот метод называется, сигналы генерируются ОС и устанавливаются в процесс. Всякий раз, когда процесс получает сигнал от ОС, он должен либо обрабатывать этот сигнал, либо сразу умирать. Сигналы, такие как SIG_KILL, не могут быть обработаны и приводят к немедленной смерти процесса получателя. Если вы хотите убить процессы, у которых нет прав на убийство, т.е. Не ваш процесс, тогда вы должны повысить свои привилегии с помощью sudo (для этого потребуются привилегии root на устройстве).

Второй API работает, сообщая ActivityManager, что вы хотите убить процессы, связанные с определенным пакетом. Этот API обходит необходимость в UID, чтобы он соответствовал UID процесса, потому что он требует, чтобы пользователь принял разрешение KILL_BACKGROUND_PROCESSES. Это разрешение сигнализирует ОС, что приложение было одобрено пользователем как убийца задачи. Когда убийца задач хочет убить приложение, он сообщает ОС, чтобы он справлялся с проблемой только возможности убить процессы, которые у вас есть.

В Android Docs говорится, что этот API фактически использует первый API Process.killProcess

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

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

Ответ 3

Вы вошли в разрешающую способность в файле манифеста?

<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>