Android master class

2,173 views

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,173
On SlideShare
0
From Embeds
0
Number of Embeds
4
Actions
Shares
0
Downloads
130
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Android master class

  1. 1. Android Master Class<br />Introducción al desarrollo de aplicaciones en Android<br />
  2. 2. Prefacio<br />Sobrenosotros<br />Sobre el curso<br />SobreCatdroid<br />
  3. 3. Temario<br />Introducción<br />Eclipse y el SDK<br />Hello World<br />El ciclo de vida<br />Recursos<br />Layouts y Views<br />Interacción con el usuario<br />Menús<br />Preferencias<br />Intents<br />Depuración<br />El Market<br />
  4. 4. 1. Introducción a Android<br />
  5. 5. Introducción<br />Smartphones<br />Android en cifras<br />Historia de Android<br />Funcionamento interno<br />
  6. 6. Smartphones<br />Teléfono<br />Rádio<br />MP3<br />GPS<br />Cámera<br />Internet<br />Apps<br />
  7. 7. Android en cifras<br />#1 en activaciones (350.000 al día)<br />23% de la cuota de mercado (finales 2010)<br />250.000+ apps en el market<br />100+ modelos de teléfono<br />40+ modelos de tablet<br />
  8. 8. Android en cifras (cont.)<br />Mòbils al món, segons Gartner (Abril 2011)<br />
  9. 9. Android en cifras (cont.)<br />
  10. 10. ¿Qué es Android?<br />Conjunto de software para dispositivos móviles que incluye:<br />Sistema operativo<br />Middleware<br />Aplicaciones<br />Open source<br />Impulsado por Google<br />Basado en Linux y Java<br />
  11. 11. Historia<br />Julio 2005: Google compra Android Inc.<br />Noviembre 2007: Nace la OHA<br />Febrero 2009: Release de 1.1<br />Abril 2009: Release de 1.5 (Cupcake)<br />Octubre 2009: Release de 2.0 (Eclair)<br />Deciembre 2010: Release de 2.3 (Gingerbread)<br />
  12. 12. Versiones<br />API level<br />3 (Cupcake)<br />7 (Eclair)<br />9 (Gingerbread)<br />
  13. 13. Características<br />Sistema base es Linux<br />Máquina virtual Dalvik<br />Librerías de sistema<br />WebKit<br />SQLite<br />Media codecs<br />Comunicaciones (GSM, bluetooth, wifi)<br />Cámara, GPS, sensores<br />Applicationframework<br />
  14. 14. Arquitectura<br />
  15. 15. Aplicaciones<br />Java (.apk)<br />Se ejecutan en un espacio aislado (instancia de Dalvik)<br />No hay jerarquía<br />Se comunican a través de Intents<br />El market no es imprescindible<br />
  16. 16. Más información<br />Web oficial Android<br />http://www.android.com/<br />http://developer.android.com/index.html<br />Wikipedia<br />http://es.wikipedia.org/wiki/Android<br />CatDroid<br />http://catdroid.org/<br />
  17. 17. 2. El entorno de desarrollo<br />
  18. 18. Elementosnecesarios<br />Eclipse<br />Android SDK<br />Eclipse ADT plugin + ADV Manager<br />
  19. 19. Instalación<br />Preparar el equipo (Instalar Eclipse)<br />Descargar el SDK<br />Instalar el plugin ADT para Eclipse<br />Instalarplataformas y APIs<br />http://developer.android.com/sdk/installing.html<br />
  20. 20. Catclipse<br />Descargar y abrir<br />Ultimo update: BoletsBarruers<br />Disponiblepara Windows y Mac, próximamentepara Linux<br />
  21. 21. 3. Holamundo<br />
  22. 22. Creación de un nuevoproyecto<br />
  23. 23. Elementos del proyectonuevo<br />Activity<br />Manifest<br />Resources<br />
  24. 24. Activities<br />Una Activity es una pantalla de la interfaz<br />Las aplicaciones constan de una o más Activity<br />Cada Activity es reponsable de guardar su estado<br />Una Activity se encarga de:<br />Crear una ventana donde colocar la interfaz <br />Gestionar la interfaz<br />Responder a los eventos (onClick, onLongClick, etc).<br />
  25. 25. Una Activity básica<br />
  26. 26. Manifest<br />El Manifest es el archivo donde la aplicación le dice al sistema que elementos requiere para funcionar<br />Siempre debe llamarse AndroidManifest.xml y estar en la raíz del proyecto<br />Entre otras cosas contiene:<br />Atributos de la aplicación y metadatos<br />La declaración de actividades y otros componentes<br />Librerías externas<br />Permisos<br />Se puede editar via GUI o editando el XML<br />
  27. 27. Manifest inicial<br />
  28. 28. Versión de la aplicación<br />VersionCode es importante para el Market<br />VersionName es importante para el usuario y/o nosotros<br />
  29. 29. Definición de la actividad<br />Definimos las actividades y sus intent-filter<br />
  30. 30. Versión del SDK<br />minSdkVersion, maxSdkVersion y targetSdkVersion<br />
  31. 31. Permisos de la aplicación<br />Avisan al usuario de las acciones que realizará la aplicación<br />Listados en: http://developer.android.com/reference/android/Manifest.permission.html<br />
  32. 32. Recursos<br />Un recurso es un elemento a utilizar durante la ejecución de la aplicación<br />Existen diferentes tipos de recursos:<br />Layouts<br />Imágenes<br />Cadenas de texto<br />Sonidos<br />Colores<br />Temas<br />Animaciones<br />etc<br />
  33. 33. Recursos<br />Se almacenan en la carpeta resources<br />Cada tipo de recurso tiene va en una carpeta específica<br />Utilizan sufijos para determinar que recursos utilizar según contexto (tamaño de pantalla, idioma, orientación, etc.)<br />Nombre en mínusculas<br />La extensión se ignora (mismo nombre, diferente extensión se considera duplicado)<br />
  34. 34. La clase R<br />La clase R es generada y mantenida por el sistema y no debe ser modificada<br />Contiene un identificador (int) único por cada recurso <br />Podemos hacer referencia a un recurso en código por R.<tipo>.<nombre>. Ej.: R.layout.main<br />
  35. 35. Nombrar recursos en XML<br />Para referirnos a un recurso utilizamos la siguiente sintaxis:<br />@<tipo de recurso>/<nombre del recurso><br />Por ejemplo<br />@string/app_name<br />Para definir un nombre utilizamos:<br />@+<tipo de recurso>/<nombre de recurso><br />
  36. 36. Ejemplo<br />
  37. 37. 4. El ciclo de vida<br />
  38. 38. Estados de una actividad<br />El sistema gestiona las actividades como una pila<br />Una actividad tiene cuatro estados:<br />Activa: la actividad está en primer plano y tiene el focus(enfoque de usuario). Se encuentra en lo alto de la pila.<br />En pausa: la actividad es visible, pero no tiene el focus. Ej: hay un diálogo sobre ella con el focusretenido.<br />Detenida: La actividad está tapada por otra aplicación. Mantiene sus datos.<br />Destruida: Una actividad detenida ha sido destruida para liberar memoria y ha perdido sus datos. Hay que recrearla completamente.<br />
  39. 39. Ciclo de vida de una actividad<br />
  40. 40. Métodos<br />
  41. 41. Otrografo<br />
  42. 42. Ejercicio (I)<br />Claseandroid.util.Log<br />Log.<método>(String tag, String message)<br />Métodos:<br />e – error<br />d – debug<br />i – info<br />v – verbose<br />w – warning<br />privatestaticfinalString TAG ="MyActivity";<br />Log.v(TAG,"index="+ i);<br />
  43. 43. Ejercicio(II)<br />@Override…<br />protectedvoidonDestroy()<br />protectedvoidonPause() <br />protectedvoidonRestart()<br />protectedvoidonResume() <br />protectedvoidonStart()<br />protectedvoidonStop() <br />
  44. 44. 5. Recursos<br />
  45. 45. Imágenes<br />Carpetadrawables<br />Trestamaños: ldpi, mdpi, hdpi<br />
  46. 46. Iconos<br />Simplificados<br />Realístapero no fotorealista<br />Imágen frontal<br />Iluminación superior<br />
  47. 47. Formatos de imágen<br />Recomendación:<br />PNG-24 paraimágenes con transparencias<br />JPG paraimágenes sin transparencias<br />
  48. 48. Archivos de cadenas<br /><?xml version="1.0" encoding="utf-8"?><br /><resources><br /><string name="resource name1">cadena</string><br /><string name="resource name2">cadena</string><br /><string name="resource name3">cadena</string><br />….<br /></resources><br />
  49. 49. Arrays de cadenas<br /><?xml version="1.0" encoding="utf-8"?><br /><resources><br /> <string-array name="SearchTimeFrameArray"><br /> <item>@string/SearchTimeFrameAll</item><br /> <item>@string/SearchTimeFrame24h</item><br /> <item>@string/SearchTimeFrame48h</item><br /> <item>@string/SearchTimeFrameWeek</item><br />…<br /><Spinner android:entries="@array/SearchTimeFrameArray" android:prompt="@string/SearchTimeFrame" android:id="@+id/SearchTime"/><br />
  50. 50. Colores<br />Format: #rgb | #rrggbb | #rrggbbaa<br /><?xml version="1.0" encoding="utf-8"?><br /><resources><br /> <color name="background">#FFF</color><br /> <color name="text">#000</color><br /> <color name="hbackground">#eb5200</color><br /> <color name="htext">#fff</color><br /> <color name="dimtext">#444</color><br /></resources><br />
  51. 51. Uso de recursosdesdecódigo<br />El objeto R.tipo.idsiempredevuelve un entero<br />Para recuperar el recurso en cuestiónutilizamos:<br />getResources().get<tipo>(Integer id)<br />O<br />getResources().getIdentifier(String nombre, String tipo)<br />
  52. 52. 7. Interacción con el usuario<br />
  53. 53. Eventos<br />Los layouts generan eventos de tipo onAcción<br />Los eventos son acciones que interrumpen el flujo del código<br />Se generan a partir de acciones externas<br />Para implementar un método onAcción una clase debe implementar la interfaz onAcciónListener<br />Para adjudicar la clase que implmementa el «escuchador» utilizamos el método setOnAcciónListener de la vista<br />
  54. 54. Ejemplo con dos clases<br />publicclassalHacerClickimplementsOnClickListener{<br /> @Override<br />publicvoidonClick(View v){<br />v.setText("Clickaqui!");<br /> }<br />}<br />...<br />publicclassMainextendsActivity {<br /> ...<br />boton.setOnClickListener(new alHacerClick());<br /> ...<br />}<br />
  55. 55. Ejemplo con la actividad<br />publicclassMainextendsActivityimplements<br />OnClickListener{<br /> @Override<br />publicvoidonClick(View v){<br />v.setText("Clickaqui!");<br />}<br />...<br />boton.setOnClickListener(this);<br /> ...<br />}<br />
  56. 56. Múltiples eventos en la misma clase<br />Si tenemos a nuestra clase escuchando más de un evento OnClick, el parametro v nos permite averiguar que view ha disparado el evento. <br />Podemos comparar v.getId() con un recurso R.id <br />@Override<br />publicvoidonClick(View v){<br />switch(v) {<br /> case R.id.btnOk:<br /> …<br /> case R.id.btnCancel:<br />…<br /> }<br />}<br />(v.getId()==R.Id.btnOk)<br />
  57. 57. Un brindis con el usuario<br />La clase toast permite lanzar mensajes rápidos<br />Toast.makeText(Context context, intresId, intduration)<br />ToastmakeText(Context context, CharSequence text, intduration)<br />Duration: Toast. LENGTH_LONG | Toast.LENGTH_SHORT<br />
  58. 58. Diálogos. setButtons<br />AlertDialog: puede gestionar entre 0 y 3 respuestas<br />AlertDialog.Builderbuilder=newAlertDialog.Builder(this);builder.setMessage("Are yousureyouwanttoexit?")       .setCancelable(false)       .setPositiveButton("Yes",newDialogInterface.OnClickListener(){           publicvoidonClick(DialogInterfacedialog,int id){                MyActivity.this.finish();           }       })       .setNegativeButton("No",newDialogInterface.OnClickListener(){           publicvoidonClick(DialogInterfacedialog,int id){                dialog.cancel();           }       });AlertDialogalert=builder.create();<br />
  59. 59. Diálogos. Una lista.<br />finalCharSequence[]items={"Red","Green","Blue"};AlertDialog.Builderbuilder=newAlertDialog.Builder(this);builder.setTitle("Pick a color");builder.setItems(items,newDialogInterface.OnClickListener(){    publicvoidonClick(DialogInterfacedialog,intitem){        Toast.makeText(getApplicationContext(),items[item],Toast.LENGTH_SHORT).show();    }});AlertDialogalert=builder.create();<br />
  60. 60. Diálogos. Checkboxes<br />finalCharSequence[]items={"Red","Green","Blue"};AlertDialog.Builderbuilder=newAlertDialog.Builder(this);builder.setTitle("Pick a color");builder.setSingleChoiceItems(items,-1,newDialogInterface.OnClickListener(){    publicvoidonClick(DialogInterfacedialog,intitem){        Toast.makeText(getApplicationContext(),items[item],Toast.LENGTH_SHORT).show();    }});AlertDialogalert=builder.create();<br />
  61. 61. Crear un diálogo personalizado<br />Hemos creado el layoutcustom_dialog<br />ContextmContext=getApplicationContext();Dialogdialog=newDialog(mContext);dialog.setContentView(R.layout.custom_dialog);dialog.setTitle("CustomDialog");TextViewtext=(TextView)dialog.findViewById(R.id.text);text.setText("Hello, thisis a customdialog!");ImageViewimage=(ImageView)dialog.findViewById(R.id.image);image.setImageResource(R.drawable.android);<br />dialog.show();<br />
  62. 62. Menús<br />
  63. 63. Menús. Archivos de menú<br /><?xmlversion="1.0" encoding="utf-8"?><br /><menuxmlns:android="http://schemas.android.com/apk/res/android"><br />…<br /><itemandroid:id="@+id/settings" android:title="@string/settings_label"<br />android:alphabeticShortcut="@string/settings_shortcut" /><br />…<br /></menu><br />
  64. 64. Abrir el menú<br />Sobrecargamos el método onCreateOptionsMenu<br />publicbooleanonCreateOptionsMenu(Menumenu)<br />Llamamos a GetMenuInflater<br />MenuInflaterinflater = getMenuInflater();<br />Llamamos al método inflate del MenuInflater<br />MenuInflaterinflater = getMenuInflater();<br />
  65. 65. Procesar las opciones de menú<br />Sobrecargamos el método onOptionsItemSelected<br />@Override<br />publicbooleanonOptionsItemSelected(MenuItemitem) {<br />switch(item.getItemId()) {<br /> case R.id.settings:<br /> ...<br />}<br />
  66. 66. 9. Preferencias<br />
  67. 67. Archivos de preferencias<br />Layoutespecializado que permite crear pantallas de configuración de forma rápida.<?xml version="1.0" encoding="utf-8"?><br /><PreferenceScreenxmlns:android="http://schemas.android.com/apk/res/android"><br /><CheckBoxPreferenceandroid:key="music"<br />android:title="@string/music_title" android:summary="@string/music_summary"<br />android:defaultValue="true" /><br /><CheckBoxPreferenceandroid:key="hints"<br />android:title="@string/hints_title" android:summary="@string/hints_summary"<br />android:defaultValue="true"/><br /></PreferenceScreen><br />
  68. 68. Mostrar archivo de preferencias<br />public class Prefs extends PreferenceActivity {<br />protectedvoidonCreate(BundlesavedInstanceState)<br /> {super.onCreate(savedInstanceState);<br />addPreferencesFromResource(R.xml.settings);<br /> }<br />}<br />En el manifest:<br /><activityandroid:name=".Prefs" android:label="@string/settings_title" /><br />
  69. 69. Leer y escribir preferencias<br />PreferenceManager.getDefaultSharedPreferences(context)….<br />getTipo(Nombre, Predeterminado);<br />setTipo(Nombre, Predeterminado);<br />
  70. 70. Gestionar opciones<br />@Override<br />publicbooleanonPreferenceClick(Preferencepreference){<br />if(preference.getKey() == "About"){<br />Dialogdialog = new Dialog(this);<br />dialog.setContentView(R.layout.about);<br />dialog.setTitle(getResources().getString(R.string.OptionAbout));<br />dialog.setCancelable(true);<br />dialog.show();<br /> }<br />if(preference.getKey() == "DoLogin"){<br />findPreference("User").setEnabled(<br />PreferenceManager.getDefaultSharedPreferences(this).getBoolean("DoLogin", false));<br />indPreference("Password").setEnabled(<br />PreferenceManager.getDefaultSharedPreferences(this).getBoolean("DoLogin", false));<br /> }<br />returnfalse;<br />}<br />
  71. 71. 10. Intents<br />
  72. 72. Intents<br />Android se basa en multitud de pequeños componentes<br />Estos componentes se comunican viaIntents<br />Mensajes utilizados para notificar a las aplicaciones de eventos<br />Cambios de Hardware. Ej: tarjeta SD insertada.<br />Recepción de datos. Ej: llegada de un sms<br />Eventos de la apliación. Ej: se ha lanzado la aplicación<br />Etc<br />Es posible crear nuestros propio intents<br />
  73. 73. Partes de un Intent<br />Partes básicas<br />La acción: una constante que indica la acción que se lanza. Ej.: VIEW_ACTION, EDIT_ACTION<br />Los datos: uri indicando el recurso asociado. Ej.: content://contacts/people/1<br />Partes opcionales<br />Una categoría: agrupa el tipo de Intent<br />Un tipo MIME: indica el tipo de recurso si no concemos una uri<br />Un componente: la clase que debe tener el receptor. Obvia las otras propiedades, pero es más frágil.<br />Extras: un Bundle con información extra que el receptor va a necesitar<br />
  74. 74. Ejemplos de Intent<br />ANSWER_ACTION<br />CALL_ACTION<br />DELETE_ACTION<br />DIAL_ACTION<br />EDIT_ACTION<br />FACTORY_TEST_ACTION<br />GET_CONTENT_ACTION<br />INSERT_ACTION<br />MAIN_ACTION: Inicio de aplicación<br />PICK_ACTION: permitir a otras apps elegir contenido de la tuya<br />VIEW_CONTENT: para ver contenido<br />EDIT_CONTENT: para editar contenido<br />
  75. 75. Categorias de Intent<br />ALTERNATIVE_CATEGORY<br />BROWSABLE_CATEGORY<br />DEFAULT_CATEGORY<br />GADGET_CATEGORY<br />HOME_CATEGORY<br />LAUNCHER_CATEGORY<br />PREFERENCE_CATEGORY<br />SELECTED_ALTERNATIVE_CATEGORY<br />TAB_CATEGORY<br />TEST_CATEGORY<br />
  76. 76. Llegando a la actividad adecuada<br />Una actividad debe cumplir tres reglas para responder un Intent<br />La actividad debe soportar la acción especificada<br />La actividad debe soportar el tipo MIME si lo hay<br />La actividad debe soportar TODAS las categorias nombradas en el Intent<br />Uso de Intent-Filter en el manifest<br />
  77. 77. Ejemplo<br />
  78. 78. Iniciar otra Activity<br />Uso del método startActivity(Intent) o startActivityForResult (Intent, int)<br />Podemos pasar parametros con Intent.putExtra(int, <type>)<br />Recibirlos con getIntent().getExtras().get<Type>(clave);<br />
  79. 79. Devolver valores de una Activity<br />Establecemos el valor a devolver con setResult(intresultCode) o setResult (intresultCode, Intent data)<br />La actividad «llamadora» implementa el método onActivityResult(intrequestCode, intresultCode, Intent data)<br />resultCode puede ser uno de estos valores:<br />RESULT_CANCELED<br />RESULT_OK<br />RESULT_FIRST_USER<br />

×