Android

TODO: Dejar la parte de resumen de la arquitectura


¿Qué es Android?    


Android es un conjunto de tecnologías open source que vienen con 
  • un sistema operativo (Linux)
  • una virtual machine (VM) hecha en Java que se llama Dalvik
  • una SDK o Kit para desarrollar
y está pensado para funcionar sobre dispositivos móviles, esto incluye teléfonos celulares, tablets, etc. 

Android inicialmente fue  desarrollado por Android Inc., que Google respaldó económicamente y más tarde (en 2005) lo compró . 


Arquitectura de Android

El siguiente gráfico muestra la arquitectura de Android. 

Como se puede ver está formada por cuatro capas.

Una de las características más importantes es que todas 

las capas están basadas en softwarelibre.

  • Kernel linux 2.6

    seguridad, manejo de memoria, multiprocesos, etc.

    Es la unica que depende del hardware (responsabilidad del fabricante)

  • Runtime basado en Dalvik VM

    ejecuta archivos .dex

  • Conjunto de librerías escritas en C/C++

  • Abstracción entre el hardware y el software


Para la instalación del entorno de programación de Android.


Tipos de desarrollo en Android

Podemos separar
  • web adaptado a dispositivos móviles
  • desarrollos híbridos
  • desarrollos nativos

Desarrollo web mobile

Consiste en adaptar la interfaz de usuario para trabajar desde el dispositivo móvil. Además de las limitaciones propias de las aplicaciones web -cuya naturaleza es stateless- requiere estar permanentemente conectado a una red móvil para que la aplicación pueda funcionar: no hay ningún tipo de procesamiento local. Esto implica que al relegar toda la carga en el servidor
  • se está desaprovechando las capacidades del dispositivo 
  • el servidor debe tener capacidad para soportar esa carga 
Por otro lado, las ventajas que presenta son algunas características conocidas de las aplicaciones web: administración centralizada en el servidor, utilizamos la misma tecnología para hacer una única aplicación. Por otra parte el esfuerzo de adaptación en la interfaz no es menor y depende mucho del tipo de aplicación. 

Desarrollo nativo

En el desarrollo nativo se trabaja utilizando la misma tecnología que provee el dispositivo en el cual se trabaja, esto incluye no sólo iOS | Blackberry | Windows Phone | Android sino diferentes tipos de dispositivo y versiones de sistema operativo.

Mientras que esto acopla la aplicación a la plataforma utilizada, y requiere de un desarrollador especializado en esa tecnología, hay dos grandes ventajas al respecto:
  • se aprovechan al máximo las capacidades y features de ese dispositivo
  • es posible trabajar en forma local (offline) por un cierto tiempo y sincronizar la información entre cliente y servidor
Más adelante hablaremos de la forma de distribuir las aplicaciones.

Desarrollo híbrido

En este tipo de desarrollo se trabaja en parte web y en parte con desarrollo nativo. También suelen incluirse en esta categoría los desarrollos generados con productos que soportan varias plataformas móviles (como SAP Mobile Platform originaria de Sybase, PhoneGap de Adobe o Appcelerator). Estos productos limitan los features a utilizar a favor de tener una única aplicación global para todas las plataformas.
http://blogthinkbig.com/aplicaciones-web-nativas-hibridas/


Entorno de Desarrollo: AndroidManifest.xml

    Toda proyecto android tiene un archivo llamdo AndroidManifest.xml en donde se definen:
  • Permisos y librerias necesarias para cada aplicación.
  • Versión requerida de Android para el dispositivo.
  • Versión de la JDK a utilizar.
  • Declarar las Activities, Services, etc. que veremos a continuación.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="uqbar.ui.activity"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="16" />
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >

        <activity
            android:name=".MainActivity" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

    </application>
</manifest>

Arquitectura de las aplicaciones: Activity

  • Describe una pantalla (análogo a un WepPage de wicket).
  • Una aplicación se compone de muchas Activities.
  • Se compone de layouts y componentes visuales (View).
  • Puede invocar otra Activity (subActivity)
Normalmente para crear una activity necesitamos crear 2 archivos: 
  • La clase java, que le da el comportamiento
  • Y un .xml que diseña la interfaz (como se va a ver visualmente).
Hay que hacer explicita la relación entre la activity y su xml

Clase java
public class HelloWordActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hello_word); } }


activity_hello_word.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${packageName}.${activityClass}" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>



Arquitectura de las aplicaciones: Interfaces de usuario

En Android las interfaces se construyen utilizando View y ViewGroup
  • Las View son componentes visuales (Widgets) (Textview, Button, EditText)
  • Las ViewGroup son una composición de views. Controles más complejos. (Layout, ListView)


Arquitectura de las aplicaciones: Layouts

  • Son una extencion de ViewGroup.
  • Controla la posición de las Views hijas.
  • Android proporciona una serie se layout por default: LinearLayout, RelativeLayout, TableLayout, AbsoluteLayout.


Arquitectura de las aplicaciones: Views

La plataforma Android ofrece dos métodos para diseñar la interfaz: La procedural(dentro del código) y la declarativa (XML)


Procedural

Declarativo

Archivo Java

Archivo XML

TextView text= new TextView(this)

text.setWidth(100);

text.setHeight(60);

text.setText("phone");

setContentView(text);




<TextView

android:id="@+id/phoneLabel"

android:text="phone:"

android:layout_width="100"

android:layout_height="60"

/>


El atributo id identifica a la vista dentro del árbol y permite recuperarla desde desde la aplicación.

El símbolo (@) indica al parser del xml que lo que viene a continuación lo trate como un identificador de recurso. 

El símbolo (+) indica que el nombre que viene a continuación es un nombre nuevo y debe ser añadido a la clase de recursos R.java.


Dentro de la activity podemos acceder a los componentes declarados en el xml:

TextView phoneLabel = (TextView) findViewById(R.id.phoneLabel);


Arquitectura de las aplicaciones: Resources

  • Los resources son elemetos externos que se requieren incluir y referenciar en la aplicacion.
  • Android crea un directorio /res que contiene un confunto de subDirectorios para cada tipo de recurso.


Arquitectura de las aplicaciones: Tipos de resources

  • drawable: contiene imágenes y otros archivos.
  • layout: contiene los layouts de las activities y componente.
  • values: contiene archivos de constantes.. por ejemplo string.xml (donde se encuentran todos los string fijos de nuestra aplicación: Ejemplo: titulos.  Permite la  internacionalización (i18n)).
  • Los recursos son accesibles atravez de la clase R (compilada por android acutomáticamente) con el pattern R.directorio.rescurso

Arquitectura de las aplicaciones: Intents

  • Son eventos a nivel de Activities. 
  • Utilizados para iniciar Activities, difundir mensajes o iniciar servicios (Llamado telefónico).
  • Pueden especificar destinatario o no:
    • Explícitos: Si se establece un destinatario: Ejemplo :  new Intent(Context, Class)
    • Implícitos: Si no hay destinatario, se debe incluir más información para que android determine el mejor candidato.
  • En la declaración de la activity en el AndroidManifest, se puede registrar a intents del sistema (implícitos). (Por ejemplo: Si hago una aplicación para realizar llamadas telefónicas)
            <intent-filter android:priority="100" >
            <action android:name="android.intent.action.DIAL"  />
               <category android:name="android.intent.category.DEFAULT" />
               <data android:scheme="tel"/>
           </intent-filter>

Código Java:

Intent intent=new Intent(Intent.ACTION_DIAL, Uri.parse("tel:000"));
startActivity(intent);

Al ejecutarse la linea de código de arriba... android da la opción para responder ese pedido con las aplicaciones que cumplen con el requisito especificado. 







......
...
..
..
..
.


Mas doc: http://developer.android.com/guide/topics/ui/index.html
                        http://developer.android.com/guide/components/fundamentals.html