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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

    // 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

Выход из приложения 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);
    }
 }