Diferencia entre revisiones de «Android»

De Proyectos
Ir a la navegación Ir a la búsqueda
 
(No se muestran 15 ediciones intermedias del mismo usuario)
Línea 2: Línea 2:
<br/>
<br/>
=Tema 1=
=Tema 1=
==PDF==
==Teoria==
*Arquitectura del Sistema<br/>
[[File: arquitectura.jpg]]<br/>
<br/>
*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
<br/>
[[File: kernel.jpg | 570px]]<br/>
<br/>
*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, ...
<br/>
[[File:librerias.jpg | 570px]]<br/>
<br/>
*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, ...
<br/>
<br/>
El parámetro Id tiene el siguiente formato @+id/txtTarea, donde 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.<br/>
[[File: framework.jpg | 570px]]<br/>
<br/>
<br/>
La clase R es autogenerada por Android y contiene todos los componentes gráficos y cadenas de texto global de la aplicación.<br/>
*Application Layer
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.<br/>
**Es donde se encuentran nuestras apps y las apps nativas del sistema
<br/>
<br/>
Width y Height:<br/>
[[File: application.jpg | 570px]]<br/>
match_parent: Indica que ocupe todo el ancho o alto de la vista padre. En este caso es el LinearLayout.<br/>
wrap_content: Indica que el ancho o alto debe ajustarse al contenido de éste.<br/>
fill_parent: Es el mismo que match_parent pero fue utilizado en versiones anteriores al API 8.<br/>
<br/>
<br/>
Cadena de texto de la app definidas en fichero aparte.<br/>
 
Al boton se le indica el nombre de una variable (@string/<nombre_varialbe> que esta definida en el archivo src/main/res/values/strings.xml<br/>
==Ej2==
===PDF Ejercicio===
<b>En el Layaout (parte gráfica)</b><br/>
*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.
<br/>
<br/>
El método onCreate de la clase de nuestra app (que deriva de Activity) es el punto de entrada de nuestra Activitie<br/>
*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.
<br/>
<br/>
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.<br/>
*Width y Height
Funciona de la siguiente forma: EditText txtTarea = (EditText)findViewById(R.id.txtTarea);<br/>
**match_parent: Indica que ocupe todo el ancho o alto de la vista padre. En este caso es el LinearLayout.
Debemos hacer un casting porque el método findViewById() nos devuelve un objeto de la clase View. Esta es la clase de la que eredan todos los elementos gráficos de nuestras vistas. Por eso debemos indicarle específicamente qué tipo de objeto es.<br/>
**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.
<br/>
<br/>
Los objetos de la clase ArrayList almacenan Strings.<br/>
*Fichero strings.xml
A través de un elemento denominado Adapter, Android nos facilita la tarea de enlazar estructuras de datos con elementos de uestra vista. En este caso, utilizaremos un ArrayAdapter.<br/>
**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
<br/>
<br/>
Para dar funcionalidad a un botón se puede hacer de dos formas:<br/>
<b>En MainActivity (parte lógica)</b>
A través de la interfaz (todolist_activity.xml). Únicamente se puede gestionar ese evento: cuando el botón es pulsado.<br/>
*El método onCreate de la clase de nuestra app (que deriva de Activity) es el punto de entrada de nuestra Activity.
A través de nuestra clase Java (TodoList_Activity.java) que controla la vista gráfica.<br/>
<br/>
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.<br/>
*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
<pre>EditText txtTarea = (EditText)findViewById(R.id.txtTarea);</pre>
**Android Studio automaticamente hace el import necesario para poder utilizarlos en nuestra clase:
<pre>
<pre>
btnAdd.setOnClickListener(new View.OnClickListener() {
    import android.widget.Button;
@Override
    import android.widget.EditText;
public void onClick(View view) {
    import android.widget.ListView;
String tarea = txtTarea.getText().toString();
if (tarea.length() != 0)
allItemsAdapter.add(tarea);
}
});
</pre>
</pre>
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.<br/>
**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.
<br/>
<br/>
*Los objetos de la clase ArrayList almacenan Strings.
<br/>
<br/>
==Ej2==
*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
<pre>
<pre>
@Override
    ArrayList<String> allItems = new ArrayList<String>();
protected void onCreate(Bundle savedInstanceState) {
    ArrayAdapter<String> allItemsAdapter;
super.onCreate(savedInstanceState);
    allItemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, allItems);
setContentView(R.layout.todolist_activity);
    lstItems.setAdapter(allItemsAdapter);
</pre>


mEtTarea = (EditText)findViewById(R.id.txtTarea);
<br/>
mBtAdd = (Button)findViewById(R.id.btnAdd);
*Para dar funcionalidad a un botón se puede hacer de dos formas
mLvItems = (ListView)findViewById(R.id.listItem);
**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
<pre>
    <Button
        androi:layout_width="match_parent"
        ...
        android:onclick="guardarTarea"/>
</pre>
**En la lógica se añade
<pre>
    mBtnAdd.setOnClickListener(new View.OnClickListener() {
    @Override
        public void onClick(View view) {
            String tarea = txtTarea.getText().toString();
            if (tarea.length() != 0)
                allItemsAdapter.add(tarea);
        }
    });
</pre>
**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.<br/>
<br/>
*Código final en MainActivity
<pre>
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.todolist_activity);


ArrayList<String> allItems = new ArrayList<String>();
        mEtTarea = (EditText)findViewById(R.id.txtTarea);
final ArrayAdapter<String> allItemsAdapter;
        mBtAdd = (Button)findViewById(R.id.btnAdd);
allItemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, allItems);
        mLvItems = (ListView)findViewById(R.id.listItem);
mLvItems.setAdapter(allItemsAdapter);


mBtAdd.setOnClickListener(new View.OnClickListener() {
        ArrayList<String> allItems = new ArrayList<String>();
@Override
        final ArrayAdapter<String> allItemsAdapter;
public void onClick(View view) {
        allItemsAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, allItems);
String tarea = mEtTarea.getText().toString();
        mLvItems.setAdapter(allItemsAdapter);
Date cDate = new Date();
String fDate = new SimpleDateFormat("dd-MM-yyyy").format(cDate);
if(tarea.length() != 0){
allItemsAdapter.add(tarea+" @ "+fDate);
}
}
});


}
        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);
                }
          }
        });
    }
</pre>
</pre>


Línea 202: Línea 260:
=Tema 4=
=Tema 4=
==PDF==
==PDF==
• Un Intent es un mecanismo de paso de mensajes intra e interaplicación.
• Las activities, services y broadcast receivers se activan a través de
estos intents.
• 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 qué será anunciado. Sus principales funciones son:
  • Empezar una Activity de manera explícita o implícita.
  • Transmitir eventos entre componentes de una o diferentes
    aplicaciones.
• La estructura de un intent se compone de varios atributos básicos.
  • Component name
      • El nombre del componente que deberá manejar el intent. Este
        campo es un objeto del tipo ComponentName.
      • Es una combinación de todo el nombre de la clase que
        deberá actuar como componente objetivo. Por ejemplo:
        "com.example.project.app.FreneticActivity”
      • Este atributo es opcional. Si está editado el intent se lanzará
        como una instancia de la clase elegida. Pero si no, entonces
        Android utilizará el resto de información para encontrar un
        objetivo adecuado.
      • Podemos editar este atributo mediante setComponent(),
        setClass() o setClassName() y leerlo mediante
        getComponent().
• Action
  • Este atributo es un string que define la acción a realizarse. En el
    caso de los broadcast intent, la acción que ha realizado y qué se
    quiere reportar.
  • La clase Intent define una serie de constantes de acción.
    Algunas de estas acciones son:
      • ACTION CALL - Inicia una llamada telefónica
      • ACTION_EDIT - Muestra información para que el usuario
        edite.
      • ACTION_MAIN - Iniciar la activity principal de una tarea.
      • ACTION_SYNC - Sincroniza los datos del servidor con los
        del dispositivo.
  • Podemos ver todas estas constantes en las APIs de Android
    http://developer.android.com/reference/android/content/Intent.html
• Action
  • Podemos definir nuestras propias acciones para activar
    componentes de nuestra aplicación. Los string que creemos
    para definir acciones deberán contener el prefijo del paquete de
    nuestra aplicación. Por ejemplo:
    “com.example.project.SHOW_COLOR”
  • La acción afectará a la estructura el resto del intent. Sobretodo
    los campos data y extras. Es muy conveniente especificar la
    acción tanto como podamos por esto motivo.
  • La acción de un intent se puede editar mediante setAction() y
    leer mediante getAction().
• Data
  • Contiene la URI de los datos a actuar en la acción y el tipo MIME
    de los datos. Dependiendo de la acción necesitaremos distintos
    tipos de especificaciones.
  • Por ejemplo para la acción ACTION_EDIT el campo data debería
    contener la URI del documento a mostrar. Si fuera una acción
    ACTION_CALL en cambio el campo data debería contener una
    URI de tipo tel: con un número a llamar.
  • Mediante el método setData() y setType() podemos editar la URI
    como el tipo MIME y mediante getData() y getType() leerlo.
• Category
  • Contiene un string que define información adicional sobre el tipo
    de componente que puede manejar el intent. Podemos añadir
    más de una categoría es un Intent. • Al igual que con las acciones, en la clase Intent hay definidas
    varias constantes. Algunas de ellas son: • CATEGORY_BROWSABLE - el objetivo puede ser invocado
    por un navegador
    • CATEGORY_GADGET - La activity puede ser embebida
      dentro de otra activity que contenga gadgets
    • CATEGORY_HOME - La activity muestra la pantalla home, es
      decir la primera pantalla que el usuario ve.
    • CATEGORY_LAUNCHER - La activity puede ser la actividad
      inicial de una tarea y se muestra en el nivel más alto de la
      aplicación.
  • Podemos añadir categorías mediante addCategory(), eliminarlas
    mediante removeCategory() y leerlas mediante getCategories()
• Extras
  • Son pares clave-valor que aportan información adicional que
    será enviada a los componentes que manejen el intent.
  • Algunas acciones están relacionadas con algunos extras. Por
    ejemplo ACTION_TIMEZONE_CHANGED tiene un extra “timezone”
    que identifica la nueva zona horaria.
  • La clase Intent contiene una serie de puts y gets para cada tipo
    de extras.
• Flags
  • Las señales pueden ser de varios tipos. Muchas de ellas dictan
    al sistema cómo lanzar las activities y cómo tratarlas una vez
    lanzadas. Todos los flags se pueden ver definidos en las APIs
    para la clase Intent.
• Empezar una Activity de forma explícita:
  • Se crea un Intent, especificando el contexto de la aplicación
    actual y la clase de la Activity que se quiere activar. Este Intent
    se pasa a la función startActivity().
  • En el ejemplo, MyOtherActivity pasará a estar visible y activa.
• Empezar una Activity de forma implícita:
  • Se especifica la acción a realizar, y opcionalmente, se envía la
    URI de los datos sobre los que se quiere realizar la acción.
    También se pueden enviar datos necesarios para realizar esa
    acción.
  • Permite «pedir prestada» funcionalidad de otras Activities, sin
    saber de cuál exactamente.
  • Si varias Activities pueden servir la acción, se presentará una
    elección al usuario.


=Tema 5=
=Tema 5=
==Teoria==
==Ej1==
===PDF Ejercicio===
===Video Ejercicio===
==Ej2==
===PDF Ejercicio===
===Video Ejercicio===

Revisión actual - 08:55 22 abr 2014

Android Curso PDF

Tema 1

[editar]

Teoria

[editar]
  • Arquitectura del Sistema



  • 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




  • 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, ...




  • 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, ...




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




Ej2

[editar]

PDF Ejercicio

[editar]

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

[editar]

PDF

[editar]

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

[editar]

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

[editar]

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

[editar]

PDF

[editar]

Ej1

[editar]

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

[editar]

Ej3

[editar]

Ej4

[editar]

Ej5

[editar]

Fragments

Ej6

[editar]

Tema 4

[editar]

PDF

[editar]

Tema 5

[editar]

Teoria

[editar]

Ej1

[editar]

PDF Ejercicio

[editar]

Video Ejercicio

[editar]

Ej2

[editar]

PDF Ejercicio

[editar]

Video Ejercicio

[editar]