Android
Tema 1
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.
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.
Cadena de texto de la app definidas en fichero aparte.
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
El método onCreate de la clase de nuestra app (que deriva de Activity) es el punto de entrada de nuestra Activitie
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);
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.
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 uestra vista. En este caso, utilizaremos un ArrayAdapter.
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.
btnAdd.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.
Ej2
@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
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.
- Activities
- 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
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
• 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.