2012-03-21 18 views

Respuesta

25

Una vez más, estoy respondiendo demasiado tarde, pero como corro en la misma situación hoy, pensé compartir mis hallazgos para ayudar a alguien.

En primer lugar, debe comprender lo que puede matar y qué no. Desde el punto de vista de Android, una aplicación no es como otros sistemas operativos. Una aplicación de Android consiste en muchos componentes (actividades, receptores de difusión, servicios, tareas más importantes, etc.) que se empaquetan en un paquete. Un paquete puede tener más de un proceso en ejecución dependiendo de sus componentes en ejecución.

Ahora la parte interesante es que un paquete de Android no se considera (por androide) mataron o detuvo si alguno o todos sus procesos han muerto, de hecho, un paquete se puede seguir funcionando incluso cuando no hay procesos corriendo en absoluto. Puede ver este efecto si inicia un emulador, inicia un programa (es decir, el navegador) y luego cancela su proceso a través del DDMS; luego, vaya a la configuración del paquete de la aplicación (Settings --> Applications --> Manage Applications --> All --> Browser), puede ver el botón Force Stop activado, esto significa que la aplicación todavía se está ejecutando (desde el punto de vista de Android). Lo que sucedió aquí es que la aplicación tiene una o más tareas congeladas. Es decir, Android ha guardado el estado de las actividades (tareas o tareas) de la aplicación y, por lo tanto, el paquete aún se está ejecutando o es mejor si el usuario vuelve a él, aterrizará en lo último que estaba haciendo. Ahora, si hace clic en el botón Force Stop, Android descartará todas estas tareas congeladas y cuando el usuario regrese a la aplicación, verá la primera actividad. A Tarea es algo que no puede matar (desde froyo) solo el usuario (desde botón Forzar parada), el sistema o una aplicación de terceros que está firmada con la misma clave del sistema puede hacerlo (y tal vez una raíz aplicación capaz pero no he confirmado esto). Por otro lado, un procesoes algo que puede matar y recuperar la memoria que utiliza, siempre y cuando usted sigue algunas restricciones:

  1. Tiene el permiso android.permission.KILL_BACKGROUND_PROCESSES.
  2. Los procesos no son procesos del sistema o raíz.
  3. El proceso no pertenece a un componente que es persistente.
  4. El proceso no es crítico para que el sistema funcione por otros medios.

Además de la regla Nº 1 que no tiene que hacer algo al respecto, Android se hará cargo de esto.

ActivityManager tiene una función práctica que puede utilizar para matar todos los procesos que un paquete tiene a la vez. Cuando lo invocas, Android matará cualquier proceso que pueda ser eliminado y así liberar algo de memoria. Sin embargo, el estado de las tareas para este paquete se guardará y cuando el usuario regrese a la aplicación verá lo último que estaba haciendo a menos que el sistema en sí lo haya eliminado. Esto puede ocurrir ya sea porque necesita recursos o porque el estado se guardó hace mucho tiempo (aproximadamente 30 minutos). El efecto secundario es que, como los usuarios piensan que todas las aplicaciones son como en los sistemas operativos de escritorio, no creen que la aplicación esté realmente cerrada, pero esta es la vida con Android.

Ahora al código:

Para mi proyecto he preparado tres funciones para lograr esto.

El primero busca el primer proceso que un paquete puede tener y devuelve -1 si no hay ninguno.

private Context cx; 
private ActivityManager am = (ActivityManager) cx.getSystemService(Context.ACTIVITY_SERVICE); 

public int findPIDbyPackageName(String packagename) { 
    int result = -1; 

    if (am != null) { 
     for (RunningAppProcessInfo pi : am.getRunningAppProcesses()){ 
      if (pi.processName.equalsIgnoreCase(packagename)) { 
       result = pi.pid; 
      } 
      if (result != -1) break; 
     } 
    } else { 
     result = -1; 
    } 

    return result; 
} 

El segundo hace algo estúpido pero lo necesito para mi proyecto.

public boolean isPackageRunning(String packagename) { 
    return findPIDbyPackageName(packagename) != -1; 
} 

El tercero hace el trabajo.

public boolean killPackageProcesses(String packagename) { 
    boolean result = false; 

    if (am != null) { 
     am.killBackgroundProcesses(packagename); 
     result = !isPackageRunning(packagename); 
    } else { 
     result = false; 
    } 

    return result; 
} 

Son confirmados para trabajar con la API emulador 8 y 9 y en un dispositivo real (Galaxy S2) con API 15 y matan a los procesos de cualquier aplicación (no sólo la suya), siempre y cuando no sean necesario.

Ahora sobre la documentación android.os.Process.killProcess que establece que:

... Normalmente, esto significa que sólo el proceso de ejecución de la persona que llama paquetes/aplicaciones y los procesos adicionales creados por esa aplicación; ...

creo que "el proceso que se ejecuta de la persona que llama paquetes/aplicación" se entiende la aplicación casa lanzador y no su propia aplicación. Su aplicación es la llamada y el proceso que ejecuta los paquetes de la persona que llama/la aplicación es el iniciador doméstico o cualquier otra aplicación que haya iniciado su aplicación. Esta es la única forma de explicar que la función killBackgroundProcesses y la función android.os.Process.killProcess funcionan en aplicaciones de terceros.

+0

¡Gracias por la respuesta completa! –

+0

Explicación brillante .. –

1

de pie en el doc:

matar el proceso con el dado PID. Tenga en cuenta que, aunque esta API nos permite solicitar que se elimine cualquier proceso basado en su PID, el kernel seguirá imponiendo restricciones estándar sobre los PID que realmente puede eliminar. Por lo general, esto significa solo el proceso que ejecuta los paquetes/aplicaciones de la persona que llama y cualquier proceso adicional creado por esa aplicación; los paquetes que comparten un UID común también podrán matar los procesos de los demás.

para que pueda matar a su propio proceso ..

ver la documentación Process. Traté de ejecutar adb shell kill pid pero requiere permiso de superusuario

+0

Sé que puedo matar a mis propios procesos, mi pregunta es cómo matar a un proceso extraño. –

+1

hasta donde sé que no puede, si no tiene los derechos para matar a ese proceso – Blackbelt

+0

Criss

Cuestiones relacionadas