2010-04-27 10 views
14

Tal vez puedas ayudar.Android killer de proceso

¿Es posible obtener una lista de todos los Processes que se ejecutan en el sistema Android y matar algunos de ellos? Sé que hay algunas aplicaciones (task managers), pero me gustaría escribir mi propia y simple aplicación.

Me gustaría escribir el administrador de tareas simple, solo la lista de todos los procesos y el botón que matará a algunos de ellos.

Podrías simplemente escribir algunos métodos Java a los que puedo llamar para obtener una lista del proceso y el método para eliminarlos. O solo dame algunos consejos.

Respuesta

41

Killing apps/services en Android es generalmente una muy mala idea. Si bien es posible escribir aplicaciones task killer, no se debe alentar para nada fuera de los propósitos de desarrollo/depuración.

La gestión de tareas es responsabilidad de Android O/S, las tareas que puede ver no son procesos (en el sentido de los procesos que ve en el administrador de tareas de Windows, por ejemplo), de hecho, solo tienen un proceso cuando Android les dice que pueden tener uno.

Las herramientas de administración de tareas regularmente rompen estas aplicaciones, ya que a menudo no se recuperan de la terminación forzada, especialmente si estaban ocupadas escribiendo en un archivo o usando otro recurso cuando se destruyeron. También pone a los usuarios del teléfono en una falsa expectativa de que las aplicaciones enumeradas son realmente EN EJECUCIÓN en su teléfono, que a menudo no lo son. Esto se explica en el [docs ActivityManager] [1]:

información se puede recuperar alrededor de un tarea particular que es actualmente "corriendo" en el sistema. Tenga en cuenta que una tarea en ejecución no significa que la tarea dada tiene un proceso en el que se está ejecutando ; simplemente significa que el usuario ha pasado a ella y nunca cerró, pero en la actualidad el sistema puede haber matado a su proceso y es sólo se aferra a su último estado en para reiniciarlo cuando el usuario vuelve .

Cuando vea la lista de running aplicaciones en aplicaciones como TaskKiller o Quick System Info, muchos de ellos no están funcionando realmente, no son más que en un estado suspendido. Estas aplicaciones no consumen recursos del sistema porque Android ha decidido detenerlos hasta que se vuelvan a necesitar. Sin embargo, cuando los matas, no les das tiempo para cerrarlos limpiamente, y cuando trates de lanzarlos la próxima vez, se te puede presentar un diálogo de cierre forzado poco amigable. He visto que las aplicaciones se rompen por completo, incluso con una reinstalación que no es efectiva, porque están tratando de leer un archivo dañado en la tarjeta SD, o usan llamadas API no oficiales.

En resumen, los amigos no permiten que los amigos usen Task Killers en Android.

De todos modos, para responder a su pregunta, el ActivityManager es lo que la mayoría de estas aplicaciones usan para enumerar las actividades que están en ejecución/suspendidas.

freetaskmanager es un ejemplo de uno de estos task managers en uso.

+0

Ok, ya veo. Gracias por la aclaración. Así que tal vez intentaré escribir mi simple administrador de tareas. – Martin

+4

¡Explicación fantástica! –

+9

Aunque estoy de acuerdo en que matar procesos es una mala idea, creo que en mi teléfono puede ser necesario ya que algunas aplicaciones no proporcionan una manera de cerrarse correctamente y mi teléfono puede volverse bastante lento y no reactivo. Usar un asesino de tareas resuelve este problema. – stealthcopter

6
// 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"); 
    } 
    } 
    */ 
+0

Esto no funcionará para el OP, porque el kernel evita que android.os.Process.killProcess mate la aplicación más allá del alcance de su paquete. –

3

salir de una aplicación de Android a través de Java es difícil de decir lo menos. Matar la aplicación a través de la interfaz del objeto de proceso generalmente se considera de mala calidad por todos los motivos enumerados anteriormente, no voy a modificarlos, pero no creo que los desalientos publicados pretendan evitar que lo hagas todo junto, simplemente te hacen consciente de posibles advertencias. Aquí está el truco, Android tiene que hacer un seguimiento de Actividades y load/run order porque los dispositivos tienen un botón back ... por lo que debes llamar finish() o y cuando el usuario exits la aplicación, hay una actividad previa de tu aplicación, felizmente ignorando tu código que lo pidió salir.

A veces, solo tiene que matar la aplicación. Entonces ... antes de cometer este proceso digital matar, tienes que hacer un poco de planificación. Asegúrese de que el usuario no mate ninguna E/S de archivo o comunicación de red vital para su aplicación. Mi estrategia para esto fue front load mis actividades para hacer todo el trabajo pesado en o cerca de los eventos de carga.

Además, siempre le pregunto al usuario antes de que salgan, una convención de UI de aplicación de escritorio que se traduce bien aquí.

El código anterior pierde la marca llamando "getUidForName" ...

En este ejemplo se captura el evento back button Android nativo desde el botón de hardware atrás y pide al usuario "es lo que realmente quiere salir de mi aplicación "y si el usuario selecciona" sí ", mata la aplicación.

@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); 
    } 
} 
+0

+1 ¡Muchas gracias! Escrita concisamente también. – AgentKnopf

+0

Esto no responde a la pregunta, muestra cómo matar la aplicación, no otras aplicaciones. –

Cuestiones relacionadas