03desarrolloanandroid-avanzado-101118185740-phpapp02

download 03desarrolloanandroid-avanzado-101118185740-phpapp02

of 130

Transcript of 03desarrolloanandroid-avanzado-101118185740-phpapp02

Desarrollo de Aplicaciones Mviles en Android: Temas AvanzadosGabriel Huecas Universidad Politcnica de Madrid23 de Noviembre de 2010

ndice Introduccin Interfaces de Usuario Actividades Servicios Eventos Mens Almacenamiento de Datos ContentProviders Seguridad Listados de Bibliotecas

Elementos Views: interfaz grfica visual Activity: presentacin de la aplicacin (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: almacn compartido de datos

ndice Introduccin Interfaces de Usuario Actividades Servicios Eventos Mens Almacenamiento de Datos ContentProviders Seguridad Listados de Bibliotecas

Interfaces de Usuario View y ViewGroup View: Punto de interaccin con el usuario ViewGroup: agrupacin lgica 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 bsica de GUI Todas las clases visuales heredan de View rea rectangular de pantalla Sabe dibujarse Gestiona eventos

Especificacin XML Desacopla detalles visuales de lgica de control

Por cdigo: desaconsejado

View en XML

View en XMLpublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } ... // buscamos el TextView por el ID TextView myTextView= (TextView)findViewByID(R.id.myTextView);

Creacin de View por cdigopublic void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); TextView myTextView= new TextView(this); setContentView(myTextView); myTextView.setText(Hello, World!); }

Desaconsejado: mezcla de diseo visual con lgica de programa

ViewGroups View contenedora de Views Clase base para layouts Jerarqua de objetos visuales

Widget View con funcionalidad (compleja) Creacin de Widget Se crea una View Se aade gestin de eventos, componentes visuales,

Se pueden extender widgets de Android

Widgets TextView: etiqueta de slo lectura EditText: campo de texto modificable ListView: crea y gestiona lista de Views Spinner: control compuesto: TextView + ListView, para seleccin de tem Button: botn CheckBox: botn de dos estados RadioButton: seleccin exclusiva entre varios tems

WidgetsFormulario Spinner

WidgetsAutocompletar 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 ms simple Cada View hija se aade en la esquina sup. izq. tapando a la anterior

LinearLayout: Views alineadas (hor. / ver.) RelativeLayout: nuevas Views en posicin relativa a las anteriores TableLayout: grid de filas/columnas AbsoluteLayout: Views con coordenadas absolutas

Layout

LinearLayout

RelativeLayout

TableLayout

Layout

GridView

TabView

ListView

Jerarqua Layoutjava.lang.Object android.view.View android.view.ViewGroup Known Direct Subclasses AbsoluteLayout, AdapterView, FrameLayout, LinearLayout, RelativeLayout, SlidingDrawer AbsoluteLayout This class is deprecated. Use FrameLayout, RelativeLayout or a custom layout instead.

Jerarqua 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 ms comunes CursorAdapter: vista de base de datos ArrayAdapter: array arbitrario

Adapters

ArrayAdapter myAdapter;myAdapter= new ArrayAdapter(this, layoutID, myStringArray); myListView.setAdapter(myAdapter);

Adapterandroid.widget.Adapter Known Indirect Subclasses ArrayAdapter, BaseAdapter, CursorAdapter, HeaderViewListAdapter, ListAdapter, ResourceCursorAdapter, SimpleAdapter, SimpleCursorAdapter, SpinnerAdapter, WrapperListAdapter java.lang.Object android.view.View android.view.ViewGroup android.widget.AdapterView

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 Subclasses ExpandableListView, Gallery, GridView, ListView, Spinner

ndice Introduccin Interfaces de Usuario Actividades Servicios Eventos Mens Almacenamiento de Datos ContentProviders Seguridad Listados de Bibliotecas

Activity Hereda de android.app.Activity Casi siempre contiene una GUI Responsabilidad limitada (alta cohesin, bajo acoplamiento) Una aplicacin 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)

Invocacin 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 mtodo de regreso onActivityResult() de la principal Se crea con startActivityForResult()

ActivityManager Controla ciclo de vida de cada actividad Controla la pila de actividades Monitoriza Deteccin 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 ANREjemplo FC

Ciclo de Vida de las Actividades Bsicamente, 3 estados Activa: tiene el foco, visible, encima de la pila Pausada: visible, sin foco (otra activa) Parada: no visible, eliminable

Cambio de estado Transicin notificada mediante mtodos de Actividad sobreescribirlos

Mtodos de Estado de Actividad void onCreate(): creacin de actividad o restauracin desde parada void onStart(): la actividad es visible para el usuario void onResume(): la actividad parcialmente visible void onPause(): otra actividad activa, esta an 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(). Podra no disponder de foco (usuario interactuando con actividades superpuestas). Pueden ser llamados mltiples 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 Introduccin Interfaces de Usuario Actividades Servicios Eventos Mens Almacenamiento de Datos ContentProviders Seguridad Listados de Bibliotecas

Servicios Ejecutados en segundo plano, sin GUI Ms 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 desconexin

Comienzo del Servicio Context.startService(): ejecuta servicio y queda a la espera Context.bindService(): algn 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 Despus de haberse desconectado

Mtodos de Estado de Servicio void onCreate(): el servicio ha sido creado void onStart(Intent intent): el servicio ha sido iniciado El Intent podra contener informacin adicional para el servicio

void onDestroy(): finaliza el servicio

NotificationManager Comunicacin de eventos al usuario Invisibles, sin interfaz grfica

Tipos Icono persistente en barra de estado Encendido y apagado de LED Vibracin Audio Iluminacin

ndice Introduccin Interfaces de Usuario Actividades Servicios Eventos Mens Almacenamiento de Datos ContentProviders Seguridad Listados de Bibliotecas

Intenciones Intent: mecanismo basado en paso de mensajes para (intentar) realizar una accin Inicia Actividades y Servicios o difunde mensajes Desacoplamiento componentes Innecesario conocer implementaciones Late binding en ejecucin

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 descripcin abstracta de la accin invocada o el evento que ha ocurrido

Mecanismos de Entrega Invocacin de ActividadContext.startActivity() : lanza actividad Activity.startActivityForResult() : pide a una actividad que haga algo nuevo Tambin: Activity.setResult() : callback de vuelta para obtener la inforamacin

Invocacin de Servicio:Context.startService() : inicia el servicio o nueva peticin a servicio activo Context.bindService() : establece comunicacin con un servicio Lo inicia si no estaba en ejecucin

Anuncios a BroadcastReceiversObjetos Intent se pasan a los mtodos de broadcastContext.sendBroadcast() Context.sendOrderedBroadcast(), Context.sendStickyBroadcast()

Existen muchos tipos de anunciantes en el sistema

Gestin de Intents Android encuentra Actividad, Servicio o BroadcastReceivers adecuados Y los instancia si es necesario

Sin solape Broadcast intents slo para BroadcastReceivers startActivity slo para actividades Start/bind Service slo para servicios

Components de Intent Accin: la accin a realizar ACTION_VIEW, ACTION_EDIT,.

Datos: sobre los que opera la accin 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: informacin 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 ms adecuado Ver IntentResolution para detalles

Extras: pares clave-valor Especficos de la accin

Flags: especficos del sistema Definidos en la clase Intent

Resolucin del Intent Destinatario explcito setComponent(componentName): se le enva directamente

Sin destinatario Hay que incluir suficiente info en el Intent para que Android encuentre candidato adecuado Slo se usa: Action Data (tanto URI como tipo) Category

Mediante Intent-Filters

Acciones predefinidasACTION_CALL ACTION_EDIT ACTION_MAIN activity activity activity Initiate a phone call. Display data for the user to edit. Start up as the initial activity of a task, with no data input and no returned output. Synchronize data on a server with data on the mobile device.

ACTION_SYNC ACTION_BATTERY_LOW * ACTION_HEADSET_PLUG * ACTION_SCREEN_ON *

activity

broadcast receiver A warning that the battery is low. broadcast receiver A headset has been plugged into the device, or unplugged from it. The setting for the time zone has changed.

broadcast receiver The screen has been turned on.

ACTION_TIMEZONE_CHANGED* broadcast receiver .

*:

Generados por Android

Filtros de Intenciones Elementos de Actividades, Servicios y BroadcastReceiver Declarados en AndroidManifest.xml

Filtros de Intenciones

Difusin de intenciones Broadcast Intents para notificar a oyentes de determinadas acciones o eventos Difusin de eventos del sistema Batera baja Llamada entrante

La aplicacin construye el Intent sendBroadcast(): entrega sncrona sendOrderedBroadcast(): entrega asncrona

Difusin de Intenciones

Intent miIntencin= 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 mtodo Al finalizar, pasa a inactivo

onReceive: respuesta rpida El sistema lo marcara como inactivo

Si requiere mucho tiempo: lanzar Service para realizar el trabajo

Implementacinimport android.context.BroadcastReceiver; import android.content.Context; import android.content.Intent;

public class MiReceptorBroadcast extends BroadcastReceiver { public void onReceive (Context context, Intent intent) { // cdigo reaccin al intent } }

BroadcastReceiver Escuchan Broadcast Intents Registrados Via cdigo o AndroidManifest.xml

Usan IntentFilters para indicar que intenciones esperan Implementacin: Extender BroadcastReceiver Sobreescribir onReceive()

Ejemplos de Intent, Filters y Difusin

ndice Introduccin Interfaces de Usuario Actividades Servicios Eventos Notificaciones Mens 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: batera baja, fichero salvado, barra de progreso, Se requieren diferentes tipos de notificacin

Toast Notification Mensaje Breves Tipo pop-up, aparece en la pantalla No bloqueante: app activa sigue No requiere interaccin 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 Pequea ventana, delante de actividad activa Coge el foco Interacciona con el usuario

Usadas para pequeas actividades con el usuario tipo Ok / Cancel

ndice Introduccin Interfaces de Usuario Actividades Servicios Eventos Mens Almacenamiento de Datos ContentProviders Seguridad Listados de Bibliotecas

Mens Componente importante de una aplicacin: proporciona una interfaz agradable y familiar al usuario Acceso a funcionalidad y configuracin Fcil programacin en Android

Tipos de Mens Options Menu: aparece al pulsar el botn 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 submens anidados

Definir Mens Definicin en XML Mejor que programticamente (se puede) Separa diseo del interfaz de lgica de control

Aadir recursos en cdigo de aplicacin Crea un Menu, contenedor de tems de men. Nodo raz. Contiene al menos uno de los siguientes elementos. Se puede anidar dentro de

Crea un MenuItem, elemento simple de un men Contenedor no vidisble de Categoriza s Comparten propiedades como estado y visibilidad

Ejemplo (Definicin) Fichero game_menu.xml en res/menu/

Ejemplo (Definicin)Recurso ID para manejo en la app Recurso visual Icono para el usuario

String visible para elusuario

Acceso al men Convierte el cdigo 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 slo la primera vez que se abre Options Menu El sistema guarda y resa el Men hasta que la Actividad se destruye

onPrepareOptionsMenu(): sobreescribir para cambiar el men Se obtiene el objeto Menu til para eliminar, aadir o deshabilitar/habilitar tems del men Segn 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 segn contexto: usar Context Menu

Options Menu programticamente/* 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; } /* actuacin 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 mtodos (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 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); } }

Context Menu programticamente/* 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; } /* actuacin 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); } }

Submenus Men desplegado al seleccionar un tem de otro men Se puede aadir a cualquier men, excepto un submen No se pueden anidar

tiles para organizar funciones Agrupndolas lgicamente

Ejemplo submenu