SlideShare una empresa de Scribd logo
Desarrollo de Aplicaciones Móviles
en Android:
Temas Avanzados
Gabriel Huecas
Universidad Politécnica de Madrid
23 de Noviembre de 2010
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Elementos
• Views: interfaz gráfica visual
• Activity: presentación de la aplicación (casi
siempre asociado a una pantalla)
• Services: procesos no visuales ejecutado en
background
• Broadcast receivers: consumidores de Broadcast
Intents
• Intents: paso de mensajes
• Notifications: eventos de/para usuario
• Content Providers: almacén compartido de datos
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Interfaces de Usuario
• View y ViewGroup
– View: Punto de interacción con el usuario
– ViewGroup: agrupación lógica de elementos visuales
• Widgets: subclases de View
– Entradas de texto, botones, radiobuttons,…
• != widgets de escritorio
• Layout: subclase de ViewGroup
– Organizan elementos visuales
• Adapters: subclase de ViewGroup
– Engarce de Views con datos externos
Views
• Unidad básica de GUI
• Todas las clases visuales heredan de View
• Área rectangular de pantalla
– Sabe dibujarse
– Gestiona eventos
• Especificación XML
– Desacopla detalles visuales de lógica de control
• Por código: desaconsejado
View en XML
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<TextView android:id=“@+id/myTextView”
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello"
/>
</LinearLayout>
View en XML
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
}
...
// buscamos el TextView por el ID
TextView myTextView=
(TextView)findViewByID(R.id.myTextView);
Creación de View por código
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TextView myTextView= new TextView(this);
setContentView(myTextView);
myTextView.setText(“Hello, World!”);
}
Desaconsejado: mezcla de diseño visual
con lógica de programa
ViewGroups
• View contenedora de Views
• Clase base para layouts
• Jerarquía de objetos visuales
Widget
• View con funcionalidad (compleja)
• Creación de Widget
– Se crea una View
– Se añade gestión de eventos, componentes
visuales,…
• Se pueden extender widgets de Android
Widgets
• TextView: etiqueta de sólo lectura
• EditText: campo de texto modificable
• ListView: crea y gestiona lista de Views
• Spinner: control compuesto: TextView + ListView,
para selección de ítem
• Button: botón
• CheckBox: botón de dos estados
• RadioButton: selección exclusiva entre varios
ítems
Widgets
SpinnerFormulario
Widgets
Autocompletar Google Map
Layout
• Gestores de elementos visuales
– Heredan de ViewGroup
• Controlan posiciones absolutas o relativas de
las Views hijas
– Se pueden anidar
• Android incluyen gran variedad
Layouts
• FrameLayout: el más simple
– Cada View hija se añade en la esquina sup. izq.
– …tapando a la anterior
• LinearLayout: Views alineadas (hor. / ver.)
• RelativeLayout: nuevas Views en posición
relativa a las anteriores
• TableLayout: grid de filas/columnas
• AbsoluteLayout: Views con coordenadas
absolutas
Layout
LinearLayout RelativeLayout TableLayout
Layout
GridView TabView ListView
Jerarquía Layout
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
Known Direct Subclasses
AbsoluteLayout, AdapterView<T extends Adapter>, FrameLayout,
LinearLayout, RelativeLayout, SlidingDrawer
AbsoluteLayout This class is deprecated. Use FrameLayout, RelativeLayout
or a custom layout instead.
Jerarquía Layout
Known Indirect Subclasses
AbsListView, AbsSpinner, AppWidgetHostView, DatePicker, DialerFilter,
ExpandableListView, Gallery, GestureOverlayView, GridView,
HorizontalScrollView, ImageSwitcher, ListView, MediaController,
RadioGroup, ScrollView, Spinner, TabHost, TabWidget, TableLayout,
TableRow, TextSwitcher, TimePicker, TwoLineListItem, ViewAnimator,
ViewFlipper, ViewSwitcher, WebView, ZoomControls
Adapters
• Enlace Views con Datos
– Normalmente externos
• AdapterView
– Las Views hijas se crean e inicializan con datos
externos
• Los más comunes
– CursorAdapter: vista de base de datos
– ArrayAdapter: array arbitrario
Adapters
ArrayAdapter<String> myAdapter;
myAdapter= new ArrayAdapter<String>(this, layoutID, myStringArray);
myListView.setAdapter(myAdapter);
Adapter
android.widget.Adapter
Known Indirect Subclasses ArrayAdapter<T>, BaseAdapter, CursorAdapter,
HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter,
SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter
java.lang.Object
↳ android.view.View
↳ android.view.ViewGroup
↳ android.widget.AdapterView<T extends android.widget.Adapter>
Known Direct Subclasses AbsListView, AbsSpinner
AbsListView Base class that can be used to implement virtualized lists of items.
AbsSpinner An abstract base class for spinner widgets.
Known Indirect Subclasses
ExpandableListView, Gallery, GridView, ListView, Spinner
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Activity
• Hereda de android.app.Activity
• Casi siempre contiene una GUI
• Responsabilidad limitada (alta cohesión, bajo
acoplamiento)
• Una aplicación puede contener varias Activity
– Una de ellas será la principal
• Pueden usar componentes visuales, interactuar
con servicios, crear Intents, etc.
• Se puede invocar a otra (subactividad)
Invocación subActivity
• Fire and Forget
– Se crea la subactividad
– La subactividad toma el foco
– La creadora no espera respuesta
• Y baja en la pila
– Se crea con startActivity(…);
• Async callback
– Se crea la subactividad que al finalizar invoca al
método de regreso onActivityResult(…) de la
principal
– Se crea con startActivityForResult(…)
ActivityManager
• Controla ciclo de vida de cada actividad
• Controla la pila de actividades
• Monitoriza
– Detección ANR (Application Not Responding)
• Actividad sin responder a un evento en 5 segundos
• BroadcastReceiver no finaliza en 10 segundos
– Evitar ANR: uso de Handlers
Ejemplo ANR
Ejemplo FC
Ciclo de Vida de las Actividades
• Básicamente, 3 estados
– Activa: tiene el foco, visible, encima de la pila
– Pausada: visible, sin foco (otra activa)
– Parada: no visible, eliminable
• Cambio de estado
– Transición notificada mediante métodos de
Actividad
• sobreescribirlos
Métodos de Estado de Actividad
• void onCreate(): creación de actividad o
restauración desde parada
• void onStart(): la actividad es visible para el
usuario
• void onResume(): la actividad parcialmente
visible
• void onPause(): otra actividad activa, esta aún
visible
• void onStop(): deja de ser visible
• void onDestroy(): llamado al cerrar actividad
Ciclo de Vida
• onCreate(), onDestroy(): Abarcan todo el
ciclo de vida. Invocados al principio (arranque o
rearranque) y al fin de la actividad
• onStart(), onStop(): Parte visible del ciclo de
vida. Desde onStart() hasta onStop(). Podría
no disponder de foco (usuario interactuando con
actividades superpuestas). Pueden ser llamados
múltiples veces.
• onResume(), onPause(): Parte útil del ciclo de
vida. Desde onResume() hasta onPause(),
actividad visible, y con foco: el usuario puede
interactuar con ella.
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Servicios
• Ejecutados en segundo plano, sin GUI
• Más prioridad que Activity
– LocationManager
– MediaController
– NotificationManager
Ciclo de Vida de los Servicios
• Si un cliente está conectado a un Servicio, este
no puede ser parado
– Hasta su desconexión
• Comienzo del Servicio
– Context.startService(): ejecuta servicio y queda a
la espera
– Context.bindService(): algún cliente (Activity, otro
Service,….) conecta con el servicio
• Si no está creado, lo crea
Ciclo de Vida de los Servicios
• Detener un servicio
– Context.stopService(): la actividad detiene el
servicio
– StopSelf(): el servicio se detiene el mismo
Conexiones al Servicio
• IBinder onBind(Intent intent): un cliente se
conecta. Devuelve un canal (IBinder) para
interactuar
• Boolean onUnbind(Intent intent): un cliente se
desconecta
• void onRebind(Intent intent): el cliente vuelve
a conectarse
– Después de haberse desconectado
Métodos de Estado de Servicio
• void onCreate(): el servicio ha sido creado
• void onStart(Intent intent): el servicio ha sido
iniciado
– El Intent podría contener información adicional
para el servicio
• void onDestroy(): finaliza el servicio
NotificationManager
• Comunicación de eventos al usuario
– Invisibles, sin interfaz gráfica
• Tipos
– Icono persistente en barra de estado
– Encendido y apagado de LED
– Vibración
– Audio
– Iluminación
– …
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Intenciones
• Intent: mecanismo basado en paso de
mensajes para (intentar) realizar una acción
• Inicia Actividades y Servicios o difunde
mensajes
• Desacoplamiento componentes
– Innecesario conocer implementaciones
• Late binding en ejecución
• Existen acciones nativas invocables con Intents
– Crean las actividades para realizar esas acciones
Intents
• Invocan Actividades y Servicios
• Anuncian e Informan de cosas que pasan a los
BroadcastReceivers
• Intent: objeto pasivo, estructura de datos con
descripción abstracta de la acción invocada o
el evento que ha ocurrido
Mecanismos de Entrega
• Invocación de Actividad
Context.startActivity() : lanza actividad
Activity.startActivityForResult() : pide a una actividad que haga algo
nuevo
También: Activity.setResult() : callback de vuelta para obtener la
inforamación
• Invocación de Servicio:
Context.startService() : inicia el servicio o nueva petición a servicio activo
Context.bindService() : establece comunicación con un servicio
Lo inicia si no estaba en ejecución
• Anuncios a BroadcastReceivers
Objetos Intent se pasan a los métodos de broadcast
Context.sendBroadcast()
Context.sendOrderedBroadcast(),
Context.sendStickyBroadcast()
Existen muchos tipos de anunciantes en el sistema
Gestión de Intents
• Android encuentra Actividad, Servicio o
BroadcastReceivers adecuados
– Y los instancia si es necesario
• Sin solape
– Broadcast intents sólo para BroadcastReceivers
– startActivity sólo para actividades
– Start/bind Service sólo para servicios
Components de Intent
• Acción: la acción a realizar
– ACTION_VIEW, ACTION_EDIT,….
• Datos: sobre los que opera la acción
– Expresados en forma de URI
• Ejemplos:
– ACTION_VIEW: content://contacts/people/1
– ACTION_DIAL: tel://915551234
– ACTION_DIAL: content://contacts/people/2
Atributos adicionales
• Category: información adicional tipo componente que
debe recoger el intent
• Type: MIME-TYPE de los datos del intent
• Component: componente (clase) que recibirá el Intent
– Declarado en AndroidManifest.xml
– Si se especifica: Android busca instancia de clase
• Si no, Android buscará el más adecuado
– Ver IntentResolution para detalles
• Extras: pares clave-valor
– Específicos de la acción
• Flags: específicos del sistema
– Definidos en la clase Intent
Resolución del Intent
• Destinatario explícito
– setComponent(componentName): se le envía
directamente
• Sin destinatario
– Hay que incluir suficiente info en el Intent para que
Android encuentre candidato adecuado
• Sólo se usa:
– Action
– Data (tanto URI como tipo)
– Category
– Mediante Intent-Filters
Acciones predefinidas
ACTION_CALL activity Initiate a phone call.
ACTION_EDIT activity Display data for the user to edit.
ACTION_MAIN activity
Start up as the initial activity of a
task, with no data input and no
returned output.
ACTION_SYNC activity
Synchronize data on a server with
data on the mobile device.
ACTION_BATTERY_LOW * broadcast receiver A warning that the battery is low.
ACTION_HEADSET_PLUG * broadcast receiver
A headset has been plugged into the
device, or unplugged from it.
ACTION_SCREEN_ON * broadcast receiver The screen has been turned on.
ACTION_TIMEZONE_CHANGED* broadcast receiver
The setting for the time zone has
changed.
….
*: Generados por Android
Filtros de Intenciones
• Elementos de Actividades, Servicios y
BroadcastReceiver
– Declarados en AndroidManifest.xml
Filtros de Intenciones
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="projects.helloworld"
android:versionCode="1"
android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".MainActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Difusión de intenciones
• Broadcast Intents para notificar a oyentes de
determinadas acciones o eventos
• Difusión de eventos del sistema
– Batería baja
– Llamada entrante
– …
• La aplicación construye el Intent
– sendBroadcast(): entrega síncrona
– sendOrderedBroadcast(): entrega asíncrona
Difusión de Intenciones
Intent miIntención=
new Intent(ACTION, datos);
miIntencion.putExtra(“parametro 1”, valor1);
miIntencion.putExtra(“parametro 1”, valor1);
sendBroadcast(miIntencion);
BroadcastReceiver
• void onReceive(Context curCtx, Intent
broadcastMsg): Punto de entrada principal
• El Broadcast Receiver se considera activo
mientras está ejecutando este método
– Al finalizar, pasa a inactivo
• onReceive: respuesta rápida
– El sistema lo marcaría como inactivo
• Si requiere mucho tiempo: lanzar Service para
realizar el trabajo
Implementación
import android.context.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
public class MiReceptorBroadcast
extends BroadcastReceiver
{
public void onReceive (Context context, Intent intent)
{
// código reacción al intent
}
}
BroadcastReceiver
• Escuchan Broadcast Intents
• Registrados
– Via código o AndroidManifest.xml
• Usan IntentFilters para indicar que intenciones
esperan
• Implementación:
– Extender BroadcastReceiver
– Sobreescribir onReceive()
Ejemplos de Intent, Filters y
Difusión
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Notificaciones
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Notificaciones al usuario
• Algunos sucesos deben notificarse al usuario
– Independientemente de lo que se ejecuta
– Algunos requieren respuesta del usuario
• Ejemplos: batería baja, fichero salvado, barra
de progreso, …
• Se requieren diferentes tipos de notificación
Toast Notification
• Mensaje Breves
– Tipo pop-up, aparece en la pantalla
– No bloqueante: app activa sigue
– No requiere interacción con el usuario
Status Bar Notification
• Icono en la barra de estado y mensaje en la
ventana de Notificaciones
– Puede lanzar un Intent si el usuario lo selecciona
Dialog Notification
• Pequeña ventana, delante de actividad activa
• Coge el foco
– Interacciona con el usuario
• Usadas para pequeñas actividades con el
usuario tipo “Ok” / “Cancel”
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Menús
• Componente importante de una aplicación:
proporciona una interfaz agradable y familiar
al usuario
• Acceso a funcionalidad y configuración
• Fácil programación en Android
Tipos de Menús
• Options Menu: aparece al pulsar el botón MENU del
dispositivo. Se divide en:
– Icon Menu: hasta 6 botones disponibles al pulsar MENU
• El único que soporta iconos
• Pero no soporta checkboxes o radiobuttons
– Expanded Menu: lista vertical de ítems al pulsar + en el
Icon Menu
• Context Menu: lista flotante que aparece al presionar
largo en una View
• Submenu: lista flotante, aparece al presionar un ítem
del Option Menu o menú contextual
– No soporta submenús anidados
Definir Menús
• Definición en XML
– Mejor que programáticamente (se puede)
• Separa diseño del interfaz de lógica de control
– Añadir recursos en código de aplicación
<menu> Crea un Menu, contenedor de ítems de menú.
Nodo raíz. Contiene al menos uno de los siguientes elementos.
Se puede anidar dentro de <item>
<item> Crea un MenuItem, elemento simple de un
menú
<group> Contenedor no vidisble de <item>
Categoriza <item>s
Comparten propiedades como estado y visibilidad
Ejemplo (Definición)
• Fichero game_menu.xml en res/menu/
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/andr
oid">
<item android:id="@+id/new_game"
android:icon="@drawable/ic_new_game"
android:title="@string/new_game" />
<item android:id="@+id/quit"
android:icon="@drawable/ic_quit"
android:title="@string/quit" />
</menu>
Ejemplo (Definición)
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/andr
oid">
<item android:id="@+id/new_game"
android:icon="@drawable/ic_new_game"
android:title="@string/new_game" />
<item android:id="@+id/quit"
android:icon="@drawable/ic_quit"
android:title="@string/quit" />
</menu>
Recurso ID
para manejo
en la app
Recurso visual Icono
para el usuario
String visible
para el
usuario
Acceso al menú
• Convierte el código XML en un objeto
– Mediante MenuInflater.inflate()
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.game_menu, menu);
return true;
}
Crear Option Menu
@Override
public boolean onOptionsItemSelected(MenuItem item)
{
// Handle item selection
switch (item.getItemId())
{
case R.id.new_game:
newGame();
return true;
case R.id.quit:
quit();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
Cambiar un Menú
• Se puede cambiar al menú cuando se abre
• onCreateOptionsMenu(): se invoca sólo la primera vez que se
abre Options Menu
– El sistema guarda y reúsa el Menú hasta que la Actividad se destruye
• onPrepareOptionsMenu(): sobreescribir para cambiar el
menú
– Se obtiene el objeto Menu
– Útil para eliminar, añadir o deshabilitar/habilitar ítems del menú
• Según el estado de la Actividad
• NOTA: no se deben cambiar los ítems dependiendo de la View
activa (con foco)
– En modo touch, las Views no pueden coger el foco: inapropiado para
cambiar menú
– Ítems según contexto: usar Context Menu
Options Menu programáticamente
/* crea los ítems del menú */
public boolean onCreateOptionsMenu(Menu menu)
{
menu.add(0, MENU_NEW_GAME, 0, “New Game);
menu.add(0, MENU_QUIT, 0, “Quit”);
return true;
}
/* actuación de las selecciones */
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId())
{
case MENU_NEW_GAME:
newGame();
return true;
case MENU_QUIT;
quit();
return true;
}
return false;
}
Crear un Context Menu
• Para cualquier View
– Normalmente, ListView
• Hay que registrar la View
– registerForContextMenu()
Nota: los ítems de menú contextual no soportan iconos ni atajos de
teclado
• Para definir aspecto y comportamiento, sobreescribir
los métodos (callbacks) de la Actividad
– onCreateMenuContext()
– onContextItemSelected()
Context Menu
• onCreateContextMenu() usa
context_menu.xml
@Override
public void onCreateContextMenu(ContextMenu menu,
View v,
ContextMenuInfo menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.context_menu, menu);
}
Context Menu
public boolean onContextItemSelected(MenuItem item)
{
AdapterContextMenuInfo info =
(AdapterContextMenuInfo) item.getMenuInfo();
switch (item.getItemId())
{
case R.id.edit:
editNote(info.id);
return true;
case R.id.delete:
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
/* crea los ítems del menú */
public boolean onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo
menuInfo)
{
super.onCreateContextMenu(menu, v, menuInfo);
menu.add(0, EDIT_ID, 0, “Edit”);
menu.add(0, DELETE_ID, 0, “Delete”);
return true;
}
/* actuación de las selecciones */
public boolean onContextItemSelected(MenuItem item)
{
AdapterContextMenuInfo info=
(AdapterContextMenuInfo)item.getMenuInfo()
switch (item.getItemId())
{
case EDIT_ID:
editNote(info.id);
return true;
case DELETE_ID;
deleteNote(info.id);
return true;
default:
return super.onContextItemSelected(item);
}
}
Context Menu programáticamente
Submenus
• Menú desplegado al seleccionar un ítem de
otro menú
– Se puede añadir a cualquier menú, excepto un
submenú
• No se pueden anidar
• Útiles para organizar funciones
– Agrupándolas lógicamente
Ejemplo submenu
<?xml version="1.0" encoding="utf-8"?>
<menu
xmlns:android="http://schemas.android.com/apk/res/andr
oid">
<item android:id="@+id/file"
android:icon="@drawable/file"
android:title="@string/file" >
<!-- "file" submenu -->
<menu">
<item android:id="@+id/new"
android:title="@string/new" />
<item android:id="@+id/open"
android:title="@string/open" />
</menu>
</item>
</menu>
Ejemplo submenu programáticamente
public boolean onCreateOptionsMenu(Menu menu)
{
boolean result= super.onCreateOptionsMenu(menu);
SubMenu fileMenu= menu.addSubMenu(“File”);
SubMenu editMenu= menu.addSubMenu(“Edit”);
fileMenu.add(“new”);
fileMenu.add(“open”);
fileMenu.add(“save”);
editMenu.add(“undo”);
editMenu.add(“redo”);
return result;
}
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Almacenamiento de Datos
• SO ofrece SF para compartir datos entre apps
• En Android los ficheros son privados por app
• La información se comparte mediante
ContentProviders
Almacenamiento de Datos
• Opciones para almacenar datos:
• Shared Preferences
– Pares clave-valor: datos primitivos privados
• Internal Storage
– Datos privados en memoria del dispositivo
• External Storage
– Datos públicos en almacenamiento externo compartido
• SQLite Databases
– Datos structurados en BD privada
• Network Connection
– Datos almacenados en un servidor de red
Preferencias
• Pares clave-valor
• Datos primitivos: boolean, float, int, long,
string
• Datos persistentes aunque maten la actividad
• Uso típico: preferencias de aplicación
– Colores, fuentes, tamaños, …
– Preferible la PreferenceActivity
– Guardar datos en onSaveInstance() o
onStop()
Clase SharedPreferences
• SharedPreferences
getSharedPreferences(String
name, int mode) : se necesitan varios
ficheros de preferencias identificados por
nombre
• SharedPreferences
getPreferences(int mode): se
necesita sólo un fichero en la Activity
– No necesita nombre de fichero
Métodos SharedPreferences
• Para escribir valores:
1. Llamar edit() para conseguir un
SharedPreferences.Editor
2. Añadir valores con métodos como putBoolean()
o putString()
3. Almacenar los nuevos valores con commit()
• Para leer valores:
– Métodos getBoolean() and getString() de
SharedPreferences
public class Calc extends Activity
{
public static final String PREFS_NAME = "MyPrefsFile";
@Override
protected void onCreate(Bundle state)
{
super.onCreate(state);
. . .
// Restore preferences
SharedPreferences settings =
getSharedPreferences(PREFS_NAME, 0);
boolean silent =
settings.getBoolean("silentMode", false);
setSilent(silent);
}
Ejemplo Preferencias
@Override
protected void onStop()
{
super.onStop();
// We need an Editor object to make preference changes
// All objects are from android.context.Context
SharedPreferences settings =
getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor = settings.edit();
editor.putBoolean("silentMode", mSilentMode);
// Commit the edits!
editor.commit();
}
}
Ficheros
• Son privados de la aplicación
– Ni otras aplicaciones ni el usuario
• Permisos UNIX
• Eliminados al desinstalar la aplicación
• Programación similar a otros streams de Java
Crear y Escribir Ficheros
• public abstract
FileOutputStream openFileOutput
(String name, int mode)
• write()
• close()
Ficheros: ejemplo
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos =
openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
Crear y Leer Ficheros
• public abstract FileInputStream
openFileInput (String name, int
mode)
• read()
• close()
– Ficheros estáticos en tiempo de compilación
• Salvar fichero en directorio de proyecto res/raw/
• Abrir con openRawResource(), R.raw.<filename>
– Devuelve un InputStream para leer fichero original (no se
puede escribir)
Ficheros temporales
• getCacheDir(): abre ficheros temporales para
cachear datos
– El sistema puede borrarlos si se queda sin
memoria
• Pero es responsabilidad del programa borrar dichos
ficheros: el sistema podría no borrarlos
• Se eliminan al desinstalar la aplicación
Ficheros: Métodos útiles
• getFilesDir(): Devuelve el path absoluto del
directorio de sistema de ficheros donde
residen los ficheros internos
• getDir(): Crea (o abre, si existe) un directorio
en el espacio de almacenamiento interno
• deleteFile(): Borra un fichero en
almacenamiento interno
• fileList(): Devuelve un array de ficheros
salvados por la aplicación
Almacenamiento externo
• Medios de almacenamiento removibles
– Externos: Tarjetas SD,…
– Internos
• Modificables si el usuario permite
transferencia de ficheros desde
almacenamiento USB
– Los ficheros podrían desaparecer si el usuario
desconecta el almacenamiento
– No hay seguridad de acceso
Disponibilidad
• getExternalStorageState(): comprueba si el
medio de almacenamiento está disponible
Comprobación Disponibilidad
boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(state)) {
// We can read and write the media
mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
// We can only read the media
mExternalStorageAvailable = true;
mExternalStorageWriteable = false;
} else {
// Something else is wrong. It may be one of many other states,
// but all we need to know is we can neither read nor write
mExternalStorageAvailable = mExternalStorageWriteable = false;
}
Acceso a Medios Externos
• Nivel 8 del API:
– File getExternalFileDir(String type)
• abre fichero externo
• type: DIRECTORY_MUSIC, DIRECTORY_RINGTONES, …
– null para directorio raíz
• Nivel 7 o anterior:
– getExternalStorageDirectory()
• Datos en /Android/data/<package_name>/files
– package_name de Java
Ficheros compartidos
• Ficheros no específicos de la app: salvarlos en
directorios públicos
Music/, Pictures/, Ringtones/,
– API Nivel 8: getExternalStoragePublicDirectory()
• DIRECTORY_MUSIC, DIRECTORY_PICTURES,
DIRECTORY_RINGTONES,…
• Los crea si no existen
– API Nivel 7 o anterior: getExternalStorageDirectory()
Music/
Podcast/
Ringtones/
Alarms/
Ficheros Caché
• API nivel 8: getExternalCacheDir()
• API nivel 7 o anterior:
getExternalStorageDirectory()
– /Android/data/<package_name>/cache
Bases de Datos
• Soporte completo de BD SQLite
• BD accesible desde cualquier clase de la app
– Pero no desde fuera
• Se almacenan en
/data/data/<nombre_paquete>/databases
• Clases envoltorios para almacenar
información en la BD
BD SQLite
• Código Abierto
• Ligera
• Cursor: resultado de las consultas (queries)
• Usado en reproductores MP3, iPhone/iPods, …
http://www.sqlite.org
Manejo BD SQLite
• Mecanismo recomendado creación BD SQLite
– Crear subclase de SQLiteOpenHelper
• Y sobreescribir onCreate()
Ejemplo SQLite
public class DictionaryOpenHelper extends SQLiteOpenHelper
{
private static final int DATABASE_VERSION = 2;
private static final String DICTIONARY_TABLE_NAME = "dictionary";
private static final String DICTIONARY_TABLE_CREATE =
"CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" +
KEY_WORD + " TEXT, " +
KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(DICTIONARY_TABLE_CREATE);
}
}
Acceso BD
• getWritableDatabase() / getReadableDatabase()
– Devuelven una BD para escribir o leer con métodos
para operar la BD
• SQLiteDatabase.query(): consultas simples
• SQLiteQueryBuilder(): consultas complejas
• Las consultas devuelven Cursor
– Apunta a las filas encontradas en la consulta
– Mecanismo para manejar resultados y leer filas y
columnas
• sqlite3: herramientas para consultar BD, ejecutar
comandos SQL, … (incluida en Android SDK)
Cursores
• Recorren y procesan consultas
– moveToFirst: cursor en la primera fila
– moveToNext: avanza el cursor
– moveToPrevious: retrocede el cursor
– moveToPosition: mueve cursor a dicha posición
– getPosition: devuelve posición actual del cursor
– getCount: cantidad de registros en la consulta
– getColumnIndexOrThrow: índice de la columna dada
– getColumnName: nombre de la columna por índice
– getColumnNames: array con nombres de columnas
Ejemplo de Cursores
Conexiones en Red
• Cada vez más, se almacenan los datos en
servidores externos
– Servicios de Google, Yahoo, …
• Los siguientes paquetes pueden ser de
utilidad:
– java.net.*
– android.net.*
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Content Providers
• Mecanismo genérico de compartir datos entre
aplicaciones
• Android: Predefinidos audio, video, imágenes,
contactos,…
– Algunos requieren permisos explícitos
• Paquete android.provider
• Dos posibilidades en app
– Crear propio (subclase ContentProvider)
– Acceder a uno creado
• Mismo tipo de datos y con permisos
ContentResolver
• Único por contexto de aplicación
• Usado para transacciones y consultas a
ContentProviders
• Al iniciar una consulta, Android identifica el
ContentProvider y se asegura de que está ejecutándose
• El sistema instancia los ContentProviders
– Suele ser única para cada tipo de datos
– Y comunican con muchas instancias de ContentResolvers
de diferentes aplicaciones
ContentResolver cr= getContentResolver();
Acceso a ContentProvider
• Como las BD, se manejan con Cursor
– Con métodos especializados para diferentes tipos de
datos
• Para acceder a un campo, hay que saber el tipo del
contenido
• Cada ContentProvider expone un URI público
– Como objeto Uri
– Pasado a cada método de ContentResolver
• content://
android.provider.Contacts.Phones.CONTENT_URI
android.provider.Contacts.Photos.CONTENT_URI
Consultar ContentProvider
• Para consultar un ContentProvider se requiere:
– URI que identifica el proveedor
– Nombre de los campos de datos a consultar
– Tipos de datos de dichos campos
• Para consultar un registro en particular, se
necesita el ID del mismo
content://. . . ./23
Métodos útiles:
• ContentUris.withAppendedId()
• Uri.withAppendedPath()
– Facilitan la concatenación de un ID a un URI
Consultas
• Cursor ContentResolver.query(…)
• Cursor Activity.managedquery(…)
– Mismos argumentos
– La actividad gestiona el ciclo de vida del Cursor
String[] projection = new String[] { “_id”, “number”, ”name” };
Cursor managedCursor =
managedQuery(new ContentURI (“content://contacts/phones”),
projection,
null,
null,
”name” + " ASC");
En detalle
import android.provider.Contacts.People;
import android.database.Cursor;
// Especificamos columnas deseadas
String[] projection =
new String[] { People._ID, People._COUNT,
People.NAME, People.NUMBER
};
// URI base para la tabla de People en el proveedor de Contacts
Uri contacts = People.CONTENT_URI;
// Gestiona la consulta
Cursor managedCursor =
managedQuery(contacts,
projection, // Qué columnas se devuelven
null, // Qué filas se desean (todas)
null, // Filtro de selección (ninguno)
// Ordenado en orden ascendente
// por nombre
People.NAME + " ASC");
URI
• A: prefijo estándar
• B: identificador del ContentProvider
– Full-qualified class name, minúsculas
• C: path que determina qué parte se accede
– Cero o más segmentos
• D: ID del registro (opcional)
<provider android:name=".TransportationProvider"
android:authorities="com.example.transportationprovider"
. . . >
ContentProviders de Android
• Browser: bookmarks, historial, búsquedas
• CallLog: llamadas entrantes y salientes
• ContactsContract: información de contactos
– Contacts deprecado
• LiveFolder: carpeta especial poblada por un
ContentProvider
• MediaStore: metadatos de medios disponibles
– Internos o externos
• SearchRecentSuggestions
• Settings: preferencias del dispositivo
• SyncStateContract
• UserDictionary
Implementar un ContentProvider
• Los principales métodos a implementar son:
– Boolean onCreate(): Invocado al inicializar el proveedor
– Cursor query(Uri uri, String[] projection, String selection ,
String[] selectionArgs, String sortOrder) : devuelve datos al
usuario
– Uri insert(Uri, ContentValues) inserta datos nuevos en el
proveedor
– int update(Uri uri, ContentValues values, String selection,
String[] selectionArgs) actualiza datos existentes en el proveedor
– int delete(Uri uri, String selection, String[] selectionArgs) borra
datos del proveedor
– String getType(Uri uri) devuelve el tipo MIME de los datos
contenidos en el proveedor
– … hay muchos más
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad y Permisos
• Listados de Bibliotecas
Seguridad y Permisos
• Basada en Kernel Linux
– ID único por paquete
– Procesos en sandbox
• Previene interferencias entre aplicaciones
– Excepto con permiso explícito
• Permisos a nivel de aplicación
– Acceso a recursos: envío SMS, …
• Se pueden definir en AndroidManifest
Uso de Permisos
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.app.myapp" >
<uses-permission android:name="android.permission.RECEIVE_SMS"
/>
</manifest>
Permisos propios
• Declararlos en AndroidManifest
– Tag: <permission>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.me.app.myapp" >
<permission
android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY"
android:label="@string/permlab_deadlyActivity"
android:description="@string/permdesc_deadlyActivity"
android:permissionGroup="android.permission-group.COST_MONEY"
android:protectionLevel="dangerous" />
</manifest>
Ejemplo: Permiso CALL_PHONE
<string name="permlab_callPhone">directly call phone numbers</string>
<string name="permdesc_callPhone">Allows the application
to call phone numbers without your intervention. Malicious
applications may cause unexpected calls on your phone bill.
Note that this does not allow the application to call emergency
numbers.</string>
Índice
• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
Bibliotecas Android (I)
• android.util: utilidades básicas: fecha y hora, números
y cadenas, utillería XML
• android.os: servicios del S.O. (mensajes, batería, …)
• android.graphics: colores, dibujos…
• android.text: manejo y reconocimiento de cadenas de
texto
• android.context: accesso a distintos recursos
• android.view: gestión de vistas
• android.widget: elementos nativos: listas, botones,…
Bibliotecas Android (II)
• android.gesture: crear, reconocer ,
cargar/salvar gestos,…
• android.database: gestión de BD
• android.webkit: herramientas para navegar
por la Web
• org.apache.http: componentes HTTP
Bibliotecas Android (II)
• android.app: contexto de aplicación, actividades, API
de servicios
• android.provider: acceso a Content Providers
• android.telephony;: acceso a teléfono y su uso:
llamadas, SMS,…
• android.bluetooth: acceso a Bluetooth
• android.net: redes, reconocedores, sockets, más que
java.net.*
• android.media: grabación/reproducción de medios
(video, audio, imágenes,…)
• android.opengl: motor 3D
Bibliotecas Android (III)
• android.hardware:
– android.hardware.SensorManager: sensor de
orientación y acelerómetro
– android.hardware.Camera: parámetros de la
cámara, start/stop previsualización, fotografías,
captura de vídeo,…
– android.hardware.GeomagneticField !!
• android.location: geolocalización
• android.media: MediaPlayer
Otras bibliotecas
• FreeType
• SGL
• Libc
• SQLite
• SSL
Bibliotecas Google
• http://code.google.com/intl/es/android/add-ons/google-
apis/
• Paquete com.google.android.maps.MapView
– Subclase de ViewGroup
• El complemento para las API de Google incluye:
– biblioteca externa de Google Maps para Android 1.5 (nivel de
API 3),
– imagen del sistema Android 1.5 completamente compatible
(con la biblioteca de Google Maps insertada),
– Aplicación de Android de ejemplo denominada MapsDemo,
– Doc completa
– Registro servicio Google Maps: obtener Maps API Key

Más contenido relacionado

La actualidad más candente

Guis en java-1pp_2012_
Guis en java-1pp_2012_Guis en java-1pp_2012_
Guis en java-1pp_2012_Robert Wolf
 
curso android tema 3
curso android tema 3curso android tema 3
curso android tema 3Frank Jorge
 
Taller Práctico de Android
Taller Práctico de AndroidTaller Práctico de Android
Taller Práctico de AndroidJavier Muñoz
 
Tema 4 3_2_interfaces_de_usuario
Tema 4 3_2_interfaces_de_usuarioTema 4 3_2_interfaces_de_usuario
Tema 4 3_2_interfaces_de_usuarioCarlos A. Iglesias
 
Curso de Android 4.x Unidad 03 Hola Mundo
Curso de Android 4.x Unidad 03 Hola MundoCurso de Android 4.x Unidad 03 Hola Mundo
Curso de Android 4.x Unidad 03 Hola MundoDavid Vaquero
 
Java GUI La librería Swing
Java GUI La librería Swing Java GUI La librería Swing
Java GUI La librería Swing Laura
 
Power builder 7.0 diseno de aplicaciones
Power builder 7.0   diseno de aplicacionesPower builder 7.0   diseno de aplicaciones
Power builder 7.0 diseno de aplicacionesDavid
 
Curso Android Tema 2
Curso Android Tema 2Curso Android Tema 2
Curso Android Tema 2Frank Jorge
 
Presentación de eclipse(componentes básicos)
Presentación de eclipse(componentes básicos)Presentación de eclipse(componentes básicos)
Presentación de eclipse(componentes básicos)Esmedc20
 

La actualidad más candente (20)

Curso desarrollo en android
Curso desarrollo en androidCurso desarrollo en android
Curso desarrollo en android
 
Iniciación a Android
Iniciación a AndroidIniciación a Android
Iniciación a Android
 
Android bootcamp 101 v2.0
Android bootcamp 101 v2.0Android bootcamp 101 v2.0
Android bootcamp 101 v2.0
 
Guis en java-1pp_2012_
Guis en java-1pp_2012_Guis en java-1pp_2012_
Guis en java-1pp_2012_
 
Android master class
Android master classAndroid master class
Android master class
 
Android Basics v2.0
Android Basics v2.0Android Basics v2.0
Android Basics v2.0
 
curso android tema 3
curso android tema 3curso android tema 3
curso android tema 3
 
Taller Práctico de Android
Taller Práctico de AndroidTaller Práctico de Android
Taller Práctico de Android
 
Tema 4 3_2_interfaces_de_usuario
Tema 4 3_2_interfaces_de_usuarioTema 4 3_2_interfaces_de_usuario
Tema 4 3_2_interfaces_de_usuario
 
Curso de Android 4.x Unidad 03 Hola Mundo
Curso de Android 4.x Unidad 03 Hola MundoCurso de Android 4.x Unidad 03 Hola Mundo
Curso de Android 4.x Unidad 03 Hola Mundo
 
manual-power-builder
manual-power-buildermanual-power-builder
manual-power-builder
 
Java GUI La librería Swing
Java GUI La librería Swing Java GUI La librería Swing
Java GUI La librería Swing
 
Trucos Pb
Trucos PbTrucos Pb
Trucos Pb
 
Power builder 7.0 diseno de aplicaciones
Power builder 7.0   diseno de aplicacionesPower builder 7.0   diseno de aplicaciones
Power builder 7.0 diseno de aplicaciones
 
Java
JavaJava
Java
 
Curso Android Tema 2
Curso Android Tema 2Curso Android Tema 2
Curso Android Tema 2
 
Ha2 nm50 eq#3-powerbuilder
Ha2 nm50 eq#3-powerbuilderHa2 nm50 eq#3-powerbuilder
Ha2 nm50 eq#3-powerbuilder
 
Presentación de eclipse(componentes básicos)
Presentación de eclipse(componentes básicos)Presentación de eclipse(componentes básicos)
Presentación de eclipse(componentes básicos)
 
Guia jQuery INCES Militar - Kurt Gude
Guia jQuery INCES Militar - Kurt GudeGuia jQuery INCES Militar - Kurt Gude
Guia jQuery INCES Militar - Kurt Gude
 
Curso Android 2021
Curso Android  2021Curso Android  2021
Curso Android 2021
 

Similar a Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados

Tema 4 4_1_intenciones_servicios
Tema 4 4_1_intenciones_serviciosTema 4 4_1_intenciones_servicios
Tema 4 4_1_intenciones_serviciosCarlos A. Iglesias
 
Android UC3M Sesión 2
Android UC3M Sesión 2Android UC3M Sesión 2
Android UC3M Sesión 2topoos
 
Introducción al desarrollo Android, Sesión 2
Introducción al desarrollo Android, Sesión 2Introducción al desarrollo Android, Sesión 2
Introducción al desarrollo Android, Sesión 2findemor
 
Sesion 11 Teoria.pdf
Sesion 11 Teoria.pdfSesion 11 Teoria.pdf
Sesion 11 Teoria.pdfDianaSullcav
 
Iniciación a la programación para Android - Murcia GTUG (Murcia Lan Pary 2011)
Iniciación a la programación para Android - Murcia GTUG (Murcia Lan Pary 2011)Iniciación a la programación para Android - Murcia GTUG (Murcia Lan Pary 2011)
Iniciación a la programación para Android - Murcia GTUG (Murcia Lan Pary 2011)aeliasnet
 
Android de la A a la Z Actividades ulises gonzalez
Android de la A a la Z   Actividades ulises gonzalezAndroid de la A a la Z   Actividades ulises gonzalez
Android de la A a la Z Actividades ulises gonzalezAndroid UNAM
 
Jade Agentes inteligentes básico
Jade Agentes inteligentes básicoJade Agentes inteligentes básico
Jade Agentes inteligentes básicoOctavio Abundez
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Airespeterpunk
 
Ponencia Final Dispositivos Móviles
Ponencia Final Dispositivos Móviles Ponencia Final Dispositivos Móviles
Ponencia Final Dispositivos Móviles Adán Silva
 
Vaadin 8 en BBR Spa
Vaadin 8 en BBR SpaVaadin 8 en BBR Spa
Vaadin 8 en BBR Spadavidsm1979
 
Tips para MS Project 2003: El Centro de Proyectos
Tips para MS Project 2003: El Centro de ProyectosTips para MS Project 2003: El Centro de Proyectos
Tips para MS Project 2003: El Centro de ProyectosDharma Consulting
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixParadigma Digital
 

Similar a Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados (20)

Slides1
Slides1Slides1
Slides1
 
Tema 4 4_1_intenciones_servicios
Tema 4 4_1_intenciones_serviciosTema 4 4_1_intenciones_servicios
Tema 4 4_1_intenciones_servicios
 
Slides p3 2
Slides p3 2Slides p3 2
Slides p3 2
 
Tema
Tema Tema
Tema
 
Android UC3M Sesión 2
Android UC3M Sesión 2Android UC3M Sesión 2
Android UC3M Sesión 2
 
Introducción al desarrollo Android, Sesión 2
Introducción al desarrollo Android, Sesión 2Introducción al desarrollo Android, Sesión 2
Introducción al desarrollo Android, Sesión 2
 
Sesion 11 Teoria.pdf
Sesion 11 Teoria.pdfSesion 11 Teoria.pdf
Sesion 11 Teoria.pdf
 
Seminario Android
Seminario AndroidSeminario Android
Seminario Android
 
Iniciación a la programación para Android - Murcia GTUG (Murcia Lan Pary 2011)
Iniciación a la programación para Android - Murcia GTUG (Murcia Lan Pary 2011)Iniciación a la programación para Android - Murcia GTUG (Murcia Lan Pary 2011)
Iniciación a la programación para Android - Murcia GTUG (Murcia Lan Pary 2011)
 
31-Android Generalidades Sobre Servicios Webs con MySQL
31-Android Generalidades Sobre Servicios Webs con MySQL31-Android Generalidades Sobre Servicios Webs con MySQL
31-Android Generalidades Sobre Servicios Webs con MySQL
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Tema12
Tema12Tema12
Tema12
 
Android de la A a la Z Actividades ulises gonzalez
Android de la A a la Z   Actividades ulises gonzalezAndroid de la A a la Z   Actividades ulises gonzalez
Android de la A a la Z Actividades ulises gonzalez
 
Jade Agentes inteligentes básico
Jade Agentes inteligentes básicoJade Agentes inteligentes básico
Jade Agentes inteligentes básico
 
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos AiresPresentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
Presentación Ruby on Rails en Softare Freedom Day 09 Buenos Aires
 
Ponencia Final Dispositivos Móviles
Ponencia Final Dispositivos Móviles Ponencia Final Dispositivos Móviles
Ponencia Final Dispositivos Móviles
 
Vaadin 8 en BBR Spa
Vaadin 8 en BBR SpaVaadin 8 en BBR Spa
Vaadin 8 en BBR Spa
 
Tips para MS Project 2003: El Centro de Proyectos
Tips para MS Project 2003: El Centro de ProyectosTips para MS Project 2003: El Centro de Proyectos
Tips para MS Project 2003: El Centro de Proyectos
 
Orquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace NetflixOrquestando microservicios como lo hace Netflix
Orquestando microservicios como lo hace Netflix
 
VenALaU Entrega Final
VenALaU Entrega FinalVenALaU Entrega Final
VenALaU Entrega Final
 

Último

Inteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicialInteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicialEducática
 
Gestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL ServerGestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL ServerRobertoCarrancioFern
 
proyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmusproyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmusraquelariza02
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfEmilio Casbas
 
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docxwerito139410
 
Introducción a la robótica con arduino..pptx
Introducción a la robótica con arduino..pptxIntroducción a la robótica con arduino..pptx
Introducción a la robótica con arduino..pptxJohanna4222
 
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdf
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdfPons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdf
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdffrank0071
 
Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.saravalentinat22
 
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024DanielErazoMedina
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfManuelCampos464987
 
¡Mira mi nuevo diseño hecho en Canva!.pdf
¡Mira mi nuevo diseño hecho en Canva!.pdf¡Mira mi nuevo diseño hecho en Canva!.pdf
¡Mira mi nuevo diseño hecho en Canva!.pdf7adelosriosarangojua
 
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...Kevin Serna
 
Diagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestreDiagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestrerafaelsalazar0615
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfjjfch3110
 
Robótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptxRobótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptx44652726
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informáticavazquezgarciajesusma
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiegoCampos433849
 
lenguaje algebraico.pptx álgebra, trigonometria
lenguaje algebraico.pptx álgebra, trigonometrialenguaje algebraico.pptx álgebra, trigonometria
lenguaje algebraico.pptx álgebra, trigonometriasofiasonder
 
herramientas informaticas mas utilizadas
herramientas informaticas mas utilizadasherramientas informaticas mas utilizadas
herramientas informaticas mas utilizadaspqeilyn0827
 
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...Luis Fernando Uribe Villamil
 

Último (20)

Inteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicialInteligencia Artificial para usuarios nivel inicial
Inteligencia Artificial para usuarios nivel inicial
 
Gestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL ServerGestión de concurrencia y bloqueos en SQL Server
Gestión de concurrencia y bloqueos en SQL Server
 
proyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmusproyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmus
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
3°ð_¦_â_¾ï¸_S34 PLAN DARUKEL DIDÃ_CTICA 23-24.docx
 
Introducción a la robótica con arduino..pptx
Introducción a la robótica con arduino..pptxIntroducción a la robótica con arduino..pptx
Introducción a la robótica con arduino..pptx
 
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdf
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdfPons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdf
Pons, A. - El desorden digital - guia para historiadores y humanistas [2013].pdf
 
Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.Herramientas informáticas. Sara Torres R.
Herramientas informáticas. Sara Torres R.
 
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
 
Diagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdfDiagrama de flujo basada en la reparacion de automoviles.pdf
Diagrama de flujo basada en la reparacion de automoviles.pdf
 
¡Mira mi nuevo diseño hecho en Canva!.pdf
¡Mira mi nuevo diseño hecho en Canva!.pdf¡Mira mi nuevo diseño hecho en Canva!.pdf
¡Mira mi nuevo diseño hecho en Canva!.pdf
 
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
HerramientasInformaticas ¿Que es? - ¿Para que sirve? - Recomendaciones - Comp...
 
Diagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestreDiagrama de flujo soporte técnico 5to semestre
Diagrama de flujo soporte técnico 5to semestre
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
Robótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptxRobótica educativa para la eduacion primaria .pptx
Robótica educativa para la eduacion primaria .pptx
 
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
(PROYECTO) Límites entre el Arte, los Medios de Comunicación y la Informática
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
 
lenguaje algebraico.pptx álgebra, trigonometria
lenguaje algebraico.pptx álgebra, trigonometrialenguaje algebraico.pptx álgebra, trigonometria
lenguaje algebraico.pptx álgebra, trigonometria
 
herramientas informaticas mas utilizadas
herramientas informaticas mas utilizadasherramientas informaticas mas utilizadas
herramientas informaticas mas utilizadas
 
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
Sistemas distribuidos de redes de computadores en un entorno virtual de apren...
 

Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados

  • 1. Desarrollo de Aplicaciones Móviles en Android: Temas Avanzados Gabriel Huecas Universidad Politécnica de Madrid 23 de Noviembre de 2010
  • 2. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 3. Elementos • Views: interfaz gráfica visual • Activity: presentación de la aplicación (casi siempre asociado a una pantalla) • Services: procesos no visuales ejecutado en background • Broadcast receivers: consumidores de Broadcast Intents • Intents: paso de mensajes • Notifications: eventos de/para usuario • Content Providers: almacén compartido de datos
  • 4. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 5. Interfaces de Usuario • View y ViewGroup – View: Punto de interacción con el usuario – ViewGroup: agrupación lógica de elementos visuales • Widgets: subclases de View – Entradas de texto, botones, radiobuttons,… • != widgets de escritorio • Layout: subclase de ViewGroup – Organizan elementos visuales • Adapters: subclase de ViewGroup – Engarce de Views con datos externos
  • 6.
  • 7. Views • Unidad básica de GUI • Todas las clases visuales heredan de View • Área rectangular de pantalla – Sabe dibujarse – Gestiona eventos • Especificación XML – Desacopla detalles visuales de lógica de control • Por código: desaconsejado
  • 8. View en XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id=“@+id/myTextView” android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>
  • 9. View en XML public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } ... // buscamos el TextView por el ID TextView myTextView= (TextView)findViewByID(R.id.myTextView);
  • 10. Creación de View por código public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView myTextView= new TextView(this); setContentView(myTextView); myTextView.setText(“Hello, World!”); } Desaconsejado: mezcla de diseño visual con lógica de programa
  • 11. ViewGroups • View contenedora de Views • Clase base para layouts • Jerarquía de objetos visuales
  • 12. Widget • View con funcionalidad (compleja) • Creación de Widget – Se crea una View – Se añade gestión de eventos, componentes visuales,… • Se pueden extender widgets de Android
  • 13. Widgets • TextView: etiqueta de sólo lectura • EditText: campo de texto modificable • ListView: crea y gestiona lista de Views • Spinner: control compuesto: TextView + ListView, para selección de ítem • Button: botón • CheckBox: botón de dos estados • RadioButton: selección exclusiva entre varios ítems
  • 16. Layout • Gestores de elementos visuales – Heredan de ViewGroup • Controlan posiciones absolutas o relativas de las Views hijas – Se pueden anidar • Android incluyen gran variedad
  • 17. Layouts • FrameLayout: el más simple – Cada View hija se añade en la esquina sup. izq. – …tapando a la anterior • LinearLayout: Views alineadas (hor. / ver.) • RelativeLayout: nuevas Views en posición relativa a las anteriores • TableLayout: grid de filas/columnas • AbsoluteLayout: Views con coordenadas absolutas
  • 20. Jerarquía Layout java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup Known Direct Subclasses AbsoluteLayout, AdapterView<T extends Adapter>, FrameLayout, LinearLayout, RelativeLayout, SlidingDrawer AbsoluteLayout This class is deprecated. Use FrameLayout, RelativeLayout or a custom layout instead.
  • 21. Jerarquía Layout Known Indirect Subclasses AbsListView, AbsSpinner, AppWidgetHostView, DatePicker, DialerFilter, ExpandableListView, Gallery, GestureOverlayView, GridView, HorizontalScrollView, ImageSwitcher, ListView, MediaController, RadioGroup, ScrollView, Spinner, TabHost, TabWidget, TableLayout, TableRow, TextSwitcher, TimePicker, TwoLineListItem, ViewAnimator, ViewFlipper, ViewSwitcher, WebView, ZoomControls
  • 22. Adapters • Enlace Views con Datos – Normalmente externos • AdapterView – Las Views hijas se crean e inicializan con datos externos • Los más comunes – CursorAdapter: vista de base de datos – ArrayAdapter: array arbitrario
  • 23. Adapters ArrayAdapter<String> myAdapter; myAdapter= new ArrayAdapter<String>(this, layoutID, myStringArray); myListView.setAdapter(myAdapter);
  • 24. Adapter android.widget.Adapter Known Indirect Subclasses ArrayAdapter<T>, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter java.lang.Object ↳ android.view.View ↳ android.view.ViewGroup ↳ android.widget.AdapterView<T extends android.widget.Adapter> Known Direct Subclasses AbsListView, AbsSpinner AbsListView Base class that can be used to implement virtualized lists of items. AbsSpinner An abstract base class for spinner widgets. Known Indirect Subclasses ExpandableListView, Gallery, GridView, ListView, Spinner
  • 25. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 26. Activity • Hereda de android.app.Activity • Casi siempre contiene una GUI • Responsabilidad limitada (alta cohesión, bajo acoplamiento) • Una aplicación puede contener varias Activity – Una de ellas será la principal • Pueden usar componentes visuales, interactuar con servicios, crear Intents, etc. • Se puede invocar a otra (subactividad)
  • 27. Invocación subActivity • Fire and Forget – Se crea la subactividad – La subactividad toma el foco – La creadora no espera respuesta • Y baja en la pila – Se crea con startActivity(…); • Async callback – Se crea la subactividad que al finalizar invoca al método de regreso onActivityResult(…) de la principal – Se crea con startActivityForResult(…)
  • 28. ActivityManager • Controla ciclo de vida de cada actividad • Controla la pila de actividades • Monitoriza – Detección ANR (Application Not Responding) • Actividad sin responder a un evento en 5 segundos • BroadcastReceiver no finaliza en 10 segundos – Evitar ANR: uso de Handlers
  • 30. Ciclo de Vida de las Actividades • Básicamente, 3 estados – Activa: tiene el foco, visible, encima de la pila – Pausada: visible, sin foco (otra activa) – Parada: no visible, eliminable • Cambio de estado – Transición notificada mediante métodos de Actividad • sobreescribirlos
  • 31. Métodos de Estado de Actividad • void onCreate(): creación de actividad o restauración desde parada • void onStart(): la actividad es visible para el usuario • void onResume(): la actividad parcialmente visible • void onPause(): otra actividad activa, esta aún visible • void onStop(): deja de ser visible • void onDestroy(): llamado al cerrar actividad
  • 32.
  • 33. Ciclo de Vida • onCreate(), onDestroy(): Abarcan todo el ciclo de vida. Invocados al principio (arranque o rearranque) y al fin de la actividad • onStart(), onStop(): Parte visible del ciclo de vida. Desde onStart() hasta onStop(). Podría no disponder de foco (usuario interactuando con actividades superpuestas). Pueden ser llamados múltiples veces. • onResume(), onPause(): Parte útil del ciclo de vida. Desde onResume() hasta onPause(), actividad visible, y con foco: el usuario puede interactuar con ella.
  • 34. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 35. Servicios • Ejecutados en segundo plano, sin GUI • Más prioridad que Activity – LocationManager – MediaController – NotificationManager
  • 36. Ciclo de Vida de los Servicios • Si un cliente está conectado a un Servicio, este no puede ser parado – Hasta su desconexión • Comienzo del Servicio – Context.startService(): ejecuta servicio y queda a la espera – Context.bindService(): algún cliente (Activity, otro Service,….) conecta con el servicio • Si no está creado, lo crea
  • 37. Ciclo de Vida de los Servicios • Detener un servicio – Context.stopService(): la actividad detiene el servicio – StopSelf(): el servicio se detiene el mismo
  • 38. Conexiones al Servicio • IBinder onBind(Intent intent): un cliente se conecta. Devuelve un canal (IBinder) para interactuar • Boolean onUnbind(Intent intent): un cliente se desconecta • void onRebind(Intent intent): el cliente vuelve a conectarse – Después de haberse desconectado
  • 39.
  • 40. Métodos de Estado de Servicio • void onCreate(): el servicio ha sido creado • void onStart(Intent intent): el servicio ha sido iniciado – El Intent podría contener información adicional para el servicio • void onDestroy(): finaliza el servicio
  • 41. NotificationManager • Comunicación de eventos al usuario – Invisibles, sin interfaz gráfica • Tipos – Icono persistente en barra de estado – Encendido y apagado de LED – Vibración – Audio – Iluminación – …
  • 42. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 43. Intenciones • Intent: mecanismo basado en paso de mensajes para (intentar) realizar una acción • Inicia Actividades y Servicios o difunde mensajes • Desacoplamiento componentes – Innecesario conocer implementaciones • Late binding en ejecución • Existen acciones nativas invocables con Intents – Crean las actividades para realizar esas acciones
  • 44. Intents • Invocan Actividades y Servicios • Anuncian e Informan de cosas que pasan a los BroadcastReceivers • Intent: objeto pasivo, estructura de datos con descripción abstracta de la acción invocada o el evento que ha ocurrido
  • 45. Mecanismos de Entrega • Invocación de Actividad Context.startActivity() : lanza actividad Activity.startActivityForResult() : pide a una actividad que haga algo nuevo También: Activity.setResult() : callback de vuelta para obtener la inforamación • Invocación de Servicio: Context.startService() : inicia el servicio o nueva petición a servicio activo Context.bindService() : establece comunicación con un servicio Lo inicia si no estaba en ejecución • Anuncios a BroadcastReceivers Objetos Intent se pasan a los métodos de broadcast Context.sendBroadcast() Context.sendOrderedBroadcast(), Context.sendStickyBroadcast() Existen muchos tipos de anunciantes en el sistema
  • 46. Gestión de Intents • Android encuentra Actividad, Servicio o BroadcastReceivers adecuados – Y los instancia si es necesario • Sin solape – Broadcast intents sólo para BroadcastReceivers – startActivity sólo para actividades – Start/bind Service sólo para servicios
  • 47. Components de Intent • Acción: la acción a realizar – ACTION_VIEW, ACTION_EDIT,…. • Datos: sobre los que opera la acción – Expresados en forma de URI • Ejemplos: – ACTION_VIEW: content://contacts/people/1 – ACTION_DIAL: tel://915551234 – ACTION_DIAL: content://contacts/people/2
  • 48. Atributos adicionales • Category: información adicional tipo componente que debe recoger el intent • Type: MIME-TYPE de los datos del intent • Component: componente (clase) que recibirá el Intent – Declarado en AndroidManifest.xml – Si se especifica: Android busca instancia de clase • Si no, Android buscará el más adecuado – Ver IntentResolution para detalles • Extras: pares clave-valor – Específicos de la acción • Flags: específicos del sistema – Definidos en la clase Intent
  • 49. Resolución del Intent • Destinatario explícito – setComponent(componentName): se le envía directamente • Sin destinatario – Hay que incluir suficiente info en el Intent para que Android encuentre candidato adecuado • Sólo se usa: – Action – Data (tanto URI como tipo) – Category – Mediante Intent-Filters
  • 50. Acciones predefinidas ACTION_CALL activity Initiate a phone call. ACTION_EDIT activity Display data for the user to edit. ACTION_MAIN activity Start up as the initial activity of a task, with no data input and no returned output. ACTION_SYNC activity Synchronize data on a server with data on the mobile device. ACTION_BATTERY_LOW * broadcast receiver A warning that the battery is low. ACTION_HEADSET_PLUG * broadcast receiver A headset has been plugged into the device, or unplugged from it. ACTION_SCREEN_ON * broadcast receiver The screen has been turned on. ACTION_TIMEZONE_CHANGED* broadcast receiver The setting for the time zone has changed. …. *: Generados por Android
  • 51. Filtros de Intenciones • Elementos de Actividades, Servicios y BroadcastReceiver – Declarados en AndroidManifest.xml
  • 52. Filtros de Intenciones <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="projects.helloworld" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
  • 53. Difusión de intenciones • Broadcast Intents para notificar a oyentes de determinadas acciones o eventos • Difusión de eventos del sistema – Batería baja – Llamada entrante – … • La aplicación construye el Intent – sendBroadcast(): entrega síncrona – sendOrderedBroadcast(): entrega asíncrona
  • 54. Difusión de Intenciones Intent miIntención= new Intent(ACTION, datos); miIntencion.putExtra(“parametro 1”, valor1); miIntencion.putExtra(“parametro 1”, valor1); sendBroadcast(miIntencion);
  • 55. BroadcastReceiver • void onReceive(Context curCtx, Intent broadcastMsg): Punto de entrada principal • El Broadcast Receiver se considera activo mientras está ejecutando este método – Al finalizar, pasa a inactivo • onReceive: respuesta rápida – El sistema lo marcaría como inactivo • Si requiere mucho tiempo: lanzar Service para realizar el trabajo
  • 56. Implementación import android.context.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class MiReceptorBroadcast extends BroadcastReceiver { public void onReceive (Context context, Intent intent) { // código reacción al intent } }
  • 57. BroadcastReceiver • Escuchan Broadcast Intents • Registrados – Via código o AndroidManifest.xml • Usan IntentFilters para indicar que intenciones esperan • Implementación: – Extender BroadcastReceiver – Sobreescribir onReceive()
  • 58. Ejemplos de Intent, Filters y Difusión
  • 59. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Notificaciones • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 60. Notificaciones al usuario • Algunos sucesos deben notificarse al usuario – Independientemente de lo que se ejecuta – Algunos requieren respuesta del usuario • Ejemplos: batería baja, fichero salvado, barra de progreso, … • Se requieren diferentes tipos de notificación
  • 61. Toast Notification • Mensaje Breves – Tipo pop-up, aparece en la pantalla – No bloqueante: app activa sigue – No requiere interacción con el usuario
  • 62. Status Bar Notification • Icono en la barra de estado y mensaje en la ventana de Notificaciones – Puede lanzar un Intent si el usuario lo selecciona
  • 63. Dialog Notification • Pequeña ventana, delante de actividad activa • Coge el foco – Interacciona con el usuario • Usadas para pequeñas actividades con el usuario tipo “Ok” / “Cancel”
  • 64. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 65. Menús • Componente importante de una aplicación: proporciona una interfaz agradable y familiar al usuario • Acceso a funcionalidad y configuración • Fácil programación en Android
  • 66. Tipos de Menús • Options Menu: aparece al pulsar el botón MENU del dispositivo. Se divide en: – Icon Menu: hasta 6 botones disponibles al pulsar MENU • El único que soporta iconos • Pero no soporta checkboxes o radiobuttons – Expanded Menu: lista vertical de ítems al pulsar + en el Icon Menu • Context Menu: lista flotante que aparece al presionar largo en una View • Submenu: lista flotante, aparece al presionar un ítem del Option Menu o menú contextual – No soporta submenús anidados
  • 67. Definir Menús • Definición en XML – Mejor que programáticamente (se puede) • Separa diseño del interfaz de lógica de control – Añadir recursos en código de aplicación <menu> Crea un Menu, contenedor de ítems de menú. Nodo raíz. Contiene al menos uno de los siguientes elementos. Se puede anidar dentro de <item> <item> Crea un MenuItem, elemento simple de un menú <group> Contenedor no vidisble de <item> Categoriza <item>s Comparten propiedades como estado y visibilidad
  • 68. Ejemplo (Definición) • Fichero game_menu.xml en res/menu/ <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/andr oid"> <item android:id="@+id/new_game" android:icon="@drawable/ic_new_game" android:title="@string/new_game" /> <item android:id="@+id/quit" android:icon="@drawable/ic_quit" android:title="@string/quit" /> </menu>
  • 69. Ejemplo (Definición) <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/andr oid"> <item android:id="@+id/new_game" android:icon="@drawable/ic_new_game" android:title="@string/new_game" /> <item android:id="@+id/quit" android:icon="@drawable/ic_quit" android:title="@string/quit" /> </menu> Recurso ID para manejo en la app Recurso visual Icono para el usuario String visible para el usuario
  • 70. Acceso al menú • Convierte el código XML en un objeto – Mediante MenuInflater.inflate() @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.game_menu, menu); return true; }
  • 71. Crear Option Menu @Override public boolean onOptionsItemSelected(MenuItem item) { // Handle item selection switch (item.getItemId()) { case R.id.new_game: newGame(); return true; case R.id.quit: quit(); return true; default: return super.onOptionsItemSelected(item); } }
  • 72. Cambiar un Menú • Se puede cambiar al menú cuando se abre • onCreateOptionsMenu(): se invoca sólo la primera vez que se abre Options Menu – El sistema guarda y reúsa el Menú hasta que la Actividad se destruye • onPrepareOptionsMenu(): sobreescribir para cambiar el menú – Se obtiene el objeto Menu – Útil para eliminar, añadir o deshabilitar/habilitar ítems del menú • Según el estado de la Actividad • NOTA: no se deben cambiar los ítems dependiendo de la View activa (con foco) – En modo touch, las Views no pueden coger el foco: inapropiado para cambiar menú – Ítems según contexto: usar Context Menu
  • 73. Options Menu programáticamente /* crea los ítems del menú */ public boolean onCreateOptionsMenu(Menu menu) { menu.add(0, MENU_NEW_GAME, 0, “New Game); menu.add(0, MENU_QUIT, 0, “Quit”); return true; } /* actuación de las selecciones */ public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case MENU_NEW_GAME: newGame(); return true; case MENU_QUIT; quit(); return true; } return false; }
  • 74. Crear un Context Menu • Para cualquier View – Normalmente, ListView • Hay que registrar la View – registerForContextMenu() Nota: los ítems de menú contextual no soportan iconos ni atajos de teclado • Para definir aspecto y comportamiento, sobreescribir los métodos (callbacks) de la Actividad – onCreateMenuContext() – onContextItemSelected()
  • 75. Context Menu • onCreateContextMenu() usa context_menu.xml @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.context_menu, menu); }
  • 76. Context Menu public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.edit: editNote(info.id); return true; case R.id.delete: deleteNote(info.id); return true; default: return super.onContextItemSelected(item); } }
  • 77. /* crea los ítems del menú */ public boolean onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); menu.add(0, EDIT_ID, 0, “Edit”); menu.add(0, DELETE_ID, 0, “Delete”); return true; } /* actuación de las selecciones */ public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info= (AdapterContextMenuInfo)item.getMenuInfo() switch (item.getItemId()) { case EDIT_ID: editNote(info.id); return true; case DELETE_ID; deleteNote(info.id); return true; default: return super.onContextItemSelected(item); } } Context Menu programáticamente
  • 78. Submenus • Menú desplegado al seleccionar un ítem de otro menú – Se puede añadir a cualquier menú, excepto un submenú • No se pueden anidar • Útiles para organizar funciones – Agrupándolas lógicamente
  • 79. Ejemplo submenu <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/andr oid"> <item android:id="@+id/file" android:icon="@drawable/file" android:title="@string/file" > <!-- "file" submenu --> <menu"> <item android:id="@+id/new" android:title="@string/new" /> <item android:id="@+id/open" android:title="@string/open" /> </menu> </item> </menu>
  • 80. Ejemplo submenu programáticamente public boolean onCreateOptionsMenu(Menu menu) { boolean result= super.onCreateOptionsMenu(menu); SubMenu fileMenu= menu.addSubMenu(“File”); SubMenu editMenu= menu.addSubMenu(“Edit”); fileMenu.add(“new”); fileMenu.add(“open”); fileMenu.add(“save”); editMenu.add(“undo”); editMenu.add(“redo”); return result; }
  • 81. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 82. Almacenamiento de Datos • SO ofrece SF para compartir datos entre apps • En Android los ficheros son privados por app • La información se comparte mediante ContentProviders
  • 83. Almacenamiento de Datos • Opciones para almacenar datos: • Shared Preferences – Pares clave-valor: datos primitivos privados • Internal Storage – Datos privados en memoria del dispositivo • External Storage – Datos públicos en almacenamiento externo compartido • SQLite Databases – Datos structurados en BD privada • Network Connection – Datos almacenados en un servidor de red
  • 84. Preferencias • Pares clave-valor • Datos primitivos: boolean, float, int, long, string • Datos persistentes aunque maten la actividad • Uso típico: preferencias de aplicación – Colores, fuentes, tamaños, … – Preferible la PreferenceActivity – Guardar datos en onSaveInstance() o onStop()
  • 85. Clase SharedPreferences • SharedPreferences getSharedPreferences(String name, int mode) : se necesitan varios ficheros de preferencias identificados por nombre • SharedPreferences getPreferences(int mode): se necesita sólo un fichero en la Activity – No necesita nombre de fichero
  • 86. Métodos SharedPreferences • Para escribir valores: 1. Llamar edit() para conseguir un SharedPreferences.Editor 2. Añadir valores con métodos como putBoolean() o putString() 3. Almacenar los nuevos valores con commit() • Para leer valores: – Métodos getBoolean() and getString() de SharedPreferences
  • 87. public class Calc extends Activity { public static final String PREFS_NAME = "MyPrefsFile"; @Override protected void onCreate(Bundle state) { super.onCreate(state); . . . // Restore preferences SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); boolean silent = settings.getBoolean("silentMode", false); setSilent(silent); } Ejemplo Preferencias
  • 88. @Override protected void onStop() { super.onStop(); // We need an Editor object to make preference changes // All objects are from android.context.Context SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("silentMode", mSilentMode); // Commit the edits! editor.commit(); } }
  • 89. Ficheros • Son privados de la aplicación – Ni otras aplicaciones ni el usuario • Permisos UNIX • Eliminados al desinstalar la aplicación • Programación similar a otros streams de Java
  • 90. Crear y Escribir Ficheros • public abstract FileOutputStream openFileOutput (String name, int mode) • write() • close()
  • 91. Ficheros: ejemplo String FILENAME = "hello_file"; String string = "hello world!"; FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close();
  • 92. Crear y Leer Ficheros • public abstract FileInputStream openFileInput (String name, int mode) • read() • close() – Ficheros estáticos en tiempo de compilación • Salvar fichero en directorio de proyecto res/raw/ • Abrir con openRawResource(), R.raw.<filename> – Devuelve un InputStream para leer fichero original (no se puede escribir)
  • 93. Ficheros temporales • getCacheDir(): abre ficheros temporales para cachear datos – El sistema puede borrarlos si se queda sin memoria • Pero es responsabilidad del programa borrar dichos ficheros: el sistema podría no borrarlos • Se eliminan al desinstalar la aplicación
  • 94. Ficheros: Métodos útiles • getFilesDir(): Devuelve el path absoluto del directorio de sistema de ficheros donde residen los ficheros internos • getDir(): Crea (o abre, si existe) un directorio en el espacio de almacenamiento interno • deleteFile(): Borra un fichero en almacenamiento interno • fileList(): Devuelve un array de ficheros salvados por la aplicación
  • 95. Almacenamiento externo • Medios de almacenamiento removibles – Externos: Tarjetas SD,… – Internos • Modificables si el usuario permite transferencia de ficheros desde almacenamiento USB – Los ficheros podrían desaparecer si el usuario desconecta el almacenamiento – No hay seguridad de acceso
  • 96. Disponibilidad • getExternalStorageState(): comprueba si el medio de almacenamiento está disponible
  • 97. Comprobación Disponibilidad boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { // Something else is wrong. It may be one of many other states, // but all we need to know is we can neither read nor write mExternalStorageAvailable = mExternalStorageWriteable = false; }
  • 98. Acceso a Medios Externos • Nivel 8 del API: – File getExternalFileDir(String type) • abre fichero externo • type: DIRECTORY_MUSIC, DIRECTORY_RINGTONES, … – null para directorio raíz • Nivel 7 o anterior: – getExternalStorageDirectory() • Datos en /Android/data/<package_name>/files – package_name de Java
  • 99. Ficheros compartidos • Ficheros no específicos de la app: salvarlos en directorios públicos Music/, Pictures/, Ringtones/, – API Nivel 8: getExternalStoragePublicDirectory() • DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES,… • Los crea si no existen – API Nivel 7 o anterior: getExternalStorageDirectory() Music/ Podcast/ Ringtones/ Alarms/
  • 100. Ficheros Caché • API nivel 8: getExternalCacheDir() • API nivel 7 o anterior: getExternalStorageDirectory() – /Android/data/<package_name>/cache
  • 101. Bases de Datos • Soporte completo de BD SQLite • BD accesible desde cualquier clase de la app – Pero no desde fuera • Se almacenan en /data/data/<nombre_paquete>/databases • Clases envoltorios para almacenar información en la BD
  • 102. BD SQLite • Código Abierto • Ligera • Cursor: resultado de las consultas (queries) • Usado en reproductores MP3, iPhone/iPods, … http://www.sqlite.org
  • 103. Manejo BD SQLite • Mecanismo recomendado creación BD SQLite – Crear subclase de SQLiteOpenHelper • Y sobreescribir onCreate()
  • 104. Ejemplo SQLite public class DictionaryOpenHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 2; private static final String DICTIONARY_TABLE_NAME = "dictionary"; private static final String DICTIONARY_TABLE_CREATE = "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" + KEY_WORD + " TEXT, " + KEY_DEFINITION + " TEXT);"; DictionaryOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DICTIONARY_TABLE_CREATE); } }
  • 105. Acceso BD • getWritableDatabase() / getReadableDatabase() – Devuelven una BD para escribir o leer con métodos para operar la BD • SQLiteDatabase.query(): consultas simples • SQLiteQueryBuilder(): consultas complejas • Las consultas devuelven Cursor – Apunta a las filas encontradas en la consulta – Mecanismo para manejar resultados y leer filas y columnas • sqlite3: herramientas para consultar BD, ejecutar comandos SQL, … (incluida en Android SDK)
  • 106. Cursores • Recorren y procesan consultas – moveToFirst: cursor en la primera fila – moveToNext: avanza el cursor – moveToPrevious: retrocede el cursor – moveToPosition: mueve cursor a dicha posición – getPosition: devuelve posición actual del cursor – getCount: cantidad de registros en la consulta – getColumnIndexOrThrow: índice de la columna dada – getColumnName: nombre de la columna por índice – getColumnNames: array con nombres de columnas
  • 108. Conexiones en Red • Cada vez más, se almacenan los datos en servidores externos – Servicios de Google, Yahoo, … • Los siguientes paquetes pueden ser de utilidad: – java.net.* – android.net.*
  • 109. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 110. Content Providers • Mecanismo genérico de compartir datos entre aplicaciones • Android: Predefinidos audio, video, imágenes, contactos,… – Algunos requieren permisos explícitos • Paquete android.provider • Dos posibilidades en app – Crear propio (subclase ContentProvider) – Acceder a uno creado • Mismo tipo de datos y con permisos
  • 111. ContentResolver • Único por contexto de aplicación • Usado para transacciones y consultas a ContentProviders • Al iniciar una consulta, Android identifica el ContentProvider y se asegura de que está ejecutándose • El sistema instancia los ContentProviders – Suele ser única para cada tipo de datos – Y comunican con muchas instancias de ContentResolvers de diferentes aplicaciones ContentResolver cr= getContentResolver();
  • 112. Acceso a ContentProvider • Como las BD, se manejan con Cursor – Con métodos especializados para diferentes tipos de datos • Para acceder a un campo, hay que saber el tipo del contenido • Cada ContentProvider expone un URI público – Como objeto Uri – Pasado a cada método de ContentResolver • content:// android.provider.Contacts.Phones.CONTENT_URI android.provider.Contacts.Photos.CONTENT_URI
  • 113. Consultar ContentProvider • Para consultar un ContentProvider se requiere: – URI que identifica el proveedor – Nombre de los campos de datos a consultar – Tipos de datos de dichos campos • Para consultar un registro en particular, se necesita el ID del mismo content://. . . ./23 Métodos útiles: • ContentUris.withAppendedId() • Uri.withAppendedPath() – Facilitan la concatenación de un ID a un URI
  • 114. Consultas • Cursor ContentResolver.query(…) • Cursor Activity.managedquery(…) – Mismos argumentos – La actividad gestiona el ciclo de vida del Cursor String[] projection = new String[] { “_id”, “number”, ”name” }; Cursor managedCursor = managedQuery(new ContentURI (“content://contacts/phones”), projection, null, null, ”name” + " ASC");
  • 115. En detalle import android.provider.Contacts.People; import android.database.Cursor; // Especificamos columnas deseadas String[] projection = new String[] { People._ID, People._COUNT, People.NAME, People.NUMBER }; // URI base para la tabla de People en el proveedor de Contacts Uri contacts = People.CONTENT_URI; // Gestiona la consulta Cursor managedCursor = managedQuery(contacts, projection, // Qué columnas se devuelven null, // Qué filas se desean (todas) null, // Filtro de selección (ninguno) // Ordenado en orden ascendente // por nombre People.NAME + " ASC");
  • 116. URI • A: prefijo estándar • B: identificador del ContentProvider – Full-qualified class name, minúsculas • C: path que determina qué parte se accede – Cero o más segmentos • D: ID del registro (opcional) <provider android:name=".TransportationProvider" android:authorities="com.example.transportationprovider" . . . >
  • 117. ContentProviders de Android • Browser: bookmarks, historial, búsquedas • CallLog: llamadas entrantes y salientes • ContactsContract: información de contactos – Contacts deprecado • LiveFolder: carpeta especial poblada por un ContentProvider • MediaStore: metadatos de medios disponibles – Internos o externos • SearchRecentSuggestions • Settings: preferencias del dispositivo • SyncStateContract • UserDictionary
  • 118. Implementar un ContentProvider • Los principales métodos a implementar son: – Boolean onCreate(): Invocado al inicializar el proveedor – Cursor query(Uri uri, String[] projection, String selection , String[] selectionArgs, String sortOrder) : devuelve datos al usuario – Uri insert(Uri, ContentValues) inserta datos nuevos en el proveedor – int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) actualiza datos existentes en el proveedor – int delete(Uri uri, String selection, String[] selectionArgs) borra datos del proveedor – String getType(Uri uri) devuelve el tipo MIME de los datos contenidos en el proveedor – … hay muchos más
  • 119. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad y Permisos • Listados de Bibliotecas
  • 120. Seguridad y Permisos • Basada en Kernel Linux – ID único por paquete – Procesos en sandbox • Previene interferencias entre aplicaciones – Excepto con permiso explícito • Permisos a nivel de aplicación – Acceso a recursos: envío SMS, … • Se pueden definir en AndroidManifest
  • 121. Uso de Permisos <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.app.myapp" > <uses-permission android:name="android.permission.RECEIVE_SMS" /> </manifest>
  • 122. Permisos propios • Declararlos en AndroidManifest – Tag: <permission> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.me.app.myapp" > <permission android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY" android:label="@string/permlab_deadlyActivity" android:description="@string/permdesc_deadlyActivity" android:permissionGroup="android.permission-group.COST_MONEY" android:protectionLevel="dangerous" /> </manifest>
  • 123. Ejemplo: Permiso CALL_PHONE <string name="permlab_callPhone">directly call phone numbers</string> <string name="permdesc_callPhone">Allows the application to call phone numbers without your intervention. Malicious applications may cause unexpected calls on your phone bill. Note that this does not allow the application to call emergency numbers.</string>
  • 124. Índice • Introducción • Interfaces de Usuario • Actividades • Servicios • Eventos • Menús • Almacenamiento de Datos • ContentProviders • Seguridad • Listados de Bibliotecas
  • 125. Bibliotecas Android (I) • android.util: utilidades básicas: fecha y hora, números y cadenas, utillería XML • android.os: servicios del S.O. (mensajes, batería, …) • android.graphics: colores, dibujos… • android.text: manejo y reconocimiento de cadenas de texto • android.context: accesso a distintos recursos • android.view: gestión de vistas • android.widget: elementos nativos: listas, botones,…
  • 126. Bibliotecas Android (II) • android.gesture: crear, reconocer , cargar/salvar gestos,… • android.database: gestión de BD • android.webkit: herramientas para navegar por la Web • org.apache.http: componentes HTTP
  • 127. Bibliotecas Android (II) • android.app: contexto de aplicación, actividades, API de servicios • android.provider: acceso a Content Providers • android.telephony;: acceso a teléfono y su uso: llamadas, SMS,… • android.bluetooth: acceso a Bluetooth • android.net: redes, reconocedores, sockets, más que java.net.* • android.media: grabación/reproducción de medios (video, audio, imágenes,…) • android.opengl: motor 3D
  • 128. Bibliotecas Android (III) • android.hardware: – android.hardware.SensorManager: sensor de orientación y acelerómetro – android.hardware.Camera: parámetros de la cámara, start/stop previsualización, fotografías, captura de vídeo,… – android.hardware.GeomagneticField !! • android.location: geolocalización • android.media: MediaPlayer
  • 129. Otras bibliotecas • FreeType • SGL • Libc • SQLite • SSL
  • 130. Bibliotecas Google • http://code.google.com/intl/es/android/add-ons/google- apis/ • Paquete com.google.android.maps.MapView – Subclase de ViewGroup • El complemento para las API de Google incluye: – biblioteca externa de Google Maps para Android 1.5 (nivel de API 3), – imagen del sistema Android 1.5 completamente compatible (con la biblioteca de Google Maps insertada), – Aplicación de Android de ejemplo denominada MapsDemo, – Doc completa – Registro servicio Google Maps: obtener Maps API Key