Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados
-
Upload
gabriel-huecas -
Category
Technology
-
view
28.359 -
download
0
description
Transcript of Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados
![Page 1: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/1.jpg)
Desarrollo de Aplicaciones Móviles en Android:
Temas AvanzadosGabriel Huecas
Universidad Politécnica de Madrid
23 de Noviembre de 2010
![Page 2: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/2.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 3: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/3.jpg)
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
![Page 4: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/4.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 5: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/5.jpg)
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
![Page 6: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/6.jpg)
![Page 7: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/7.jpg)
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
![Page 8: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/8.jpg)
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>
![Page 9: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/9.jpg)
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);
![Page 10: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/10.jpg)
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 visualcon lógica de programa
![Page 11: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/11.jpg)
ViewGroups
• View contenedora de Views
• Clase base para layouts
• Jerarquía de objetos visuales
![Page 12: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/12.jpg)
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
![Page 13: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/13.jpg)
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
![Page 14: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/14.jpg)
WidgetsSpinnerFormulario
![Page 15: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/15.jpg)
Widgets
Autocompletar Google Map
![Page 16: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/16.jpg)
Layout
• Gestores de elementos visuales
– Heredan de ViewGroup
• Controlan posiciones absolutas o relativas de las Views hijas
– Se pueden anidar
• Android incluyen gran variedad
![Page 17: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/17.jpg)
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
![Page 18: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/18.jpg)
Layout
LinearLayout RelativeLayout TableLayout
![Page 19: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/19.jpg)
Layout
GridView TabView ListView
![Page 20: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/20.jpg)
Jerarquía Layout
java.lang.Object↳ android.view.View↳ android.view.ViewGroup
Known Direct SubclassesAbsoluteLayout, AdapterView<T extends Adapter>, FrameLayout,
LinearLayout, RelativeLayout, SlidingDrawer
AbsoluteLayout This class is deprecated. Use FrameLayout, RelativeLayoutor a custom layout instead.
![Page 21: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/21.jpg)
Jerarquía Layout
Known Indirect SubclassesAbsListView, 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
![Page 22: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/22.jpg)
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
![Page 23: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/23.jpg)
Adapters
ArrayAdapter<String> myAdapter;
myAdapter= new ArrayAdapter<String>(this, layoutID, myStringArray);
myListView.setAdapter(myAdapter);
![Page 24: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/24.jpg)
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, AbsSpinnerAbsListView Base class that can be used to implement virtualized lists of items.AbsSpinner An abstract base class for spinner widgets.
Known Indirect SubclassesExpandableListView, Gallery, GridView, ListView, Spinner
![Page 25: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/25.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 26: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/26.jpg)
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)
![Page 27: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/27.jpg)
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(…)
![Page 28: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/28.jpg)
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
![Page 29: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/29.jpg)
Ejemplo ANR
Ejemplo FC
![Page 30: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/30.jpg)
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
![Page 31: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/31.jpg)
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
![Page 32: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/32.jpg)
![Page 33: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/33.jpg)
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.
![Page 34: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/34.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 35: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/35.jpg)
Servicios
• Ejecutados en segundo plano, sin GUI
• Más prioridad que Activity
– LocationManager
– MediaController
– NotificationManager
![Page 36: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/36.jpg)
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
![Page 37: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/37.jpg)
Ciclo de Vida de los Servicios
• Detener un servicio
– Context.stopService(): la actividad detiene el servicio
– StopSelf(): el servicio se detiene el mismo
![Page 38: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/38.jpg)
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
![Page 39: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/39.jpg)
![Page 40: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/40.jpg)
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
![Page 41: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/41.jpg)
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
– …
![Page 42: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/42.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 43: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/43.jpg)
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
![Page 44: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/44.jpg)
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
![Page 45: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/45.jpg)
Mecanismos de Entrega
• Invocación de ActividadContext.startActivity() : lanza actividadActivity.startActivityForResult() : pide a una actividad que haga algo
nuevoTambié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 activoContext.bindService() : establece comunicación con un servicio
Lo inicia si no estaba en ejecución
• Anuncios a BroadcastReceiversObjetos Intent se pasan a los métodos de broadcast
Context.sendBroadcast()Context.sendOrderedBroadcast(),Context.sendStickyBroadcast()
Existen muchos tipos de anunciantes en el sistema
![Page 46: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/46.jpg)
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
![Page 47: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/47.jpg)
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
![Page 48: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/48.jpg)
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
![Page 49: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/49.jpg)
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
![Page 50: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/50.jpg)
Acciones predefinidasACTION_CALL activity Initiate a phone call.
ACTION_EDIT activity Display data for the user to edit.
ACTION_MAIN activityStart 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
![Page 51: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/51.jpg)
Filtros de Intenciones
• Elementos de Actividades, Servicios y BroadcastReceiver
– Declarados en AndroidManifest.xml
![Page 52: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/52.jpg)
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>
![Page 53: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/53.jpg)
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
![Page 54: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/54.jpg)
Difusión de Intenciones
Intent miIntención=
new Intent(ACTION, datos);
miIntencion.putExtra(“parametro 1”, valor1);
miIntencion.putExtra(“parametro 1”, valor1);
sendBroadcast(miIntencion);
![Page 55: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/55.jpg)
BroadcastReceiver
• void onReceive(Context curCtx, IntentbroadcastMsg): 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
![Page 56: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/56.jpg)
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
}
}
![Page 57: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/57.jpg)
BroadcastReceiver
• Escuchan Broadcast Intents
• Registrados
– Via código o AndroidManifest.xml
• Usan IntentFilters para indicar que intenciones esperan
• Implementación:
– Extender BroadcastReceiver
– Sobreescribir onReceive()
![Page 58: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/58.jpg)
Ejemplos de Intent, Filters yDifusión
![Page 59: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/59.jpg)
Índice• Introducción
• Interfaces de Usuario
• Actividades
• Servicios
• Eventos
• Notificaciones
• Menús
• Almacenamiento de Datos
• ContentProviders
• Seguridad
• Listados de Bibliotecas
![Page 60: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/60.jpg)
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
![Page 61: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/61.jpg)
Toast Notification
• Mensaje Breves
– Tipo pop-up, aparece en la pantalla
– No bloqueante: app activa sigue
– No requiere interacción con el usuario
![Page 62: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/62.jpg)
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
![Page 63: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/63.jpg)
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”
![Page 64: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/64.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 65: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/65.jpg)
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
![Page 66: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/66.jpg)
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
![Page 67: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/67.jpg)
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>sComparten propiedades como estado y visibilidad
![Page 68: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/68.jpg)
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>
![Page 69: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/69.jpg)
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
![Page 70: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/70.jpg)
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;
}
![Page 71: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/71.jpg)
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);
}
}
![Page 72: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/72.jpg)
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
![Page 73: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/73.jpg)
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;
}
![Page 74: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/74.jpg)
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, sobreescribirlos métodos (callbacks) de la Actividad– onCreateMenuContext()
– onContextItemSelected()
![Page 75: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/75.jpg)
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);
}
![Page 76: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/76.jpg)
Context Menupublic 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);
}
}
![Page 77: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/77.jpg)
/* 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
![Page 78: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/78.jpg)
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
![Page 79: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/79.jpg)
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>
![Page 80: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/80.jpg)
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;
}
![Page 81: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/81.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 82: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/82.jpg)
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
![Page 83: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/83.jpg)
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
![Page 84: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/84.jpg)
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()
![Page 85: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/85.jpg)
Clase SharedPreferences
• SharedPreferencesgetSharedPreferences(String
name, int mode) : se necesitan varios ficheros de preferencias identificados por nombre
• SharedPreferencesgetPreferences(int mode): se necesita sólo un fichero en la Activity– No necesita nombre de fichero
![Page 86: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/86.jpg)
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
![Page 87: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/87.jpg)
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
![Page 88: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/88.jpg)
@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();
}
}
![Page 89: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/89.jpg)
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
![Page 90: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/90.jpg)
Crear y Escribir Ficheros
• public abstract
FileOutputStream openFileOutput
(String name, int mode)
• write()
• close()
![Page 91: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/91.jpg)
Ficheros: ejemplo
String FILENAME = "hello_file";
String string = "hello world!";
FileOutputStream fos =
openFileOutput(FILENAME, Context.MODE_PRIVATE);
fos.write(string.getBytes());
fos.close();
![Page 92: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/92.jpg)
Crear y Leer Ficheros
• public abstract FileInputStreamopenFileInput (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)
![Page 93: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/93.jpg)
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
![Page 94: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/94.jpg)
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
![Page 95: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/95.jpg)
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
![Page 96: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/96.jpg)
Disponibilidad
• getExternalStorageState(): comprueba si el medio de almacenamiento está disponible
![Page 97: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/97.jpg)
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;
}
![Page 98: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/98.jpg)
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
![Page 99: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/99.jpg)
Ficheros compartidos
• Ficheros no específicos de la app: salvarlos en directorios públicosMusic/, 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/
![Page 100: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/100.jpg)
Ficheros Caché
• API nivel 8: getExternalCacheDir()
• API nivel 7 o anterior: getExternalStorageDirectory()
– /Android/data/<package_name>/cache
![Page 101: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/101.jpg)
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
![Page 102: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/102.jpg)
BD SQLite
• Código Abierto
• Ligera
• Cursor: resultado de las consultas (queries)
• Usado en reproductores MP3, iPhone/iPods, …
http://www.sqlite.org
![Page 103: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/103.jpg)
Manejo BD SQLite
• Mecanismo recomendado creación BD SQLite
– Crear subclase de SQLiteOpenHelper
• Y sobreescribir onCreate()
![Page 104: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/104.jpg)
Ejemplo SQLitepublic 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);
}
}
![Page 105: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/105.jpg)
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)
![Page 106: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/106.jpg)
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
![Page 107: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/107.jpg)
Ejemplo de Cursores
![Page 108: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/108.jpg)
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.*
![Page 109: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/109.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 110: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/110.jpg)
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
![Page 111: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/111.jpg)
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();
![Page 112: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/112.jpg)
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
![Page 113: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/113.jpg)
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
![Page 114: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/114.jpg)
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");
![Page 115: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/115.jpg)
En detalleimport 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");
![Page 116: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/116.jpg)
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"
. . . >
![Page 117: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/117.jpg)
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
![Page 118: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/118.jpg)
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) borradatos del proveedor
– String getType(Uri uri) devuelve el tipo MIME de los datoscontenidos en el proveedor
– … hay muchos más
![Page 119: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/119.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad y Permisos• Listados de Bibliotecas
![Page 120: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/120.jpg)
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
![Page 121: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/121.jpg)
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>
![Page 122: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/122.jpg)
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>
![Page 123: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/123.jpg)
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>
![Page 124: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/124.jpg)
Índice
• Introducción• Interfaces de Usuario• Actividades• Servicios• Eventos• Menús• Almacenamiento de Datos• ContentProviders• Seguridad• Listados de Bibliotecas
![Page 125: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/125.jpg)
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,…
![Page 126: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/126.jpg)
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
![Page 127: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/127.jpg)
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
![Page 128: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/128.jpg)
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
![Page 129: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/129.jpg)
Otras bibliotecas
• FreeType
• SGL
• Libc
• SQLite
• SSL
![Page 130: Desarrollo de Aplicaciones Moviles en Android: Temas Avanzados](https://reader034.fdocuments.net/reader034/viewer/2022052307/555c3b47d8b42a0b038b4a21/html5/thumbnails/130.jpg)
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