Android

De Proyectos
Saltar a: navegación, buscar

Android Curso PDF

Tema 1

Teoria

  • Arquitectura del Sistema

Arquitectura.jpg

  • Kernel (Núcleo)
    • Ofrece servicios básicos: drivers, gestión de procesos, ...
    • Basado en la version 3.x del kernel de Linux
    • Provee una capa de abstracción entre hardware y el resto de servicios


Kernel.jpg

  • Librerías Nativas y Run-Time
    • Librerias C/C++ nativas
    • La mayoria de aplicaciones acceden a ellas a través de Dalvik
    • Soporte para OpenGL, SQLite, SSL, ...


Librerias.jpg

  • Application Framework
    • El framework nos proporciona las clases para crear apps de Android
    • Incluye librerias para el manejo de la interfaz, notificaciones, localizacion, acceso a datos, ...


Framework.jpg

  • Application Layer
    • Es donde se encuentran nuestras apps y las apps nativas del sistema


Application.jpg

Ej2

PDF Ejercicio

En el Layaout (parte gráfica)

  • El parámetro Id tiene el siguiente formato @+id/txtTarea
    • La @ indica al parser XML qué debe parsear y expandir el resto de la cadena e identificarla como recurso id
    • El símbolo + indica que el recurso es nuevo y que debe ser añadido a la clase R.


  • La clase R
    • Es autogenerada por Android y contiene todos los componentes gráficos y cadenas de texto global de la aplicación.
    • En Android no tenemos que hacer referencia a los ficheros de recursos mediante sus rutas. En lugar de ello, la clase R es la encargada de mantener automáticamente las referencias a estos recursos y su contenido.


  • Width y Height
    • match_parent: Indica que ocupe todo el ancho o alto de la vista padre. En este caso es el LinearLayout.
    • wrap_content: Indica que el ancho o alto debe ajustarse al contenido de éste.
    • fill_parent: Es el mismo que match_parent pero fue utilizado en versiones anteriores al API 8.


  • Fichero strings.xml
    • Cadena de texto de la app definidas en fichero aparte.
    • Al elemento se le indica el nombre de una variable (@string/<nombre_varialbe> que esta definida en el archivo src/main/res/values/strings.xml


En MainActivity (parte lógica)

  • El método onCreate de la clase de nuestra app (que deriva de Activity) es el punto de entrada de nuestra Activity.


  • findViewById() es un método que enlaza un recurso de la interfaz de usuario de una aplicación, con una variable en nuestro código. O simplemente se encarga de acceder a ese recurso para cambiar una de sus propiedades.
    • Funciona de la siguiente forma
EditText txtTarea = (EditText)findViewById(R.id.txtTarea);
    • Android Studio automaticamente hace el import necesario para poder utilizarlos en nuestra clase:
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.ListView;
    • Debemos hacer un casting porque el método findViewById() nos devuelve un objeto de la clase View. Esta es la clase de la que heredan todos los elementos gráficos de nuestras vistas. Por eso debemos indicarle específicamente qué tipo de objeto es.


  • Los objetos de la clase ArrayList almacenan Strings.


  • A través de un elemento denominado Adapter, Android nos facilita la tarea de enlazar estructuras de datos con elementos de nuestra vista. En este caso, utilizaremos un ArrayAdapter.
    • Nos sirve para mostrar los datos de una estructura conetenedora en una Vista de la interfaz
    ArrayList<String> allItems = new ArrayList<String>();
    ArrayAdapter<String> allItemsAdapter;
    allItemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, allItems);
    lstItems.setAdapter(allItemsAdapter);


  • Para dar funcionalidad a un botón se puede hacer de dos formas
    • A través de la interfaz (todolist_activity.xml). Únicamente se puede gestionar ese evento: cuando el botón es pulsado.
    • A través de nuestra clase Java (TodoList_Activity.java) que controla la vista gráfica.
    • En nuestro ejemplo lo vamos a realizar en la clase Java añadiendo un escuchador de eventos a nuestro objeto de la clase Button. Éste estará a la escucha de todos los eventos que el usuario quiera realizar con ese objeto. Y dentro del Listener, le indicaremos qué debemos hacer si el botón es pulsado.
    • En la interfaz gráfica debemos añadir
    <Button
        androi:layout_width="match_parent"
        ...
        android:onclick="guardarTarea"/>
    • En la lógica se añade
    mBtnAdd.setOnClickListener(new View.OnClickListener() {
    @Override
        public void onClick(View view) {
            String tarea = txtTarea.getText().toString();
            if (tarea.length() != 0)
                allItemsAdapter.add(tarea);
        }
    });
    • Observarás que te obliga añadir el modificador final al objeto EditText y al ArrayAdapter, esto es debido a que Java nos obliga siempre y cuando sean utilizadas en un método sobrecargado dentro de otro. Utilizado para indicarle al compilador que esa entidad no podrá ser modificada más tarde.


  • Código final en MainActivity
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.todolist_activity);

        mEtTarea = (EditText)findViewById(R.id.txtTarea);
        mBtAdd = (Button)findViewById(R.id.btnAdd);
        mLvItems = (ListView)findViewById(R.id.listItem);

        ArrayList<String> allItems = new ArrayList<String>();
        final ArrayAdapter<String> allItemsAdapter;
        allItemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, allItems);
        mLvItems.setAdapter(allItemsAdapter);

        mBtAdd.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View view) {
                String tarea = mEtTarea.getText().toString();
                Date cDate = new Date();
                String fDate = new SimpleDateFormat("dd-MM-yyyy").format(cDate);
                if(tarea.length() != 0){
                    allItemsAdapter.add(tarea+" @ "+fDate);
                }
           }
        });
    }

Tema 2

PDF

Cada aplicación se ejecuta en su propia sandbox. Este sandbox evita que las app interfieran entre ellas.
Hay maneras de comunicar apps entre ellas:

  • Arrancando dos apps con el mismo identificador de usuario Linux. Estas dos apps podran correr en el mismo proceso y compartir la misma VM.
  • Una app puede solicitar permisos para acceder a datos comunes, tales como sms, telefono, sd, ...

Existen diferentes apps en Android:

  • Primer plano: App que requiere interacción con el usuario (Juegos, Chrome, ...)
  • Segundo plano: Apps de llamadas, ...
  • Intermitente: Útil tanto en primer como en segundo plano. Ej: App de correo.
  • Widget: Pequeñas app en el escritorio.

Componentes:

  • Son los bloques básicos de una app.
  • Cada componente es un punto de acceso distinto a través del cual el sistema puede acceder a la app.
  • No todos los componentes son puntos de entrada par ael usuario.
  • Cada componenete juega un rol específico.
  • 4 tipos de Componentes básicos:
    • Activities
      • Suele corresponderse con una interfaz gráfica desde la que pueden realizar un conjunto de acciones.
      • Para crear una activity debemos crear una subclase de Activity o utilizar una de las existentes.
      • Los dos métodos más importantes son:
        • onCreate(): Será llamado cuando se cree la actividad. Deberemos implementar la inicialización esencial de los componentes de la activity. Aquí deberemos llamar a setContentView( ) para definir el layout de la interfaz.
        • onPause(): Será llamado cuando el usuario deje la activity, lo cual no quiere decir que vaya a ser destruida siempre. Generalmente deberemos guardar cualquier cambio que deba ser persistente para la sesión del usuario.
    • Services
      • Este componente realiza operaciones largas en background y no ofrece una interfaz de usuario.
      • Aunque se ejecutan en segundo plano, como cualquier otro componente, se ejecutan en el hilo principal del proceso que los alberga.
      • Para crear un Service debemos crear una subclase de Service o alguna de sus subclases.
      • Métodos:
        • onStartCommand() Este método es el que se ejecuta cuando otro componente llama a startService() para iniciarlo. Una vez se ejecuta este método el servicio empieza a ejecutarse en background de forma indefinida. Deberemos parar el servicio cuando la tarea se realice mediante stopSelf() o mediante stopService().
        • onBind() Este método se ejecuta cuando otro componente quiere enlazar con el servicio mediante bindService(). En la implementación de este método se deberá proveer de una interfaz con la que el usuario pueda comunicarse con el servicio( mediante un IBinder )
    • Content providers
      • Los content provider controlan la lectura/escritura de datos en la aplicación. Se puede almacenar datos en el sistema de ficheros, base de datos, en la web o cualquier otro método de persistencia al cual podamos acceder con el dispositivo.
      • A través de los content provider, el resto de aplicaciones pueden consultar o incluso modificar datos (en caso de que el content provider lo permita)
      • Android proporciona un conjunto de content providers para los tipos de datos más comunes: audio, vídeo, imágenes, contactos, SMS...
    • Broadcast receivers
      • Un broadcast receiver es un componente que responde a eventos globales, como podría ser la llegada de un mensaje o un aviso de batería baja.
      • La mayoría de los eventos se generan por el propio sistema, pero las aplicaciones también pueden iniciar broadcasts.
      • Aunque los broadcast no pueden generar una interfaz de usuario, pueden crear notificaciones de status bar para avisar al usuario de lo ocurrido.
      • Usualmente se utilizan como una forma de comunicarse con otros componentes con una mínima cantidad de trabajo.
      • Implementan el método onReceive
      • Si están declarados en el manifiesto de una aplicación pueden ser lanzados a ejecución cuando haga falta.
      • Las aplicaciones deben registrar sus receptores de eventos a través del método.
  • Las activities, services y broadcast receivers se activan a través de unos mensajes llamados intents.
  • Un intent es una manera fácil de enlazar en tiempo de ejecución varias componentes de la misma o distintas aplicaciones.
  • El objeto Intent es una estructura de datos pasivos que contienen una descripción abstracta de la operación a realizar. En el caso de los broadcast, puede incluir una pequeña descripción de lo que ha pasado y que será anunciado.
  • Su principal cometido es el de lanzar los tres componentes anteriores a ejecución, por lo cual puede verse como un nexo entre los mismos. Dependiendo del componente se lanzará de distinta manera.
  • Los intent son un conjunto de información. Esta información de interés se puede dividir en los siguientes apartados:
    • Component Name
    • Action
    • Data
    • Category
    • Extras
    • Flags

Manifest:

Ej1

Cada Activity tiene tres estados: running, pause y stopped.
La clase android.util.Log envia mensajes de log en tiempo de ejecucion.
Existen varios niveles de logs: e()->error, w()->warning, i()->info, d()->debug y v()->verbose.

public class MainActivity extends Activity {

private static final String TAG = "DEBUG T2Ej1";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(TAG, "Llamando onCreate");
}

@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "Llamando onStart");
}

@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "Llamando onPause");
}

@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "Llamando onStop");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "Llamando onDestroy");

}

@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "Llamando onResume");
}

Logcat-> es donde nos aparecen todos los mensajes en tiempo de ejecucion.
Podemos crear filtros para poder ver los mensajes que nos interesan.

Ej2

Un Toast es un mensaje que se muestra en pantalla durante unos segundos al usuario para luego volver a desaparecer automáticamente sin requerir ningún tipo de actuación por su parte, y sin recibir el foco de la aplicación en ningún momento.

Tema 3

PDF

Ej1

Table Layout se utiliza para insertar tablas y Table Row inserta una fila. Luego en Table Row podemos insertar EditTexts, TextViews, Botones, ....

El peso de cada elemento en el Layout se marca con android:layout_weight="<entre 0 y 1>";. Esto sirve para asignar un porcentaje de la pantalla a un elemento, tanto si está en horizontal como en vertical. Se ha de poner la propiedad android:layout_width="0dp";

android:layout_alignParentTop="true" --> Con esta propiedad se alinea el objeto con el padre, en este caso en la parte superior, pero nos da opciones de en cualquier parte.
android:gravity="top" -->
android:hint="Comments" -->
android:inputType="textMultiLine" --> Con esta propiedad decimos que un EditText es multilinea

Ej2

Ej3

Ej4

Ej5

Fragments

Ej6

Tema 4

PDF

Tema 5

Teoria

Ej1

PDF Ejercicio

Video Ejercicio

Ej2

PDF Ejercicio

Video Ejercicio