Entradas populares

viernes, 5 de junio de 2015

Clases y objetos


La programación orientada a objetos se basa en la programación de clases; a diferencia de la programación estructurada, que está centrada en las funciones.
Una clase es un molde del que luego se pueden crear múltiples objetos, con similares características.
Una clase es una plantilla (molde), que define atributos (variables) y métodos (funciones)
La clase define los atributos y métodos comunes a los objetos de ese tipo, pero luego, cada objeto tendrá sus propios valores y compartirán las mismas funciones.
Debemos crear una clase antes de poder crear objetos (instancias) de esa clase. Al crear un objeto de una clase, se dice que se crea una instancia de la clase o un objeto propiamente dicho.
La estructura de una clase es:


class [nombre de la clase] {
  [atributos o variables de la clase]
  [métodos o funciones de la clase]
  [main]

Una clase es una plantilla de la que se crean los objetos individuales.
A continuación un ejemplo de una clase en Java:
public class Carro{
   String marca;
   int kilometraje;
   String color;

   void encender(){
   }

   void acelerar(){
   }

   void apagar(){
   }
}

Una clase puede contener cualquiera de los siguientes tipos de variables:
  • Variables locales: Las variables definidas dentro de los métodos, los constructores o los bloques se denominan variables locales. Se declara la variable y se inicializa en el método y la variable será destruida cuando el método se ha completado.
  • Variables de instancia: Las variables de instancia son variables dentro de una clase, pero fuera de cualquier método. Estas variables se crean instancias cuando se carga la clase. Las variables de instancia se puede acceder desde el interior de cualquier método, constructor o bloques de esa clase en particular.
  • Variables de clase: Las variables de clase son variables declaradas dentro una clase y fuera de cualquier método. En el ejemplo anterior marca, kilometraje y color son variables de clase Carro.
Una clase en Java puede tener cualquier número de métodos para acceder o modificar el comportamiento de dicha clase. En el ejemplo anterior encender, acelerar y apagar son métodos de clase Carro.
Ejemplo:
Confeccionar una clase que permita carga el nombre y la edad de una persona. Mostrar los datos cargados. Imprimir un mensaje si es mayor de edad (edad>=18)

Programa:

import java.util.Scanner;
public class Persona {
    private Scanner teclado;
    private String nombre;
    private int edad;
   
    public void inicializar() {
        teclado=new Scanner(System.in);
        System.out.print("Ingrese nombre:");
        nombre=teclado.next();
        System.out.print("Ingrese edad:");
        edad=teclado.nextInt();
    }
   
    public void imprimir() {
        System.out.println("Nombre:"+nombre);
        System.out.println("Edad:"+edad);
    }
   
    public void esMayorEdad() {
        if (edad>=18) {
            System.out.print(nombre+" es mayor de edad.");
        } else {
            System.out.print(nombre+" no es mayor de edad.");
        }
    }
   
    public static void main(String[] ar) {
        Persona persona1;
        persona1=new Persona();
        persona1.inicializar();
        persona1.imprimir();
        persona1.esMayorEdad();
    }
}

El nombre de la clase debe hacer referencia al concepto (en este caso la hemos llamado Persona):

public class Persona {

Los atributos los definimos dentro de la clase pero fuera de la main:

    private Scanner teclado;
    private String nombre;
    private int edad;

Más adelante se dará a conocer que un atributo es normalmente definido con la cláusula private (con esto no permitimos el acceso al atributo desde otras clases)
A los atributos se tiene acceso desde cualquier función o método de la clase (salvo la main)
Luego de definir los atributos de la clase se debe declarar los métodos o funciones de la clase. La sintaxis es parecida a la main (sin la cláusula static):

    public void inicializar() {
        teclado=new Scanner(System.in);
        System.out.print("Ingrese nombre:");
        nombre=teclado.next();
        System.out.print("Ingrese edad:");
        edad=teclado.nextInt();
    }

En el método inicializar (que será el primero que se debe llamar desde la main) se debe crear el objeto de la clase Scanner y cargar por teclado los atributos nombre y edad. Como se puede ver el método inicializar puede hacer acceso a los tres atributos de la clase Persona.
El segundo método tiene por objetivo imprimir el contenido de los atributos nombre y edad (los datos de los atributos se cargaron al ejecutarse previamente el método inicializar:

    public void imprimir() {
        System.out.println("Nombre:"+nombre);
        System.out.println("Edad:"+edad);
    }

El tercer método tiene por objetivo mostrar un mensaje si la persona es mayor o no de edad:

    public void esMayorEdad() {
        if (edad>=18) {
            System.out.print(nombre+" es mayor de edad.");
        } else {
            System.out.print(nombre+" no es mayor de edad.");
        }
    }

Por último en la main se declara un objeto de la clase Persona y se le llama a los métodos en un orden adecuado:

    public static void main(String[] ar) {
        Persona persona1;
        persona1=new Persona();
        persona1.inicializar();
        persona1.imprimir();
        persona1.esMayorEdad();
    }


Persona persona1; //Declaración del objeto
persona1=new Persona(); //Creación del objeto
persona1.inicializar(); //Llamada de un método

Características principales del lenguaje java.

Java es un lenguaje de programación de propósito general orientado a objetos desarrollado por Sun Microsystems. También se puede decir que Java es una tecnología que no sólo se reduce al lenguaje sino que además provee de una máquina virtual Java que permite ejecutar código compilado Java, sea cual sea la plataforma que exista por debajo; plataforma tanto hardware, como software (el sistema operativo que soporte ese hardware). El apoyo a esta tecnología viene dado por la gran cantidad de fabricantes que apoyan esta especificación de máquina virtual.
Las características principales que nos ofrece Java son:
1.- Lenguaje  Simple:
Se lo conoce como lenguaje simple porque viene de la misma estructura de c y c++; ya que c++ fue un referente para la creación de java por eso utiliza determinadas características de c++ y se han eliminado otras.
2.- Orientado a Objeto:
Toda la programación en java en su mayoría está orientada a objeto, ya que al estar agrupados en estructuras en estructuras encapsuladas es más fácil su manipulación.
3.- Distribuido:
Permite abrir sockets, establecer y aceptar conexiones con los servidores o clientes remotos; facilita la creación de aplicaciones distribuidas ya que proporciona una colección de clases para aplicaciones en red.
4.- Robusto:
Es altamente fiable en comparación con c,  se han eliminado muchas características con la aritmética de punteros, proporciona numerosas comprobaciones en compilación y en tiempo de ejecución.
5.- Seguro:
La seguridad es una característica muy importante en java ya que se han implementado barreras
de seguridad en el lenguaje y en el sistema de ejecución de tiempo real.
6.- Indiferente a la arquitectura:
Java es compatible con los más variados entornos de red, cualquiera sean estos desde Windows 95, Unix a Windows Nt  y Mac, para poder trabajar con diferentes sistemas operativos.
Java es muy versátil ya que utiliza byte-codes que es un formato intermedio que sirve para transportar el código eficientemente o de diferentes  plataformas (Hardware - Software).
7.- Portable:
Por ser indiferente a la arquitectura sobre la cual está trabajando, esto hace que su portabilidad sea muy eficiente, sus programas son iguales en cualquiera de las plataformas, ya que java especifica tamaños básicos, esto se conoce como la máquina virtual de java.
8.- Interpretado y compilado a la vez:
Java puede ser compilado e interpretado en tiempo real,  ya que  cuando se construye el código fuente este se transforma en una especie de código de máquina.
 9.- Multihebra o Multihilos:
Java tiene una facilidad de cumplir varias funciones al mismo tiempo, gracias a su función  de multahilos ya que por cada hilo que el programa tenga se ejecutaran en tiempo real muchas funciones al mismo tiempo.
10.- Dinámico:
El lenguaje java es muy dinámico en la fase de enlazado, sus clases solamente actuaran en medida en que  sean requeridas o necesitadas con esto permitirá que los enlaces se puedan incluir incluso desde fuentes muy variadas o desde la red.
11.- Produce Applets:
En java se pueden crear aplicaciones independientes y applets.
Independientes porque se pueden comportar como cualquier programa escrito en cualquier lenguaje.
Por otra parte los applets considerados pequeños programas, tienen la capacidad de ejecutar funciones muy complejas.
12.- Alto rendimiento

Java es considerado de alto rendimiento por ser tan  veloz en el momento de correr los programas y por ahorrase muchas líneas de código.


Estructura de un proyecto Android


Cuando creamos un nuevo proyecto Android en Eclipse se genera automáticamente la estructura de carpetas necesaria para poder generar posteriormente la aplicación. Esta estructura será común a cualquier aplicación, independientemente de su tamaño y complejidad.

En la siguiente imagen vemos los elementos creados inicialmente para un nuevo proyecto Android:




Carpeta /src/

Contiene todo el código fuente de la aplicación, código de la interfaz gráfica, clases auxiliares, etc. Inicialmente, Eclipse creará por nosotros el código básico de la pantalla (Activity) principal de la aplicación, siempre bajo la estructura del paquete java definido.




Carpeta /res/
Contiene todos los ficheros de recursos necesarios para el proyecto: imágenes, vídeos, cadenas de texto, etc. Los diferentes tipos de recursos de deberán distribuir entre las siguientes carpetas:
  • /res/drawable/. Contienen las imágenes de la aplicación. Se puede dividir en /drawable-ldpi,/drawable-mdpi y /drawable-hdpi para utilizar diferentes recursos dependiendo de la resolución del dispositivo.
  •  /res/layout/. Contienen los ficheros de definición de las diferentes pantallas de la interfaz gráfica. Se puede dividir en /layout y /layout-land para definir distintos layouts dependiendo de la orientación del dispositivo.
  •   /res/anim/. Contiene la definición de las animaciones utilizadas por la aplicación.
  •  /res/menu/. Contiene la definición de los menús de la aplicación.
  •  /res/values/. Contiene otros recursos de la aplicación como por ejemplo cadenas de texto (strings.xml), estilos (styles.xml), colores (colors.xml), etc.
  • /res/xml/. Contiene los ficheros XML utilizados por la aplicación.
  • /res/raw/. Contiene recursos adicionales, normalmente en formato distinto a XML, que no se incluyan en el resto de carpetas de recursos.



Carpeta /gen/ 

Contiene una serie de elementos de código generados automáticamente al compilar el proyecto. Cada vez que generamos nuestro proyecto, la maquinaria de compilación de Android genera por nosotros una serie de ficheros fuente en java dirigido al control de los recursos de la aplicación.

El más importante es el que se puede observar en la imagen, el fichero R.java, y la clase R.
Esta clase R contendrá en todo momento una serie de constantes con los ID de todos los recursos de la aplicación incluidos en la carpeta /res/, de forma que podamos acceder fácilmente a estos recursos desde nuestro código a través de este dato. Así, por ejemplo, la constante R.drawable.icon contendrá el ID de la imagen “icon.png”contenida en la carpeta /res/drawable/. Veamos como ejemplo la clase R creada por defecto para un proyecto nuevo:

    public final class R {
    public static final class attr {
    }
    public static final class drawable {
        public static final int icon=0x7f020000;
    }
    public static final class layout {
        public static final int main=0x7f030000;
    }
    public static final class string {
        public static final int app_name=0x7f040001;
        public static final int hello=0x7f040000;
    }
    }



Carpeta /assets/
Contiene todos los demás ficheros auxiliares necesarios para la aplicación (y que se incluirán en su propio paquete), como por ejemplo ficheros de configuración, de datos, etc.
La diferencia entre los recursos incluidos en la carpeta /res/raw/ y los incluidos en la carpeta /assets/ es que para los primeros se generará un ID en la clase R y se deberá acceder a ellos con los diferentes métodos de acceso a recursos. Para los segundos sin embargo no se generarán ID y se podrá acceder a ellos por su ruta como a cualquier otro fichero del sistema. Usaremos uno u otro según las necesidades de nuestra aplicación.




Fichero AndroidManifest.xml
Contiene la definición en XML de los aspectos principales de la aplicación, como por ejemplo su identificación (nombre, versión, icono, ), sus componentes (pantallas, mensajes, …), o los permisos necesarios para su ejecución.
Este es el archivo principal y que todas las aplicaciones o librerías deben contener en la raíz del proyecto. En este, se definen las características del proyecto como el nombre, paquete o los permisos que va a requerir la aplicación. También es en este archivo donde se describe los componentes de la aplicación.





Gestión de la información en Android



Android



A diferencia de lo que ocurre en otros sistemas, en Android cualquier repositorio de datos, como por ejemplo archivos, son privados y únicamente accesibles por la aplicación a la que pertenecen. Sin embargo, esto no implica necesariamente que no puedan ser compartidos o accedidos por otras aplicaciones; Android facilita una serie de mecanismos que posibilitan en ciertas circunstancias el acceso a dicha información. En los siguientes apartados se explican las distintas formas que tiene una aplicación para almacenar y recuperar información, así como los mecanismos a utilizar en caso de desear compartirla con las demás aplicaciones. 


martes, 2 de junio de 2015

Seguridad en Android



En Android cada aplicación se ejecuta en su propio proceso. La mayoría de las medidas de seguridad entre el sistema y las aplicaciones deriva de los estándares de Linux 2.6, cuyo kernel, recuérdese, constituye el núcleo principal de Android. Cada proceso en Android constituye lo que se llama un cajón de arena o sandbox, que proporciona un entorno seguro de ejecución. Por defecto, ninguna aplicación tiene  permiso para realizar ninguna operación o comportamiento que pueda impactar negativamente en la ejecución de otras aplicaciones o del sistema mismo. Por ejemplo, acciones como leer o escribir ficheros privados del usuario (contactos, teléfonos, etc.), leer o escribir ficheros de otras aplicaciones, acceso de red, habilitación de algún recurso hardware del dispositivo, etc., no están permitidas. La única forma de poder saltar estas restricciones impuestas por Android, es mediante la declaración explícita de un permiso que autorice a llevar a cabo una determinada acción habitualmente prohibida. Además, en Android es obligatorio que cada aplicación esté firmada digitalmente mediante un certificado, cuya clave privada sea la del desarrollador de dicha aplicación. No es necesario vincular a una autoridad de certificado, el único cometido del certificado es crear una relación de confianza entre las aplicaciones. Mediante la firma, la aplicación lleva adjunta su autoría. 


Para establecer un permiso para una aplicación, es necesario declarar en el manifiesto uno o más elementos donde se especifica el tipo de permiso que se desea habilitar. Por ejemplo, si se quisiera permitir que una aplicación pueda monitorizar mensajes SMS entrantes, en el fichero “AndroidManifest.xml” se encontraría algo como lo que sigue:


En la clase android.Manifest.permission se especifican todos los posibles permisos que se pueden conceder a una aplicación: utilización de Wi-Fi, Bluetooth, llamadas telefónicas, cámara, Internet, mensajes SMS y MMS, vibrador, etc. Los permisos pueden definirse de forma más completa que la anteriormente mostrada. El elemento contempla una serie de atributos que definen y matizan el alcance del permiso dado: 

  • ·       android: name: especificación del permiso que se pretende conceder. Debe ser un nombre de alguno de los listados en la clase android.Manifest.permission. 

  • ·         android: label: una etiqueta o nombre convencional fácilmente legible para el usuario.

  • ·         android: permissionGroup: permite especificar un grupo asociado al permiso. Los posibles grupos se encuentran listados en la clase android.Manifest.permission_group y pueden tener valores como ACCOUNTS (cuentas válidas de Google), COST_MONEY (acciones que llevan vinculadas un pago) o PHONE_CALLS (acciones relacionadas con llamadas), entre otros. 

  • ·         android: protectionLevel: determina el nivel de riesgo del permiso, y en función del mismo influye en cómo el sistema otorga o no el permiso a la aplicación. Oscila entre valores desde el 0 hasta el 3.

  • ·         android: description: descripción textual del permiso. 

  • ·         android: icon: icono gráfico que puede ser asociado al permiso.