03desarrolloanandroid-avanzado-101118185740-phpapp02
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