Android-убийца процессов - PullRequest
       19

Android-убийца процессов

15 голосов
/ 27 апреля 2010

Может быть, вы можете помочь.

Можно ли получить список всех Processes, работающих в системе Android, и убить некоторых из них? Я знаю, что есть некоторые приложения (task managers), но я хотел бы написать собственное простое приложение.

Я хотел бы написать простой диспетчер задач, просто список всех процессов и кнопку, которая убьет некоторые из них.

Не могли бы вы написать несколько методов Java, которые я могу вызвать, чтобы получить список процессов и метод для их уничтожения. Или просто дайте мне несколько советов.

Ответы [ 3 ]

40 голосов
/ 27 апреля 2010

Уничтожение приложений / сервисов в Android - это, как правило, действительно плохая идея . Хотя можно написать task killer приложения, его не следует поощрять ни для чего, кроме целей разработки / отладки.

За управление задачами отвечает Android O / S, задачи, которые вы видите, не являются процессами (в смысле процессов, которые вы видите в диспетчере задач Windows, например), фактически, у них есть процесс только тогда, когда Android сообщает им, что он может иметь его.

Приложения регулярно ломаются этими инструментами управления задачами, поскольку они часто не могут восстановиться после принудительного завершения, особенно если они были заняты записью в файл или использованием другого ресурса, когда они были убиты. Это также ставит пользователей мобильных телефонов в ложное ожидание того, что перечисленные приложения на самом деле RUNNING на их телефоне, чего они часто не делают. Это объясняется в [Документах ActivityManager] [1]:

Информация, которую вы можете получить о конкретная задача, которая в настоящее время «работает» в системе. Обратите внимание, что текущее задание не означает данное Задача актуальная имеет процесс это активно работает в; это просто значит что пользователь пошел на это и никогда закрыл его, но в данный момент система возможно, убил его процесс и является только держится до своего последнего состояния в Чтобы перезапустить его, когда пользователь возвращается.

Когда вы видите список running приложений в таких приложениях, как TaskKiller или Quick System Info, многие из них на самом деле не работают, они просто находятся в приостановленном состоянии. Эти приложения не потребляют системные ресурсы, потому что Android решил остановить их, пока они не понадобятся снова. Однако, когда вы их убиваете, вы не даете им времени на чистое завершение работы, а когда вы пытаетесь запустить их в следующий раз, вам может быть представлен недружественный диалог принудительного закрытия. Я видел, как приложения полностью ломаются, и даже переустановка оказывается неэффективной, потому что они пытаются прочитать поврежденный файл на SD-карте или используют неофициальные вызовы API.

Короче говоря, друзья не позволяют друзьям использовать убийцы задач в Android.

В любом случае, чтобы ответить на ваш вопрос, ActivityManager - это то, что большинство этих приложений используют для перечисления действий, которые находятся в запущенном / приостановленном состоянии.

freetaskmanager является примером одного из этих task managers в использовании.

7 голосов
/ 31 декабря 2010
    // Get currently running application processes
    List<ActivityManager.RunningAppProcessInfo> list = servMng.getRunningAppProcesses();
    if(list != null){
     for(int i=0;i<list.size();++i){
      if("com.android.email".matches(list.get(i).processName)){
       int pid = android.os.Process.getUidForName("com.android.email");
             android.os.Process.killProcess(pid);
      }else{
       mTextVIew.append(list.get(i).processName + "\n");
      }
     }
    }


    /*
    // Get currently running service
    List<ActivityManager.RunningServiceInfo> list = servMng.getRunningServices(1024);
    if(list != null){
     for(int i=0;i<list.size();++i){
      mTextVIew.append(list.get(i).service.getClassName() + "\n");
     }
    }
    */

    /*
    // Get currently running tasks
    List<ActivityManager.RunningTaskInfo> list = servMng.getRunningTasks(1024);
    if(list != null){
     for(int i=0;i<list.size();++i){
      mTextVIew.append(list.get(i).toString() + "\n");
     }
    }
    */
3 голосов
/ 05 апреля 2011

Выход из Android-приложения через Java сложен, если не сказать больше. Уничтожение приложения через интерфейс Process Object обычно считается плохой формой по всем причинам, перечисленным выше, я не буду перефразировать их, но я не чувствую, что опубликованные разочарования предназначены для того, чтобы помешать вам делать все это вместе, они просто заставляют вас знать о возможных предостережениях. Вот в чем проблема: Android должен отслеживать действия и load/run order, потому что на устройствах есть кнопка back ... так что вы покорно вызываете finish() или finishFromChild(childActivity), а когда пользователь exits приложение, есть предыдущее действие из вашего приложения, к счастью игнорируя код, который попросил его выйти.

Иногда вам просто нужно убить приложение. Итак ... прежде чем совершить это уничтожение цифрового процесса, вам нужно немного спланировать. Убедитесь, что пользователь не будет убивать файловый ввод-вывод или сетевую связь, жизненно важную для вашего приложения. Моя стратегия для этого состояла в том, чтобы front load моей Деятельности выполнять всю тяжелую работу на или около событий нагрузки.

Кроме того, я всегда запрашиваю пользователя перед его выходом, соглашение пользовательского интерфейса настольного приложения, которое хорошо здесь переводится.

Приведенный выше код пропускает отметку, вызывая "getUidForName" ...

В этом примере фиксируется событие Android Native back button с аппаратной кнопки «Назад», и пользователю предлагается «действительно ли вы хотите покинуть мое приложение», а если пользователь выбирает «да», приложение убивает.

    @Override 
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //Handle the back button
    if(keyCode == KeyEvent.KEYCODE_BACK) {
        //Ask the user if they want to quit
        new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.exclamationpoint)
        .setTitle("Exit?")
        .setMessage("You are about to exit the Application. " + 
                     "Do you really want to exit?")
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
             @Override
            public void onClick(DialogInterface dialog, int which) {
                //Stop the activity
                 //maintenancetabs.this.finish();
                 int pid = android.os.Process.myPid();
                 android.os.Process.killProcess(pid);
                }
         })
        .setNegativeButton("No", null)
        .show();
         return true;
    }     else {
        return super.onKeyDown(keyCode, event);
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...