Servicios de la plataforma Android · 2013. 3. 22. · compatibilidad y servicios. Experto en...
Transcript of Servicios de la plataforma Android · 2013. 3. 22. · compatibilidad y servicios. Experto en...
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
© 2012-2013 Depto. Ciencia de la Computación e IA
Servicios de la plataforma Android
Sesión 1: Librerías de compatibilidad y servicios
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Puntos a tratar• Compatibilidad de versiones• Fragmentos• Loaders• Librería de compatibilidad• Librería de servicios de Google Play
2
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Compatibilidad de versiones• A mayor versión utilizada por nuestras aplicaciones• Mayores funcionalidades y facilidades• Menor compatibilidad
• Se especifican dos versiones
• Podemos utilizar de forma opcional funcionalidades avanzadas
• Algunas características no pueden ser utilizadas opcionalmente• Por ejemplo los fragmentos
3
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { // Utilizar características de Android 3.0 (Honeycomb)}
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Fragmentos• Característica introducida en Android 3.0 (Honeycomb)• Orientada a la introducción de tablets
• Forma recomendada de estructurar la interfaz• Nos permiten construir la interfaz de forma modular• Una actividad puede mostrar varios fragmentos• Según el tipo de dispositivo se puede variar la disposición
4
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Creación de fragmentos• Se crean heredando de Fragment• Debemos definir el método onCreateView donde contruimos la
interfaz• Normalmente la construimos a partir de un layout XML
• No es una actividad, pero puede que necesitemos tener acceso a la actividad contenedora
• Existen fragmentos especializados• ListFragment, DialogFragment, PreferencesFragment
5
public class DetalleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(R.layout.fragmento, container, false); }}
Button boton = (Button)getActivity().findViewById(R.id.boton);
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Ciclo de vida de los fragmentos
6
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Añadir el fragmento a la actividad• Los fragmentos siempre deben estar dentro de una actividad• Existen dos formas de añadirlos:
• Estática• Se añaden en el layout XML• No pueden ser modificados en tiempo de ejecución• Varios fragmentos al mismo tiempo en pantalla (tablets)
• Dinámica• Se añaden desde el código de la actividad• Podemos hacer transiciones entre fragmentos• Útil para dispositivos en los que no se pueden mostrar todos en la
misma pantalla
7
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Fragments estáticos• Se definen en el layout XML de la actividad
8
http://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/android
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Fragments dinámicos• Definimos en el layout de la actividad un marco vacío
• Si el marco existe, añadimos el fragmento al crear la actividad
9
public class MainActivity extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.news_articles); if (findViewById(R.id.fragment_container) != null) { if (savedInstanceState != null) { return; } PrincipalFragment ppalFragment = new PrincipalFragment(); ppalFragment.setArguments(getIntent().getExtras()); getFragmentManager().beginTransaction() .add(R.id.fragment_container, ppalFragment).commit(); } }}
Comprobamos si existe el contenedor
Si venimos de una instancia anterior no hace falta volver a construir
Mostramos el fragmento con FragmentManager
http://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/android
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Transiciones entre fragmentos• En caso de haber añadido el fragmento de forma dinámica,
podemos hacer transiciones a otro fragmento
10
DetalleFragment detalleFragment = new DetalleFragment(); // Pasamos parametros al nuevo fragmentoBundle args = new Bundle();args.putInt(PARAM_POSICION, posicionSeleccionada);detalleFragment.setArguments(args); FragmentTransaction transaction = getFragmentManager() .beginTransaction(); transaction.replace(R.id.fragment_container, detalleFragment);transaction.addToBackStack(null); transaction.commit();
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Comunicación entre fragmentos• Siempre se hará a través de la actividad contenedora• Definimos un callback en uno de los fragmentos
11
public class PrincipalFragment extends ListFragment { OnItemSelectedListener mCallback; public interface OnItemSelectedListener { public void onItemSelected(int position); } @Override public void onAttach(Activity activity) { super.onAttach(activity); try { mCallback = (OnItemSelectedListener) activity; } catch (ClassCastException e) { throw new ClassCastException(activity.toString() + " debe implementar OnItemSelectedListener"); } } ...}
Comprueba que la actividad implemente la interfaz
La actividad debe implementar esta interfaz
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Gestión de la comunicación• En la actividad implementamos la comunicación en el listener
12
public static class MainActivity extends Activity implements PrincipalFragment.OnItemSelectedListener { ... public void onItemSelected(int position) { DetalleFragment detalleFragment = (DetalleFragment) getFragmentManager().findFragmentById(R.id.detalle_fragment); if (detalleFragment != null) { detalleFragment.setDetalleItem(position); } else { detalleFragment = new DetalleFragment(); Bundle args = new Bundle(); args.putInt(PARAM_POSICION, position); detalleFragment.setArguments(args); FragmentTransaction transaction = getFragmentManager().beginTransaction(); transaction.replace(R.id.fragment_container, detalleFragment); transaction.addToBackStack(null); transaction.commit(); } }}
Tipo estático
Tipo dinámico
Comprobamos si el fragmento está en pantalla
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Creación de diálogos• La forma recomendada de crear diálogos es con fragmentos• Se crean mediante fragmentos de tipo DialogFragment• Se puede especificar el título de la ventana del diálogo
• Tiene un método show para mostrarlos
13
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.dialog, container); getDialog().setTitle("Título"); return view;}
FragmentManager manager = getFragmentManager();MiDialogFragment dialog = new MiDialogFragment();dialog.setArguments(bundle);dialog.show(manager, "fragment_dialog");
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Loaders• Se trata de otra característica introducida en Android 3.0• Gestiona la carga de datos por parte de actividades/fragmentos• Normalmente carga datos de proveedores de contenidos o
servicios web• Inicia el proceso de carga si no está ya en marcha• Si detecta un cambio en los datos, los vuelve a recuperar
• Lo iniciamos normalmente en onCreate
• También podemos solicitar reiniciar la carga
• Nuestra clase debe implementar LoaderManager.LoaderCallbacks para gestionar los datos proporcionados por el loader
14
getLoaderManager().initLoader(0, null, this);
getLoaderManager().restartLoader(0, null, this);
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Métodos a definir en el callback• Al implementar el callback se debe especificar el tipo de datos a
utilizar• Utilizamos genéricos
• Los métodos que debemos definir son los siguientes
15
public class MiListFragment extends ListFragment implements LoaderManager.LoaderCallbacks { ... public Loader onCreateLoader(int id, Bundle args) { ... } public void onLoadFinished(Loader loader, Cursor data) { ... } public void onLoaderReset(Loader loader) { ... } }
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Callback del loader• Debemos indicar cómo construir el objeto Loader
• También debemos definir qué hacer cuando obtengamos datos
• Y por último, la forma de reiniciar el contenido
16
public Loader onCreateLoader(int id, Bundle args) { return new CursorLoader(getActivity(), baseUri, proyeccion, seleccion, args, orden);}
public void onLoadFinished(Loader loader, Cursor data) { mAdapter.swapCursor(data);}
public void onLoaderReset(Loader loader) { mAdapter.swapCursor(null);}
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Loader personalizado• Podemos crear nuestro propio tipo de loader• Normalmente lo hacemos con una subclase de AsyncTaskLoader• Debemos implementar el proceso de carga de forma similar a
una async task
17
static class MiLoader extends AsyncTaskLoader { Tipo mDatos = null; public MiLoader(Context context) { super(context); } @Override public Tipo loadInBackground() { return cargarDatos(); }
...}
Descarga los datos en background
Especificamos el tipo de los datos a obtener
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Otros métodos de AsyncTaskLoader
18
static class MiLoader extends AsyncTaskLoader { Tipo mDatos = null; ... @Override protected void onStartLoading() { super.onStartLoading(); if(mDatos != null) { deliverResult(mDatos); } else { forceLoad(); } } @Override public void deliverResult(Tipo data) { mDatos = data; super.deliverResult(data); } @Override protected void onStopLoading() { super.onStopLoading(); cancelLoad(); } @Override protected void onReset() { super.onReset(); onStopLoading(); mDatos = null; }}
Comprobamos si tenemos los datos ya descargados o si hay que cargarlos
“Entregamos” los datos, y los retenemos
Cancelamos la descarga
Borramos los datos descargados
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Uso del loader• Podemos utilizar el loader definido desde nuestro callback
19
public class MiFragmento implements LoaderManager.LoaderCallbacks { ... public Loader onCreateLoader(int id, Bundle args) { return new MiLoader(getActivity()); } public void onLoadFinished(Loader loader, Tipo data) { mAdapter.clear(); for(Item item: data) { mAdapter.add(item); } } public void onLoaderReset(Loader loader) { mAdapter.clear(); } }
Introduce los datos cargados en el adaptador
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Librería de compatibilidad• Fragmentos y loaders son características importantes• Es importante seguir dando soporte a dispositivos antiguos• Existen librerías de compatibilidad• Incorporan estas características a dispositivos a partir de 1.6
20
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Uso de la librería de compatibilidad• Copiamos la librería de compatibilidad al directorio libs
• Utilizamos los imports de la librería de compatibilidad
• La actividad debe heredar de FragmentActivity
• Usamos métodos alternativos para obtener los managers
21
$ANDROID_SDK/extras/android/support/v4/android-‐support-‐v4.jar
import android.support.v4.app.Fragment;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.support.v4.app.LoaderManager;
public class MainActivity extends FragmentActivity { ...}
FragmentManager manager = getSupportFragmentManager();LoaderManager manager = getSupportLoaderManager();
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Librerías de servicios• Podemos también añadir librerías para acceso a servicios • Los servicios de Google se añaden mediante librería externa• Aporta mayor flexibilidad para suministrar actualizaciones• Debemos descargar la librería desde Google Play• Soporta Android 2.2 y superiores
• Para desarrollar un proyecto con ella debemos• Descargar la librería de servicios Google Play con SDK Manager• Importar la librería (Existing Android Code into Workspace)
• Añadir como dependencia de nuestro proyectoProperties > Android > Library > Add ...
22
$ANDROID_SDK/extras/google/google_play_services/
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Configuración de los permisos• Añadir permisos para los servicios
23
Sustituimos es.ua.jtech por el paquete de nuestra aplicación
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Clave de desarrollador y OpenGLES 2.0• Google Maps v2 necesita OpenGLES 2.0• Se debe indicar en el manifest
• También debemos indicar nuestra clave de desarrollador
• La obtendremos de la siguiente dirección
24
https://developers.google.com/maps/documentation/android/start#the_google_maps_api_key
https://developers.google.com/maps/documentation/android/starthttps://developers.google.com/maps/documentation/android/start
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
Integración del mapa• Podemos añadirlo al layout como fragmento
• También podemos utilizar la librería de compatibilidad
25
http://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/androidhttp://schemas.android.com/apk/res/android
-
Experto en Desarrollo de Aplicaciones para Dispositivos Móviles
Servicios Android © 2012-2013 Depto. Ciencia de la Computación e IA Compatibilidad y servicios
¿Preguntas...?
26