viernes, 3 de junio de 2011

Aplicación para ver Procesos en Android

Antes de iniciar éste tutorial te dejo el link de donde puedes descargar éste tutorial en formato pdf y también el link de un video-tutorial acerca de ésta aplicación:




Muy bien, ahora sí, en este pequeño tutorial veremos cómo crear una aplicación en Android que nos muestre los siguientes datos de los procesos que estan corriendo actualmente:

-Usuario.
-Id del Proceso.
-Id del Proceso Padre.
-Nombre del Proceso.

Antes de continuar debo aclarar que esta aplicación la desarrollé en Ubuntu 10.10, utilizando el IDE Eclipse de java y Android. Si no sabes como instalarte Eclipse junto con Android acá te dejo un link en donde puedes guiarte para hacer ésto:

http://www.mclarenx.com/2010/01/11/instalar-android-sdk-en-ubuntu-linux/

Bueno, ahora que ya tienes instalado eclipse junto con Android procederemos a crear un nuevo proyecto. Para ésto vamos a Nuevo Proyecto -> Proyecto y luego elegimos la opción "Android Project".


Luego haces clic en siguiente e introduces los datos que se te piden. Al primero, "Project Name", le coloqué "Procesos", luego debes seleccionar con cuál API usarás el emulador de android. Yo utilizé para este ejemplo "Android 1.6".



Luego, mas abajo, ingresas el nombre de la aplicación, el nombre del paquete (debe llevar el nombre que quieras seguido de ".com"), el nombre de la clase que extenderá de la clase "Activity" (puede ser cualquier nombre), y la versión del SDK, que en éste caso es 4.


Luego de ésto haces clic en finish y tu proyecto estará creado. Al inicio el proyecto tiene una clase que por default contiene el siguiente código:

package Procesos.com;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Procesos extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);               
    }        
}


Al correr este proyecto veremos el emulador de un celular que nos mostrará el mensaje "Hello World". Ahora les muestro el código para que se vea la primera pantalla de nuestra aplicación.



package Procesos.com;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class Procesos extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        final EditText txtNombre = (EditText)findViewById(R.id.txtNombre);
        Button btnIngresar = (Button)findViewById(R.id.btnIngresar);
        
        btnIngresar.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View arg0){
        Intent intent = new Intent(Procesos.this, FrmProcesos.class);
        Bundle bundle = new Bundle();
        bundle.putString("NOMBRE", txtNombre.getText().toString());
        intent.putExtras(bundle);
        startActivity(intent);
        }
        });
    }        
}

Como pueden ver hemos agregado algunas lineas de código:

        final EditText txtNombre = (EditText)findViewById(R.id.txtNombre);
        Button btnIngresar = (Button)findViewById(R.id.btnIngresar);

Lo que hacemos con éstas dos líneas de código es obtener los objetos que están en nuestra pantalla, el primero es un cuadro de texto llamado txtNombre y el segundo es un botón llamado btnIngresar. Cuando logramos acceder a ellos podemos manipularlos como queramos, es por ello que en las siguientes lineas de código agregamos un evento al boton btnIngresar y también obtenemos el texto que hemos ingresado en el cuadro de texto txtNombre.

        btnIngresar.setOnClickListener(new OnClickListener(){
         @Override
         public void onClick(View arg0){
         Intent intent = new Intent(Procesos.this, FrmProcesos.class);
         Bundle bundle = new Bundle();
         bundle.putString("NOMBRE", txtNombre.getText().toString());
         intent.putExtras(bundle);
         startActivity(intent);
         }
        });

Antes de continuar debes saber que cada pantalla tiene un archivo .xml en el que se definen los controles que se usarán. El .xml que nuestro proyecto trae por default se llama "main.xml" y al agregar los controles para nuestra aplicación se ve así:


Si haces clic en la pestaña "Graphical Layout" podrás tener una vista previa de la pantalla en la que estás trabajando:



El código de nuestro archivo main.xml es el siguiente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:text="Ingresa tu Nombre:"
    />
<EditText android:layout_height="wrap_content" android:layout_width="fill_parent" android:id="@+id/txtNombre" android:text=""></EditText>
<Button android:layout_height="wrap_content" android:id="@+id/btnIngresar" android:text="Ingresar" android:layout_width="wrap_content"></Button>
</LinearLayout>


Bueno, ahora que ya tenemos lista nuestra primera pantalla debemos crear los archivos correspondientes a la segunda pantalla de nuestra aplicación que es en la que mostraremos los procesos activos. 

Primero debes crear una nueva clase java, en éste caso yo la llamé FrmProcesos la cual debe extender de la clase Activity.


También crearemos un archivo .xml para definir los controles que ésta pantalla usará. En éste caso yo le puse de nombre frmprocesos.xml (puede ser cualquier nombre pero debes ponerlo todo en minúsculas o sino no te funcionará). El archivo frmprocesos.xml se ve así:


Si hacemos clic en la pestaña "Graphical Layout" podremos ver cómo lucirá la segunda pantalla de nuestra aplicación:



Bueno, ahora veremos el código de nuestra clase FrmProcesos:

package Procesos.com;

import java.io.DataInputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;


public class FrmProcesos extends Activity{
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.frmprocesos);
//obtiene los controles de la pantalla.
TextView txtMensaje = (TextView)findViewById(R.id.txtMensaje);
final TextView lblCantidadProcesos = (TextView)findViewById(R.id.lblCantidadProcesos);
final TextView lblProcesos = (TextView)findViewById(R.id.lblProcesos);
Button btnVerProcesos = (Button)findViewById(R.id.btnVerProcesos);
//muestra un saludo al usuario.
Bundle bundle = getIntent().getExtras();
txtMensaje.setText("Hola " + bundle.getString("NOMBRE"));
//cuenta el numero de procesos y los muestra en un mensaje.
int num_procesos = numProcesos();
lblCantidadProcesos.setText("Hay " + num_procesos + " procesos corriendo en el sistema.");
//acciones para el boton "btnVerProcesos"       
        btnVerProcesos.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View arg0){           
        lblProcesos.setText(Leer_Procesos());    
        }
        });
}
//cuenta el numero de procesos.
private int numProcesos(){
int i = -1;
try {
Process proceso = Runtime.getRuntime().exec("ps");
DataInputStream in = new DataInputStream(proceso.getInputStream());
String line = "";
while ((line = in.readLine()) != null){
     i++;        
}
} catch (Exception e) {
System.err.println("Error en FrmProcesos.Procesos():");
e.printStackTrace();
}
return i;
}
//lee los procesos
private String Leer_Procesos(){
String lista = "";
try {
Process proceso = Runtime.getRuntime().exec("ps");
DataInputStream in = new DataInputStream(proceso.getInputStream());
String line = "";
while ((line = in.readLine()) != null){    
lista = lista + "\n" + obtener_datos_proceso(line);
}
} catch (Exception e) {
// TODO Auto-generated catch block
System.err.println("Error en FrmProcesos.Leer_Procesos():");
e.printStackTrace();
}
return lista;
}
private String obtener_datos_proceso(String linea){
//quita los espacios en blanco y los sustituye con una coma
//para que sea más facil obtener los datos del proceso...
linea = linea.replace("      ", ",");
linea = linea.replace("     ", ",");
linea = linea.replace("    ", ",");
linea = linea.replace("   ", ",");
linea = linea.replace("  ", ",");
linea = linea.replace(" ", ",");
linea = linea.replace(",,", ",");
String usuario = "";
String id = "";
String id_padre = "";
String nombre = "";
String lista_datos = "";
//leo el usuario
usuario = linea.substring(0, linea.indexOf(","));
lista_datos = lista_datos + "     " + usuario;
linea = linea.substring(linea.indexOf(",")+1, linea.length());
//leo el id
id = linea.substring(0, linea.indexOf(","));
lista_datos = lista_datos + "     " + id;
linea = linea.substring(linea.indexOf(",")+1, linea.length());
//leo el id del padre
id_padre = linea.substring(0, linea.indexOf(","));
lista_datos = lista_datos + "     " + id_padre;
linea = linea.substring(linea.indexOf(",")+1, linea.length());
//leo el nombre del proceso
nombre = linea.substring(linea.lastIndexOf(",")+1, linea.length());
lista_datos = lista_datos + "     " + nombre;
return lista_datos;
}
}

Lo primero que hacemos acá es obtener los controles de la segunda pantalla de nuestra aplicación, luego mostramos el saludo obteniendo el nombre que ingresamos en el cuadro de texto de la pantalla anterior mediante las líneas:

//muestra un saludo al usuario.
Bundle bundle = getIntent().getExtras();
txtMensaje.setText("Hola " + bundle.getString("NOMBRE"));

Luego, obtenemos la cantidad de procesos que están corriendo y lo mostramos también en un mensaje:

                //cuenta el numero de procesos y los muestra en un mensaje.
int num_procesos = numProcesos();
lblCantidadProcesos.setText("Hay " + num_procesos + " procesos corriendo en el sistema.");

Ahora agregamos un evento al botón "btnVerProcesos" para que al hacer clic en él veamos el listado de procesos que están corriendo:

 btnVerProcesos.setOnClickListener(new OnClickListener(){
         @Override
         public void onClick(View arg0){            
         lblProcesos.setText(Leer_Procesos());     
         }
        });
}


En el método "Leer_Procesos()" utilizamos la clase "Process" y la clase Runtime para leer los procesos activos del sistema:

                        Process proceso = Runtime.getRuntime().exec("ps");
DataInputStream in = new DataInputStream(proceso.getInputStream());
String line = "";
while ((line = in.readLine()) != null){     
lista = lista + "\n" + obtener_datos_proceso(line);
}

Lo que hacemos es leer mediante la clase DataInputStream la información de los procesos. Dentro del while utilizamos la variable "line" que lee linea por linea de la información del objeto "proceso". Cada una de éstas líneas contiene varios datos acerca de un proceso, por lo que entendemos que debemos "cortar" cada una de ésas líneas para obtener solamente el usuario, id, id del padre, y nombre de cada proceso. Para ello utilizamos el método "obtener_datos_proceso" el cual recibe como parámetro la línea completa que contiene todos los datos de un proceso y nos devuelve un string que contiene sólo los datos que a nosotros nos interesa. Al obtener los datos de un proceso los concatenamos en la variable "lista" y al final esta variable contiene una lista de procesos sólo con los datos que nosotros necesitamos. Para mostrar ésta lista utilizamos la siguiente línea de código (se encuentra en el evento agregado al botón btnVerProcesos):

lblProcesos.setText(Leer_Procesos());


Al correr nuestra aplicación veremos algo como ésto:


Luego, al hacer clic en el botón "menu" se muestra la primera pantalla de nuestra aplicación. Ingresamos un nombre y luego hacemos clic en Ingresar para ir hacia la segunda pantalla.


Como puede notarse, al inicio está el saludo que contiene el nombre ingresado en la pantalla anterior y luego se ve un mensaje que nos dice cuántos procesos se están ejecutando actualmente. También podemos ver el botón para ver los procesos.


Al hacer clic en el botón "Ver Procesos" podremos ver el listado de los procesos y sus datos, el primero es el usuario, luego el Id del proceso, luego el id del proceso padre y por último el nombre del proceso.


Esto es todo acerca de ésta pequeña aplicación, espero sea de ayuda. Hasta pronto.


No hay comentarios:

Publicar un comentario