You are on page 1of 130

Desarrollo de Aplicaciones Mviles en Android: Temas Avanzados

Gabriel Huecas Universidad Politcnica de Madrid


23 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
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id=@+id/myTextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>

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

Creacin de View por cdigo


public 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

Widgets
Formulario Spinner

Widgets
Autocompletar Google Map

Layout
Gestores de elementos visuales
Heredan de ViewGroup

Controlan posiciones absolutas o relativas de las Views hijas


Se pueden anidar

Android incluyen gran variedad

Layouts
FrameLayout: el 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 Layout
java.lang.Object android.view.View android.view.ViewGroup Known Direct Subclasses AbsoluteLayout, AdapterView<T extends Adapter>, FrameLayout, LinearLayout, RelativeLayout, SlidingDrawer AbsoluteLayout This class is deprecated. Use FrameLayout, RelativeLayout or a custom layout instead.

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<String> myAdapter;
myAdapter= new ArrayAdapter<String>(this, layoutID, myStringArray); myListView.setAdapter(myAdapter);

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

Known Direct Subclasses AbsListView, AbsSpinner


AbsListView Base class that can be used to implement virtualized lists of items. AbsSpinner An abstract base class for spinner widgets.

Known Indirect Subclasses ExpandableListView, Gallery, GridView, ListView, Spinner

ndice
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 ANR
Ejemplo 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 Actividad
Context.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 BroadcastReceivers
Objetos Intent se pasan a los mtodos de broadcast
Context.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 predefinidas
ACTION_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
<?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>

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

Implementacin
import 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 <menu> Crea un Menu, contenedor de tems de men.
Nodo raz. Contiene al menos uno de los siguientes elementos. Se puede anidar dentro de <item>

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

Ejemplo (Definicin)
Fichero game_menu.xml en res/menu/
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/andr oid"> <item android:id="@+id/new_game" android:icon="@drawable/ic_new_game" android:title="@string/new_game" /> <item android:id="@+id/quit" android:icon="@drawable/ic_quit" android:title="@string/quit" /> </menu>

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

<?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" />String visible </menu> para el
usuario

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 Menu
public boolean onContextItemSelected(MenuItem item) { AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); switch (item.getItemId()) { case R.id.edit: editNote(info.id); return true; case R.id.delete: deleteNote(info.id); return true; default: return super.onContextItemSelected(item); } }

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
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/andr oid"> <item android:id="@+id/file" android:icon="@drawable/file" android:title="@string/file" > <!-- "file" submenu --> <menu"> <item android:id="@+id/new" android:title="@string/new" /> <item android:id="@+id/open" android:title="@string/open" /> </menu> </item> </menu>

Ejemplo submenu programticamente


public boolean onCreateOptionsMenu(Menu menu) { boolean result= super.onCreateOptionsMenu(menu); SubMenu fileMenu= menu.addSubMenu(File); SubMenu editMenu= menu.addSubMenu(Edit); fileMenu.add(new); fileMenu.add(open); fileMenu.add(save); editMenu.add(undo); editMenu.add(redo); return result; }

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

Almacenamiento de Datos
SO ofrece SF para compartir datos entre apps En Android los ficheros son privados por app La informacin se comparte mediante ContentProviders

Almacenamiento de Datos
Opciones para almacenar datos: Shared Preferences
Pares clave-valor: datos primitivos privados

Internal Storage
Datos privados en memoria del dispositivo

External Storage
Datos pblicos en almacenamiento externo compartido

SQLite Databases
Datos structurados en BD privada

Network Connection
Datos almacenados en un servidor de red

Preferencias
Pares clave-valor Datos primitivos: boolean, float, int, long, string Datos persistentes aunque maten la actividad Uso tpico: preferencias de aplicacin
Colores, fuentes, tamaos, Preferible la PreferenceActivity Guardar datos en onSaveInstance() o onStop()

Clase SharedPreferences
SharedPreferences getSharedPreferences(String name, int mode) : se necesitan varios ficheros de preferencias identificados por nombre SharedPreferences getPreferences(int mode): se necesita slo un fichero en la Activity
No necesita nombre de fichero

Mtodos SharedPreferences
Para escribir valores:
1. Llamar edit() para conseguir un SharedPreferences.Editor 2. Aadir valores con mtodos como putBoolean() o putString() 3. Almacenar los nuevos valores con commit()

Para leer valores:


Mtodos getBoolean() and getString() de SharedPreferences

Ejemplo Preferencias
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); }

@Override protected void onStop() { super.onStop(); // We need an Editor object to make preference changes // All objects are from android.context.Context SharedPreferences settings = getSharedPreferences(PREFS_NAME, 0); SharedPreferences.Editor editor = settings.edit(); editor.putBoolean("silentMode", mSilentMode);

// Commit the edits! editor.commit();


} }

Ficheros
Son privados de la aplicacin
Ni otras aplicaciones ni el usuario
Permisos UNIX

Eliminados al desinstalar la aplicacin Programacin similar a otros streams de Java

Crear y Escribir Ficheros


public abstract FileOutputStream openFileOutput (String name, int mode) write() close()

Ficheros: ejemplo

String FILENAME = "hello_file"; String string = "hello world!"; FileOutputStream fos = openFileOutput(FILENAME, Context.MODE_PRIVATE); fos.write(string.getBytes()); fos.close();

Crear y Leer Ficheros


public abstract FileInputStream openFileInput (String name, int mode) read() close()
Ficheros estticos en tiempo de compilacin
Salvar fichero en directorio de proyecto res/raw/ Abrir con openRawResource(), R.raw.<filename>
Devuelve un InputStream para leer fichero original (no se puede escribir)

Ficheros temporales
getCacheDir(): abre ficheros temporales para cachear datos
El sistema puede borrarlos si se queda sin memoria
Pero es responsabilidad del programa borrar dichos ficheros: el sistema podra no borrarlos

Se eliminan al desinstalar la aplicacin

Ficheros: Mtodos 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 aplicacin

Almacenamiento externo
Medios de almacenamiento removibles
Externos: Tarjetas SD, Internos

Modificables si el usuario permite transferencia de ficheros desde almacenamiento USB


Los ficheros podran desaparecer si el usuario desconecta el almacenamiento No hay seguridad de acceso

Disponibilidad
getExternalStorageState(): comprueba si el medio de almacenamiento est disponible

Comprobacin Disponibilidad
boolean mExternalStorageAvailable = false; boolean mExternalStorageWriteable = false; String state = Environment.getExternalStorageState(); if (Environment.MEDIA_MOUNTED.equals(state)) { // We can read and write the media mExternalStorageAvailable = mExternalStorageWriteable = true; } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { // We can only read the media mExternalStorageAvailable = true; mExternalStorageWriteable = false; } else { // Something else is wrong. It may be one of many other states, // but all we need to know is we can neither read nor write mExternalStorageAvailable = mExternalStorageWriteable = false; }

Acceso a Medios Externos


Nivel 8 del API:
File getExternalFileDir(String type)
abre fichero externo type: DIRECTORY_MUSIC, DIRECTORY_RINGTONES,
null para directorio raz

Nivel 7 o anterior:
getExternalStorageDirectory()
Datos en /Android/data/<package_name>/files
package_name de Java

Ficheros compartidos
Ficheros no especficos de la app: salvarlos en directorios pblicos
Music/, Pictures/, Ringtones/, API Nivel 8: getExternalStoragePublicDirectory()
DIRECTORY_MUSIC, DIRECTORY_PICTURES, DIRECTORY_RINGTONES, Los crea si no existen

API Nivel 7 o anterior: getExternalStorageDirectory()


Music/ Podcast/ Ringtones/ Alarms/

Ficheros Cach
API nivel 8: getExternalCacheDir() API nivel 7 o anterior: getExternalStorageDirectory()
/Android/data/<package_name>/cache

Bases de Datos
Soporte completo de BD SQLite BD accesible desde cualquier clase de la app
Pero no desde fuera

Se almacenan en /data/data/<nombre_paquete>/databases Clases envoltorios para almacenar informacin en la BD

BD SQLite
Cdigo Abierto Ligera Cursor: resultado de las consultas (queries) Usado en reproductores MP3, iPhone/iPods, http://www.sqlite.org

Manejo BD SQLite
Mecanismo recomendado creacin BD SQLite
Crear subclase de SQLiteOpenHelper
Y sobreescribir onCreate()

Ejemplo SQLite
public class DictionaryOpenHelper extends SQLiteOpenHelper { private static final int DATABASE_VERSION = 2; private static final String DICTIONARY_TABLE_NAME = "dictionary"; private static final String DICTIONARY_TABLE_CREATE = "CREATE TABLE " + DICTIONARY_TABLE_NAME + " (" + KEY_WORD + " TEXT, " + KEY_DEFINITION + " TEXT);";
DictionaryOpenHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase db) { db.execSQL(DICTIONARY_TABLE_CREATE); } }

Acceso BD
getWritableDatabase() / getReadableDatabase()
Devuelven una BD para escribir o leer con mtodos para operar la BD

SQLiteDatabase.query(): consultas simples SQLiteQueryBuilder(): consultas complejas Las consultas devuelven Cursor
Apunta a las filas encontradas en la consulta Mecanismo para manejar resultados y leer filas y columnas

sqlite3: herramientas para consultar BD, ejecutar comandos SQL, (incluida en Android SDK)

Cursores
Recorren y procesan consultas
moveToFirst: cursor en la primera fila moveToNext: avanza el cursor moveToPrevious: retrocede el cursor moveToPosition: mueve cursor a dicha posicin getPosition: devuelve posicin actual del cursor getCount: cantidad de registros en la consulta getColumnIndexOrThrow: ndice de la columna dada getColumnName: nombre de la columna por ndice getColumnNames: array con nombres de columnas

Ejemplo de Cursores

Conexiones en Red
Cada vez ms, se almacenan los datos en servidores externos
Servicios de Google, Yahoo,

Los siguientes paquetes pueden ser de utilidad:


java.net.* android.net.*

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

Content Providers
Mecanismo genrico de compartir datos entre aplicaciones Android: Predefinidos audio, video, imgenes, contactos,
Algunos requieren permisos explcitos

Paquete android.provider Dos posibilidades en app


Crear propio (subclase ContentProvider) Acceder a uno creado
Mismo tipo de datos y con permisos

ContentResolver
nico por contexto de aplicacin
ContentResolver cr= getContentResolver();

Usado para transacciones y consultas a ContentProviders Al iniciar una consulta, Android identifica el ContentProvider y se asegura de que est ejecutndose El sistema instancia los ContentProviders
Suele ser nica para cada tipo de datos Y comunican con muchas instancias de ContentResolvers de diferentes aplicaciones

Acceso a ContentProvider
Como las BD, se manejan con Cursor
Con mtodos especializados para diferentes tipos de datos
Para acceder a un campo, hay que saber el tipo del contenido

Cada ContentProvider expone un URI pblico


Como objeto Uri Pasado a cada mtodo de ContentResolver
content://
android.provider.Contacts.Phones.CONTENT_URI android.provider.Contacts.Photos.CONTENT_URI

Consultar ContentProvider
Para consultar un ContentProvider se requiere:
URI que identifica el proveedor Nombre de los campos de datos a consultar Tipos de datos de dichos campos

Para consultar un registro en particular, se necesita el ID del mismo


content://. . . ./23

Mtodos tiles:
ContentUris.withAppendedId() Uri.withAppendedPath()
Facilitan la concatenacin de un ID a un URI

Consultas
Cursor ContentResolver.query() Cursor Activity.managedquery()
Mismos argumentos La actividad gestiona el ciclo de vida del Cursor
String[] projection = new String[] { _id, number, name }; Cursor managedCursor = managedQuery(new ContentURI (content://contacts/phones), projection, null, null, name + " ASC");

En detalle
import android.provider.Contacts.People; import android.database.Cursor; // Especificamos columnas deseadas String[] projection = new String[] { People._ID, People._COUNT, People.NAME, People.NUMBER }; // URI base para la tabla de People en el proveedor de Contacts Uri contacts = People.CONTENT_URI;

// Gestiona la consulta Cursor managedCursor = managedQuery(contacts, projection, // Qu columnas se devuelven null, // Qu filas se desean (todas) null, // Filtro de seleccin (ninguno) // Ordenado en orden ascendente // por nombre People.NAME + " ASC");

URI
A: prefijo estndar B: identificador del ContentProvider
Full-qualified class name, minsculas

C: path que determina qu parte se accede


Cero o ms segmentos

D: ID del registro (opcional)


<provider android:name=".TransportationProvider" android:authorities="com.example.transportationprovider" . . . >

ContentProviders de Android
Browser: bookmarks, historial, bsquedas CallLog: llamadas entrantes y salientes ContactsContract: informacin de contactos
Contacts deprecado

LiveFolder: carpeta especial poblada por un ContentProvider MediaStore: metadatos de medios disponibles
Internos o externos

SearchRecentSuggestions Settings: preferencias del dispositivo SyncStateContract UserDictionary

Implementar un ContentProvider
Los principales mtodos a implementar son:
Boolean onCreate(): Invocado al inicializar el proveedor Cursor query(Uri uri, String[] projection, String selection , String[] selectionArgs, String sortOrder) : devuelve datos al usuario Uri insert(Uri, ContentValues) inserta datos nuevos en el proveedor int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) actualiza datos existentes en el proveedor int delete(Uri uri, String selection, String[] selectionArgs) borra datos del proveedor String getType(Uri uri) devuelve el tipo MIME de los datos contenidos en el proveedor hay muchos ms

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

Seguridad y Permisos
Basada en Kernel Linux
ID nico por paquete Procesos en sandbox
Previene interferencias entre aplicaciones
Excepto con permiso explcito

Permisos a nivel de aplicacin


Acceso a recursos: envo SMS,

Se pueden definir en AndroidManifest

Uso de Permisos
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.android.app.myapp" > <uses-permission android:name="android.permission.RECEIVE_SMS" /> </manifest>

Permisos propios
Declararlos en AndroidManifest
Tag: <permission>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.me.app.myapp" > <permission android:name="com.me.app.myapp.permission.DEADLY_ACTIVITY" android:label="@string/permlab_deadlyActivity" android:description="@string/permdesc_deadlyActivity" android:permissionGroup="android.permission-group.COST_MONEY" android:protectionLevel="dangerous" /> </manifest>

Ejemplo: Permiso CALL_PHONE


<string name="permlab_callPhone">directly call phone numbers</string> <string name="permdesc_callPhone">Allows the application to call phone numbers without your intervention. Malicious applications may cause unexpected calls on your phone bill. Note that this does not allow the application to call emergency numbers.</string>

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

Bibliotecas Android (I)


android.util: utilidades bsicas: fecha y hora, nmeros y cadenas, utillera XML android.os: servicios del S.O. (mensajes, batera, ) android.graphics: colores, dibujos android.text: manejo y reconocimiento de cadenas de texto android.context: accesso a distintos recursos android.view: gestin de vistas android.widget: elementos nativos: listas, botones,

Bibliotecas Android (II)


android.gesture: crear, reconocer , cargar/salvar gestos, android.database: gestin de BD android.webkit: herramientas para navegar por la Web org.apache.http: componentes HTTP

Bibliotecas Android (II)


android.app: contexto de aplicacin, actividades, API de servicios android.provider: acceso a Content Providers android.telephony;: acceso a telfono y su uso: llamadas, SMS, android.bluetooth: acceso a Bluetooth android.net: redes, reconocedores, sockets, ms que java.net.* android.media: grabacin/reproduccin de medios (video, audio, imgenes,) android.opengl: motor 3D

Bibliotecas Android (III)


android.hardware:
android.hardware.SensorManager: sensor de orientacin y acelermetro android.hardware.Camera: parmetros de la cmara, start/stop previsualizacin, fotografas, captura de vdeo, android.hardware.GeomagneticField !!

android.location: geolocalizacin android.media: MediaPlayer

Otras bibliotecas
FreeType SGL Libc SQLite SSL

Bibliotecas Google
http://code.google.com/intl/es/android/add-ons/googleapis/ 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), Aplicacin de Android de ejemplo denominada MapsDemo, Doc completa Registro servicio Google Maps: obtener Maps API Key

You might also like