<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1116377334484481265</id><updated>2011-11-27T15:22:08.914-08:00</updated><title type='text'>Androide</title><subtitle type='html'>Este es un blog (en español) dedicado a Google Android</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>40</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-4203381450225612704</id><published>2008-12-17T18:18:00.000-08:00</published><updated>2007-12-20T07:26:47.015-08:00</updated><title type='text'>Declaración - Disclaimer</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Declaración&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;Google, The Open Handset Alliance y Sun Microsystems, Inc. &lt;strong&gt;no endosan&lt;/strong&gt; este blog ni autorizan el desarrollo de mis proyectos personales. De hecho, este blog es el resultado de mis intereses personales y &lt;strong&gt;no ha sido endosado ni autorizado&lt;/strong&gt; por ninguna entidad comercial.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;Neither&lt;/strong&gt; Google,The Open Handset Alliance &lt;strong&gt;nor&lt;/strong&gt; Sun Microsystems, Inc. have endorsed this page or authorized the development of my personal projects. In fact, this blog is the result of my personal interests and it &lt;strong&gt;has not been endorsed&lt;/strong&gt; &lt;strong&gt;or authorized&lt;/strong&gt; by any commercial entity.&lt;br /&gt;&lt;br /&gt;En este Blog voy a publicar mi experiencia desarrollando software para Android® platform utilizando Java®. Además, publicaré mis notas personales sobre algunos documentos de la documentación de Android®.&lt;br /&gt;&lt;br /&gt;In this Blog I'm going to publish my experience developing software for Android® platform using Java®. Also, I'll publish my personal notes about some documents of Android's documentation.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-4203381450225612704?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/4203381450225612704/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=4203381450225612704' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/4203381450225612704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/4203381450225612704'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/declaracion-disclaimer.html' title='Declaración - Disclaimer'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-198564444330919811</id><published>2008-12-16T09:44:00.000-08:00</published><updated>2008-12-16T09:44:00.418-08:00</updated><title type='text'>Sobre mis notas personales</title><content type='html'>Algunas cosas sobre mis notas personales:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="COLOR: rgb(51,102,255)"&gt;Continuar con la traduccion cuando tengamos en el mercado telefonos con Android instalado.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;a href="http://bp0.blogger.com/__WZr8mbWg3o/R2qHIXr7wjI/AAAAAAAAADk/erAvoaROx-8/s1600-h/androidito.jpg"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-198564444330919811?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/198564444330919811/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=198564444330919811' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/198564444330919811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/198564444330919811'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2008/12/estado-de-la-traduccin.html' title='Sobre mis notas personales'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-6980783005418313552</id><published>2008-03-06T09:15:00.000-08:00</published><updated>2008-03-06T09:17:27.248-08:00</updated><title type='text'>TIP: Sensor Simulator</title><content type='html'>En la siguiente página encontrarás un simulador excelente para generar datos de ubicación geográfica y de movimiento para tu emulador.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://code.google.com/p/openintents/"&gt;http://code.google.com/p/openintents/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-6980783005418313552?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/6980783005418313552/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=6980783005418313552' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6980783005418313552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6980783005418313552'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2008/03/tip-sensor-simulator.html' title='TIP: Sensor Simulator'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-831563664794990932</id><published>2008-01-15T12:02:00.001-08:00</published><updated>2008-01-15T13:00:49.004-08:00</updated><title type='text'>Desarrollando aplicaciones - Almacenamiento, recuperación y exposición de datos</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/data.html"&gt;Storing, Retrieving and Exposing Data&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Almacenamiento, recuperación y exposición de datos&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Storing, Retrieving and Exposing Data&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Un típico sistema operativo de escritorio provee un sistema de archivos común que cualquier aplicación puede usar para almacenar y leer archivos que pueden ser leídos por otras aplicaciones (quizá definiendo algunos controles de acceso). Android usa un sistema diferente: en Android, todas los datos de aplicaciones (incluyendo archivos) son privados a esa aplicación. Sin embargo, Android también provee una forma standard para que una aplicación exponga sus datos privados a otra aplicación. Esta sección describe todas las formas en las que una aplicación puede almacenar y recuperar datos, exponer sus datos a otras aplicaciones y también la forma en la cual tú puedes solicitar datos desde otras aplicaciones que exponen sus datos.&lt;/p&gt;&lt;p&gt;Android provee los siguiente mecanismos para almacenar y recuperar datos:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/devel/data/preferences.html"&gt;Preferencias&lt;/a&gt; : Es un mecanismo liviano que permite almacenar y recuperar datos primitivos en la forma de pares clave/valor. Este mecanismo es típicamente usado para almacenar las preferencias de la aplicación.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/devel/data/files.html"&gt;Archivos&lt;/a&gt; : Tú puedes almacenar tus archivos en el dispositivo o en un medio de almacenamiento removible. Por omisión, las otras aplicaciones no tienen acceso a estos archivos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/devel/data/databases.html"&gt;Base de datos&lt;/a&gt; : Las APIs de Android contienen soporte para SQLite. Tu aplicación puede crear y usar base de datos SQLite privadas. Cada base de datos es privada al paquete que la crea.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/devel/data/contentproviders.html"&gt;Proveedores de contenidos&lt;/a&gt; : Un proveedor de contenidos es un componente opcional de una aplicación y expone el acceso de lectura/escritura a los datos privados de la aplicación, sujeto a las restricciones que tú quieras imponer. Los proveedores de contenidos implementan una sintaxis estándard para solicitar datos y un mecanismo de acceso estándard para devolver los datos. Android provee algunos proveedores de contenidos para tipos de datos estándard, tales como contactos personales.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/devel/data/network.html"&gt;Redes&lt;/a&gt; : No te olvides que también puedes usar la red para almacenar y recuperar datos.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-831563664794990932?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/831563664794990932/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=831563664794990932' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/831563664794990932'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/831563664794990932'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2008/01/devel-data.html' title='Desarrollando aplicaciones - Almacenamiento, recuperación y exposición de datos'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-572597697214772912</id><published>2007-12-30T18:29:00.000-08:00</published><updated>2007-12-30T19:52:05.971-08:00</updated><title type='text'>Desarrollando aplicaciones - Bloques de construcción de Android</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/building-blocks.html"&gt;Android Building Blocks&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Bloques de construcción de Android&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Building Blocks&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Puedes ver una aplicación Android como una colección de componentes de varios tipos. Estos componentes en su mayoría tienen un bajo nivel de acloplamiento entre ellos, a tal grado que te permiten describirlos de manera muy precisa como una federación de componentes más que un aplicación como un todo.&lt;/p&gt;&lt;p&gt;Por lo general, todos estos componentes corren en el mismo proceso del sistema. Es posible (y muy común) crear múltiples "thread"s dentro de tal proceso, y además es posible crear procesos hijos completamente separados del proceso padre, si es que tú lo llegaras a necesitar. Estos últimos casos son poco comunes ya que Android trata en lo posible de hacer los procesos lo más transparente en tu código.&lt;/p&gt;&lt;p&gt;Estas son las partes más importantes de las APIs de Android:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/devel/bblocks-manifest.html"&gt;AndroidManifest.xml&lt;/a&gt; : El archivo "&lt;a href="http://code.google.com/android/devel/bblocks-manifest.html"&gt;AndroidManifest.xml&lt;/a&gt;" es el archivo de control que le dice al sistema qué es lo que debe hacer con los componentes de más alto nivel que tú haz creado (específicamente "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Actividad&lt;/a&gt;", "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Servicio&lt;/a&gt;", "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;Receptor de Intentos&lt;/a&gt;" y "&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;Proveedor de Contenidos&lt;/a&gt;" descritos a continuación). Debido a esto, este archivo es considerado el "pegamento" que indica qué "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" serán recibidos por tus "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Actividad&lt;/a&gt; : Una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" es, fundamentalmente, un objeto que tiene un ciclo de vida. Una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" es un trozo de código que hace algún trabajo. Si fuera necesario, este trabajo puede incluir el despliegue de una UI al usuario. Sin embargo, lo anterior no es necesario y algunas "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" nunca despliegan una UI. Típicamente, tú designarás una de las "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" de tu aplicación como el punto de inicio de tu aplicación.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;Vista&lt;/a&gt; : Una "&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;View&lt;/a&gt;" es un objeto que sabe cómo dibujarse asimismo en la pantalla. Las interfaces de usuario de Android están conforman un árbol de "&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;View&lt;/a&gt;". Si tú quieres realizar algún tipo de técnica gráfica especial entonces deberás crear una "&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;View&lt;/a&gt;" (este es el caso en el cual tú quisieras crear un juego o construir un nuevo tipo de interface de usuario)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intento&lt;/a&gt; : Un "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" es un simple mensaje que representa "la intención" de hacer algo. Por ejemplo, si tu aplicación quiere abrir una página web, debe expresar su "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intento&lt;/a&gt;" para ver la URI a través de la creación de una instancia de "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" y luego entregársela al sistema. Posteriormente, el sistema ubicará una pieza de código que sepa cómo manipular aquel "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intento&lt;/a&gt;" y la ejecuta (en este caso un browser). Los "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" también pueden ser usados para difundir eventos interesantes a través de todo el sistema (tales como notificaciones).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Servicio&lt;/a&gt; : Un "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;" es un cuerpo de código que se ejecuta en segundo plano. Se ejecuta dentro de su propio proceso o en el contexto del proceso de otra aplicación, dependiendo de sus necesidades. Otros componentes se "atan" a un "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Servicio&lt;/a&gt;" e invocan sus métodos a través de "llamados remotos de procedimientos (RPC)". Un ejemplo de un "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;" es un reproductos de música. En este caso, el usuario podría usar una UI para seleccionar la música y posteriormente cerrar la UI, pero la música deberá continuar sonando. Esto se logra usando un "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Servicio&lt;/a&gt;" que continuará la reproducción de la música.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/app/NotificationManager.html"&gt;Notificación&lt;/a&gt; : Una notificación es un pequeño ícono que aparece en la barra de estado. Los usuarios pueden interactuar con este ícono para recibir información. Las notificaciones más conocidas son los mensajes SMS, correo de voz; pero las aplicaciones pueden crear sus propias notificaciones. Las notificaciones son el mecanismo preferido para alertar al usuario que algo requiere de su atención.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;Proveedor de Contenidos&lt;/a&gt; : Un "&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;ContentProvider&lt;/a&gt;" es un almacen de datos que provee acceso a datos en el dispositivo. Un ejemplo clásico es el "&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;ContentProvider&lt;/a&gt;" que es usado para tomar datos desde la lista de contactos. Tu aplicación puede utilizar datos que otras aplicaciones han expuesto vía un "&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;ContentProvider&lt;/a&gt;". Tú también puede definir tus propios "&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;ContentProvider&lt;/a&gt;" para así exponer tus propios datos.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-572597697214772912?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/572597697214772912/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=572597697214772912' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/572597697214772912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/572597697214772912'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/devel-building-blocks.html' title='Desarrollando aplicaciones - Bloques de construcción de Android'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-7743374825831337841</id><published>2007-12-21T19:29:00.000-08:00</published><updated>2007-12-21T19:30:51.162-08:00</updated><title type='text'>Desarrollando aplicaciones - Escuchando notificaciones de la UI</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/ui/notifications.html"&gt;Listening for UI Notifications&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Escuchando notificaciones de la UI&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Listening for UI Notifications&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Algunas notificaciones de la UI son automáticamente expuestas y llamadas por Android. Por ejemplo, una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" sobreescribe los métodos "onKeyDown" y "onKeyUp" y "&lt;a href="http://code.google.com/android/reference/android/widget/TextView.html"&gt;TextView&lt;/a&gt;" expone "onFocusChanged(boolean, int)". Sin embargo, algunos métodos "callbacks", tales como clic de botones no son expuestos de manera nativa y deben ser registrados manualmente como se muestra a continuación.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;public class SendResult extends Activity&lt;br /&gt;{&lt;br /&gt;    /**&lt;br /&gt;     * Initialization of the Screen after it is first created.  Must at least&lt;br /&gt;     * call setContentView() to&lt;br /&gt;     * describe what is to be displayed in the screen.&lt;br /&gt;     */&lt;br /&gt;    protected void onCreate(Bundle savedValues)&lt;br /&gt;    {&lt;br /&gt;        ...&lt;br /&gt;&lt;br /&gt;        // Listen for button clicks.&lt;br /&gt;        Button button = (Button)findViewById(R.id.corky);&lt;br /&gt;        button.setOnClickListener(mCorkyListener);&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;    // Create an anonymous class to act as a button click listener.&lt;br /&gt;    private OnClickListener mCorkyListener = new OnClickListener()&lt;br /&gt;    {&lt;br /&gt;        public void onClick(View v)&lt;br /&gt;        {&lt;br /&gt;            // To send a result, simply call setResult() before your&lt;br /&gt;            // activity is finished.&lt;br /&gt;            setResult(RESULT_OK, "Corky!");&lt;br /&gt;            finish();&lt;br /&gt;        }&lt;br /&gt;    };&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-7743374825831337841?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/7743374825831337841/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=7743374825831337841' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7743374825831337841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7743374825831337841'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/devel-ui-notifications.html' title='Desarrollando aplicaciones - Escuchando notificaciones de la UI'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-5948045886099728256</id><published>2007-12-21T19:14:00.000-08:00</published><updated>2007-12-21T19:15:52.903-08:00</updated><title type='text'>Desarrollando aplicaciones - Enganchando un elemento de la pantalla</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/ui/hooking.html"&gt;Hooking into a Screen Element&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Enganchando un elemento de la pantalla&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Hooking into a Screen Element&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Tú puedes obtener una referencia a un elemento de la pantalla llamando al método "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;.findViewById()". Posteriormente, puedes usar esta referencia para modificar o recuperar valores expuestos por ese elemento.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;TextView msgTextView = (TextView)findViewById(R.id.msg);&lt;br /&gt;msgTextView.setText(R.string.push_me);&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-5948045886099728256?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/5948045886099728256/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=5948045886099728256' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5948045886099728256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5948045886099728256'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/devel-ui-hooking.html' title='Desarrollando aplicaciones - Enganchando un elemento de la pantalla'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-504194323834183107</id><published>2007-12-21T19:03:00.000-08:00</published><updated>2007-12-21T19:05:40.009-08:00</updated><title type='text'>Desarrollando aplicaciones - Definiendo tu pantalla con XML</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/ui/xml.html"&gt;Designing Your Screen in XML&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Definiendo tu pantalla con XML&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Designing Your Screen in XML&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Debido a que el diseño de una pantalla a través de código puede resultar muy engorroso, Android soporta una sintaxis XML para diseñar pantallas. Android define un gran número de elementos especialmente hechos para la plataforma, cada uno de ellos representando una subclase específica de Android View. Tú puedes diseñar tu pantalla de la misma forma en la que tú crear archivos HTML, es decir, como una serie de etiquetas anidades y guardadas en un archivo XML dentro del directorio "res/layout/" de tu aplicación. Para aprender qué elementos son expuestos y el formato del archivo XML lee el documento "&lt;a href="http://code.google.com/android/reference/available-resources.html"&gt;Available Resource Types&lt;/a&gt;" y en especial la sección "&lt;a href="http://code.google.com/android/reference/available-resources.html#layoutresources"&gt;Layout Resources&lt;/a&gt;". Cada etiqueta describe un único elemento "&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;android.view.View&lt;/a&gt;", pero este elemento puede ser un simple elemento visual o un elemento de esquema que contiene una colección de objetos hijos (una pantalla o una porción de ella). Cuando Android compila tu aplicación, compila cada archivo en un "&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;android.view.View&lt;/a&gt;" recurso que tú puedes cargar en tu código llamando al método "setContentView(R.layout.layout_file_name)" dentro de la implementación que hagas del método "onCreate()" de tu "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;".&lt;/p&gt;&lt;p&gt;Cada archivo XML esta formado por etiquetas que corresponden a clases GUI de Android. Estas etiquetas tienen atributos que en su mayoría corresponden a métodos en esa clase (por ejemplo, la etiqueta "EditText" tiene un atributo de texto que corresponde al método "setText()" de la clase "EditText").&lt;/p&gt;&lt;p&gt;NOTA: No existe una correspondencia exacta entre nombres de clase/métodos y nombres de etiquetas/atributos. Son parecidos por no 1:1&lt;/p&gt;&lt;p&gt;NOTA: Android tiende a dibujar los elementos en el orden en el cual aparecen en el documento XML. Por lo tanto, if hay elementos que se sobreponen, el último en el archivo será probablemente el que aparezca sobre cualquier otro que esté previamente declarado en su mismo espacio.&lt;/p&gt;&lt;p&gt;Cada archivo XML es compilado dentro de un árbol que tiene como raíz un objeto "&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;View&lt;/a&gt;" o "&lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;ViewGroup&lt;/a&gt;", por lo tanto debe tener una sola etiqueta raíz.  &lt;/p&gt;&lt;p&gt;Los atributos llamados "layout_algo" modifican el miembro "algo" del objeto "&lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.LayoutParams.html"&gt;LayoutParams&lt;/a&gt;". El documento "&lt;a href="http://code.google.com/android/reference/available-resources.html#layoutresources"&gt;Layout Resources&lt;/a&gt;" también describe cómo aprender la sintaxis para algunas propiedades específicas de "&lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.LayoutParams.html"&gt;LayoutParams&lt;/a&gt;".&lt;/p&gt;&lt;p&gt;Los siguientes valores son soportados para dimensiones (descritos en "&lt;a href="http://code.google.com/android/reference/available-resources.html#dimension"&gt;TypedValue&lt;/a&gt;").&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;dip (pixeles independientes del dispositivo)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;sp (pixeles escalados - mejor opción para tamaño de texto)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;pt (puntos)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;in (pulgadas)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;mm (milimetros)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;px (pixeles)&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Ejemplo: android:layout_width="25px"&lt;/p&gt;&lt;p&gt;Para más información sobre estas dimensiones, ver "&lt;a href="http://code.google.com/android/reference/available-resources.html#dimension"&gt;Dimension Values&lt;/a&gt;".&lt;/p&gt;&lt;p&gt;El siguiente archivo XML crea la pantalla que es mostrada debajo de él. El texto en el borde superior fue dibujado llamando al método "setTitle()" de la clase "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;". Los atributos que se refieren elementos relativos ("layout_toLeft") hacen uso del ID del elemento usando la sintaxis de recursos relativos ("@id/id_number").&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;!-- Demonstrates using a relative layout to create a form --&amp;gt;&lt;br /&gt;&amp;lt;RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android&lt;br /&gt; android:layout_width="fill_parent" &lt;br /&gt; android:layout_height="wrap_content"&lt;br /&gt; android:background="@drawable/blue"&lt;br /&gt; android:padding="10px"&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;TextView id="@+id/label" &lt;br /&gt;  android:layout_width="fill_parent" &lt;br /&gt;  android:layout_height="wrap_content" &lt;br /&gt;  android:text="Type here:"/&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;EditText id="@+id/entry" &lt;br /&gt;  android:layout_width="fill_parent" &lt;br /&gt;  android:layout_height="wrap_content" &lt;br /&gt;  android:background="@android:drawable/editbox_background"&lt;br /&gt;  android:layout_below="@id/label"/&amp;gt;&lt;br /&gt;  &lt;br /&gt;    &amp;lt;Button id="@+id/ok" &lt;br /&gt;  android:layout_width="wrap_content" &lt;br /&gt;  android:layout_height="wrap_content" &lt;br /&gt;  android:layout_below="@id/entry"&lt;br /&gt;  android:layout_alignParentRight="true"&lt;br /&gt;  android:layout_marginLeft="10px"&lt;br /&gt;  android:text="OK" /&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;Button android:layout_width="wrap_content" &lt;br /&gt;  android:layout_height="wrap_content"&lt;br /&gt;  android:layout_toLeft="@id/ok"&lt;br /&gt;  android:layout_alignTop="@id/ok"&lt;br /&gt;  android:text="Cancel" /&amp;gt;&lt;br /&gt;&amp;lt;/RelativeLayout&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;b&gt;Figura:&lt;/b&gt;&lt;a href="http://code.google.com/android/images/designing_ui_layout_example.png" title="Link hacia la imagen en el sitio de Android's documentation." alt="Link hacia la imagen en el sitio de Android's documentation."&gt;http://code.google.com/android/images/designing_ui_layout_example.png&lt;/a&gt;&lt;h2&gt;&lt;a href="#"&gt;Cargando los recursos XML&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Loading the XML Resource&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Cargar y compilar los recursos del esquema de tu pantalla es muy sencillo y es hecho en un simple llamado dentro método "onCreate()", tal como se muestra a continuación:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;protected void onCreate(Bundle savedValues)&lt;br /&gt;{&lt;br /&gt;   // Be sure to call the super class.&lt;br /&gt;   super.onCreate(savedValues);&lt;br /&gt;&lt;br /&gt;   // Load the compiled layout resource into the window's&lt;br /&gt;   // default ViewGroup.&lt;br /&gt;   // The source file is res/layout/hello_activity.xml&lt;br /&gt;    setContentView(R.layout.hello_activity);&lt;br /&gt;  &lt;br /&gt;   // Retrieve any important stored values.&lt;br /&gt;   restoreValues(savedValues);&lt;br /&gt;} &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-504194323834183107?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/504194323834183107/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=504194323834183107' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/504194323834183107'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/504194323834183107'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/devel-ui-xml.html' title='Desarrollando aplicaciones - Definiendo tu pantalla con XML'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-2468762798126619038</id><published>2007-12-21T17:42:00.000-08:00</published><updated>2007-12-21T17:45:55.180-08:00</updated><title type='text'>Desarrollando aplicaciones - Trabajando con AdapterView</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/ui/binding.html"&gt;Working with AdapterViews (Binding to Data) &lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Trabajando con AdapterViews (asociando datos a vistas)&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Working with AdapterViews (Binding to Data) &lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Como se mencionón, algunos grupos de vistas tienen UI. Estos objetos tipicamente son subclases de "&lt;a href="http://code.google.com/android/reference/android/widget/AdapterView.html"&gt;AdapterView&lt;/a&gt;". Algunos ejemplos son "&lt;a href="http://code.google.com/android/reference/android/widget/Gallery.html"&gt;Gallery&lt;/a&gt;" (una "widget" con un selección de imágenes) y "&lt;a href="http://code.google.com/android/reference/android/widget/ListView.html"&gt;ListView&lt;/a&gt;" (una lista de vistas. Estos objetos hacen dos tareas en común:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Llenar el esquema con datos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Manipular las selecciones del usuario.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Llenando el esquema con datos&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Filling the layout with data&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Esto es típicamente hecho a través de la asociación de la clase con un "&lt;a href="http://code.google.com/android/reference/android/widget/Adapter.html"&gt;Adapter&lt;/a&gt;" que toma los datos de alguna parte: una lista que el código suministra o el resultado de una consulta a una base de datos del dispositivo.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;// Get a Spinner and bind it to an ArrayAdapter that &lt;br /&gt;// references a String array.&lt;br /&gt;private String[] fruit = {"apples", "oranges", "lemons"}&lt;br /&gt;Spinner s1 = (Spinner)findViewById(R.id.fruitlist);&lt;br /&gt;s1.setAdapter(new ArrayAdapter&amp;lt;String&amp;gt;(this, R.layout.spinner_1, mStrings));&lt;br /&gt;&lt;br /&gt;// Load a Spinner and bind it to a data query.&lt;br /&gt;private String[] cols={android.provider.Contacts.PeopleColumns.NAME};&lt;br /&gt;private Cursor cur = managedQuery(android.provider.Contacts.People.CONTENT_URI, cols, null, null);&lt;br /&gt;s2.setAdapter(new CursorAdapter(cur, this));&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a href="#"&gt;Manipular las selecciones del usuario&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Handling user selections&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Esto es hecho al asignar al miembro "&lt;a href="http://code.google.com/android/reference/android/widget/AdapterView.OnItemClickListener.html"&gt;AdapterView.OnItemClickListener&lt;/a&gt;" de la clase un objeto escuchador de eventos y capturar los cambios que el usuario hace en su selección.&lt;/p&gt;&lt;pre&gt;&lt;code&gt;// Create a message handling object as an anonymous class.&lt;br /&gt;private OnItemClickListener mMessageClickedHandler = new OnItemClickListener() {&lt;br /&gt;    public void onItemClick(AdapterView parent, View v, int position, long id)&lt;br /&gt;    {&lt;br /&gt;        // Display a messagebox.&lt;br /&gt;        showAlert("You've got an event", "Clicked me!", "ok", false);&lt;br /&gt;    }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;// Now hook into our object and set its onItemClickListener member&lt;br /&gt;// to our class handler object.&lt;br /&gt;mHistoryView = (ListView)findViewById(R.id.history);&lt;br /&gt;mHistoryView.setOnItemClickListener(mMessageClickedHandler); &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-2468762798126619038?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/2468762798126619038/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=2468762798126619038' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/2468762798126619038'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/2468762798126619038'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/devel-ui-binding.html' title='Desarrollando aplicaciones - Trabajando con AdapterView'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-7910138495633135779</id><published>2007-12-18T02:10:00.000-08:00</published><updated>2007-12-21T11:28:14.890-08:00</updated><title type='text'>Desarrollando aplicaciones - Objetos comunes de esquema</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/ui/layout.html"&gt;Common Layout Objects&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Objetos comunes de esquema&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Common Layout Objects&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Los siguientes son los grupos de vistas más comunes que tú vas a usar en tus aplicaciones. Esta sección te entregará la información básica sobre cada uno de ellos. Para estudiar en más profundidad cada uno de ellos, puedes seleccionar el link que cada elemento provee.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;FrameLayout&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;FrameLayout&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Un &lt;a href="http://code.google.com/android/reference/android/widget/FrameLayout.html"&gt;FrameLayout&lt;/a&gt; es el objeto de esquema más sencillo. Está expresamente diseñado como un espacio en blanco reservado en la pantalla que posteriormente podrás llenar con un único objeto, por ejemplo una fotografía cuya imagen será intercambiada. Todos los elementos hijos son posicionados en la parte superior izquierda de la pantalla. No es posible establecer una posición determinada para un elemento hijo de &lt;a href="http://code.google.com/android/reference/android/widget/FrameLayout.html"&gt;FrameLayout&lt;/a&gt;. Elementos hijos que posteriormente se agreguen serán simplemente dibujados sobre elementos que previamente hayan sido dibujados, lo que bloqueará su visión total o parcialmente (a menos que los nuevos elementos sean transparentes).&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;LinearLayout&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;LinearLayout&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Un &lt;a href="http://code.google.com/android/reference/android/widget/LinearLayout.html"&gt;LinearLayout&lt;/a&gt; alinea todos sus elementos hijos en una única dirección: vertical u horizontal, de acuerdo a qué propiedad tú definiste para &lt;a href="http://code.google.com/android/reference/android/widget/LinearLayout.html"&gt;LinearLayout&lt;/a&gt;. Todos los hijos son ubicados uno al lado del otro, por lo tanto una lista vertical sólo tendrá un hijo por fila sin importar cuan ancha sea la fila. De manera similar, un lista horizontal sólo tendrá un fila de alto (la altura del hijo más alto más el espacio de relleno definido, ie, "padding"). El &lt;a href="http://code.google.com/android/reference/android/widget/LinearLayout.html"&gt;LinearLayout&lt;/a&gt; respeta los márgenes entre hijos y también su gravedad (alineamiento del hijo hacia la derecha, centro o izquierda).&lt;/p&gt;&lt;p&gt;El &lt;a href="http://code.google.com/android/reference/android/widget/LinearLayout.html"&gt;LinearLayout&lt;/a&gt; también soporta la asignación de peso a hijos de manera individual. Este peso, permite a los hijos expandirse para llenar cualquier espacio restante de la pantalla. Esto previene que una lista de pequeños objetos sea confinada hacia uno de los extremos de una pantalla grande y por el contrario se expanda para llenar todo el espacio disponible. El peso que los hios tienen especificado es utilizado para distribuir cualquier espacio restante en la misma proporción de su peso declarado. El valor por omisión del peso de un hijo es cero. Por lo ejemplo, si hay tres casillas de texto, y dos de ellas declaran un un peso de 1, dos de ellas se expandirán de con la misma proporción para llenar el espacio restante, y la tercera no crecerá ninguna cantidad adicional.&lt;/p&gt;&lt;p&gt;Las imágenes de los formularios mostrados a continuación representan un &lt;a href="http://code.google.com/android/reference/android/widget/LinearLayout.html"&gt;LinearLayout&lt;/a&gt; con un conjunto de elementos: un botón, algunas etiquetas de texto y algunas casillas de texto. Ambos tienen definido valores para relleno de contorno, para así mantener un contorno que proporciona un agradable distribución. Las casillas de texto tienen sus anchos fijados al valor "FILL_PARENT", otros elementos lo tienen fijado a "WRAP_CONTENT". Por omisión, el valor de la gravedad es fijado a izquierda ("left"). El formulario de la izquierda no tiene valores de peso fijados, por lo tanto todos sus hijos tienen el valor cero (valor por omisión). El formulario de la derecha tiene fijado el valor del peso de la casilla de texto de comentarios a "1". Si el peso de la casilla de texto para el nombre hubiese sido fijado a "1", las casillas de texto para el nombre y los comentarios hubiesen tenido la misma altura.&lt;/p&gt;&lt;p&gt;CONSEJO: Para crear un esquema de tamaño proporcionado en la pantalla, crea un objeto contenedor que sea "fill_parent", luego asigna la altura y ancho de los hijos a cero y finalmente asigna los valores de peso relativos a cada hijo dependiendo de la proporción que cada uno de ellos debe ocupar en la pantalla&lt;/p&gt;&lt;b&gt;Figura:&lt;/b&gt;&lt;a href="http://code.google.com/android/images/linearlayout.png" title="Link hacia la imagen en el sitio de Android's documentation." alt="Link hacia la imagen en el sitio de Android's documentation."&gt;http://code.google.com/android/images/linearlayout.png&lt;/a&gt;&lt;p&gt;Dentro de un &lt;a href="http://code.google.com/android/reference/android/widget/LinearLayout.html"&gt;LinearLayout&lt;/a&gt;, los items son alineados por la posición de sus líneas base del texto (la primera línea del primer elemento,i.e., la más alta o más a la izquierda es la línea considerada como referencia). Esto es así para evitar que las personas al llenar un formulario tengan que buscar un elemento en elementos vecinos. Esta característica puede ser desactivada agregando android:baselineAligned="false" en tu esquema XML.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;TableLayout&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;TableLayout&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Un "&lt;a href="http://code.google.com/android/reference/android/widget/TableLayout.html"&gt;TableLayout&lt;/a&gt;" posiciona sus hijos dentro de filas y columnas. Un "&lt;a href="http://code.google.com/android/reference/android/widget/TableLayout.html"&gt;TableLayout&lt;/a&gt;" está compuesto por un número de objetos "TableRow", cada uno de ellos definiendo una fila (más adelante explicaremos que también es posible tener otros elementos hijos). Los contenedores "&lt;a href="http://code.google.com/android/reference/android/widget/TableLayout.html"&gt;TableLayout&lt;/a&gt;" no despliegan contornos para sus filas, columnas y celdas. Cada fila tiene cero o mas celdas, y cada celda puede contener un objeto "&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt;". Una tabla puede tener tantas columnas como lo tenga la fila con más celdas. Una tabla puede tener celdas vacías. Las celdas no pueden extenderse a otras columnas, como lo hace HTML. La siguiente imagen muestra un esquema de tabla en la cual los border invisibles son mostrados con líneas punteadas.&lt;/p&gt;&lt;b&gt;Figura:&lt;/b&gt;&lt;a href="http://code.google.com/android/images/table_layout.png" title="Link hacia la imagen en el sitio de Android's documentation." alt="Link hacia la imagen en el sitio de Android's documentation."&gt;http://code.google.com/android/images/table_layout.png&lt;/a&gt;&lt;p&gt;Las columnas pueden estar ocultas, ser marcadas para estirarse y ocupar todo el espacio disponible, o marcadas para comprimirse hasta que la tabla se ajuste al tamaño de la pantalla. Encontrarás más información en el siguiente link: &lt;a href="http://code.google.com/android/reference/android/widget/TableLayout.html"&gt;TableLayout&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;AbsoluteLayout&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;AbsoluteLayout&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El "&lt;a href="http://code.google.com/android/reference/android/widget/AbsoluteLayout.html"&gt;AbsoluteLayout&lt;/a&gt;" permite que los elementos hijos especifiquen con precisión las coordenadas "x" e "y" en la cual deben ser desplegados. La posición (0,0) corresponde a la esquina superior izquierda, y sus valores se incrementan en la medida que tu avanzan hacia abajo y a la derecha. Márgenes no son soportados y el solapamiento de elementos está permitido (pero no es recomendado). La recomendación general es no usar "&lt;a href="http://code.google.com/android/reference/android/widget/AbsoluteLayout.html"&gt;AbsoluteLayout&lt;/a&gt;" a menos que tengas una muy buena razón para usarlo, porque este esquema es muy rígido y no funciona bien en todos los dispositivos.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;RelativeLayout&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El esquema "&lt;a href="http://code.google.com/android/reference/android/widget/RelativeLayout.html"&gt;RelativeLayout&lt;/a&gt;" permite que sus elementos hijos espeficiquen su posición relativa entre ellos(indicando un ID) o con su padre. De esta forma, puedes alinear dos elementos por su contorno derecho, o poner uno debajo de otros, o centrarlo en la pantalla. Los elementos son dibujados en un order dado, de tal forma que si el primer elemento está centrado en la pantalla los otros elementos se alinearán considerando su posición relativa al centro de la pantalla. Si estás usando XML para describir el esquema de pantalla (como se describirá más adelante), un elemento referenciado debe ser declarado antes de hacer referencia a él.&lt;/p&gt;&lt;p&gt;Aquí hay un ejemplo de un esquema relativo destacando los elementos invisibles y visibles. El objeto raíz del esquema de la pantalla es un "&lt;a href="http://code.google.com/android/reference/android/widget/RelativeLayout.html"&gt;RelativeLayout&lt;/a&gt;".&lt;/p&gt;&lt;b&gt;Figura:&lt;/b&gt;&lt;a href="http://code.google.com/android/images/designing_ui_relative_layout.png" title="Link hacia la imagen en el sitio de Android's documentation." alt="Link hacia la imagen en el sitio de Android's documentation."&gt;http://code.google.com/android/images/designing_ui_relative_layout.png&lt;/a&gt;&lt;p&gt;Este diagrama muestra los nombres de las clases de los elementos en la pantalla, seguido por una lista de las propiedades de cada uno de ellos. Algunas de estas propiedades son soportadas directamente por los elementos y otras son soportadas por su miembro "&lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.LayoutParams.html"&gt;LayoutParams&lt;/a&gt;" (una subclase de "&lt;a href="http://code.google.com/android/reference/android/widget/RelativeLayout.html"&gt;RelativeLayout&lt;/a&gt;" en todos los elementos de esta pantalla, debido a que todos los elementos son hijos del objeto padre "&lt;a href="http://code.google.com/android/reference/android/widget/RelativeLayout.html"&gt;RelativeLayout&lt;/a&gt;"). Los parámetros de "RelativeLayout" son: "width", "height", "below", "alignTop", "toLeft", "padding" y "marginLeft". Se debe observar que algunos de estos parámetros soportan valores relativos a otros hijos, de ahí viene el nombre "&lt;a href="http://code.google.com/android/reference/android/widget/RelativeLayout.html"&gt;RelativeLayout&lt;/a&gt;". Esto incluye las propiedades "toLeft", "alignTop" y "below", las cuales referencian al objeto de la izquierda, de arriva y de abajo; respectivamente.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Resumen de los grupos de vistas más importantes&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Summary of Important View Groups&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Todos estos objetos contienen elementos UI. Algunos proveen elementos UI visibles y otros sólo controlan el esquema de sus elementos hijos.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/AbsoluteLayout.html"&gt;AbsoluteLayout&lt;/a&gt; : Permite que espeficiques la ubicación de los objetos hijos relativa al padre usando medidas exactas (por ejemplo, pixeles).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/FrameLayout.html"&gt;FrameLayout&lt;/a&gt; : Este esquema actúa como un marco que despliega sólo un objeto.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/Gallery.html"&gt;Gallery&lt;/a&gt; : Es un esquema para desplegar imágenes (tomadas de una lista) y tiene la capacidad para desplazar su contenido de manera horizontal. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/GridView.html"&gt;GridView&lt;/a&gt; : Es un esquema cuadriculado de "n" filas por "m" columnas. Además, tiene capacidades para desplazar el contenido. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/LinearLayout.html"&gt;LinearLayout&lt;/a&gt; : Es un esquema que organiza sus elementos hijos dentro de una sólo fila, la cual puede ser horizontal o vertical.Crea una barra de desplazamiento si el tamaño de la cuadrícula excede el tamaño de la pantalla.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/ListView.html"&gt;ListView&lt;/a&gt; : Es un esquema que despliega una lista dentro de una sola columna y tiene capacidad de desplazamiento del contenido.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/PopupList.html"&gt;PopupList&lt;/a&gt; : Es un esquema que despliega el contenido de una lista con bordes, de manera independiente y emergente &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/RelativeLayout.html"&gt;RelativeLayout&lt;/a&gt; : Este esquema permite que espeficiquemos la ubicación de sus elementos hijos relativa entre ellos (ejemplo: un elemento "A" al lado del elemento "B") o con el padre (por ejemplo: alineación con el borde superior del padre).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/ScrollView.html"&gt;ScrollView&lt;/a&gt; : Es un esquema que despliega elementos en un columna vertical con capacidad de desplazamiento de contenido.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/Spinner.html"&gt;Spinner&lt;/a&gt; : Este esquema despliega un sólo elemento a la vez (tomado de una lista asociada) dentro de una casilla de texto de una fila. Este esquema es diferente de un esquema con una fila con capacidad para desplegar el contenido horizontalmente o verticalmente.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/view/SurfaceView.html"&gt;SurfaceView&lt;/a&gt; : Este esquema provee acceso directo a una superficie dedicada al dibujado. Puede contener elementos de vistas superpuestos sobre la superficie, pero está diseñado para aplicaciones que necesitan dibujar pixeles en vez de usar "widgets".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/TabHost.html"&gt;TabHost&lt;/a&gt; : Este esquema provee una lengüeta de selección que monitorea clics y permite que la aplicación cambie de pantalla en el momento en que la lengüeta es cliqueada.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/TableLayout.html"&gt;TableLayout&lt;/a&gt; : Es un esquema tabular con un número arbitario de filas y columnas, cada una de las celdas contiene un "widget" de tu elección. Las filas ajustan su tamaño para ajustar la columna más grande. El contorno de las celdas no son visibles.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/ViewFlipper.html"&gt;ViewFlipper&lt;/a&gt; : Es un esquema de despliega un elemento a la vez dentro de una casilla de texto de una fila. Puede ser configurado para intercambiar elementos a cierto intervalo de tiempo, como si fuera una presentación de diapositivas.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://code.google.com/android/reference/android/widget/ViewSwitcher.html"&gt;ViewSwitcher&lt;/a&gt; : Similar a &lt;a href="http://code.google.com/android/reference/android/widget/ViewFlipper.html"&gt;ViewFlipper&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-7910138495633135779?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/7910138495633135779/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=7910138495633135779' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7910138495633135779'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7910138495633135779'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/desarrollando-aplicaciones-objetos.html' title='Desarrollando aplicaciones - Objetos comunes de esquema'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-3006859798164594200</id><published>2007-12-17T16:19:00.000-08:00</published><updated>2007-12-21T11:31:45.106-08:00</updated><title type='text'>Desarrollando aplicaciones - Jerarquía de los elementos de la pantalla</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/ui/hierarchy.html"&gt;Hierarchy of Screen Elements&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Jerarquía de los elementos de la pantalla&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Hierarchy of Screen Elements&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;La unidad funcional básica de una aplicación Android es la &lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;"Activity"&lt;/a&gt;, el cual es un objeto de la clase &lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;"android.app.Activity"&lt;/a&gt;. Una &lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;"Activity"&lt;/a&gt; puede hacer muchas cosas, pero por si misma ella no tiene presencia en la pantalla. Para otorgarle a tu &lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;"Activity"&lt;/a&gt; presencia en la pantalla y diseñar su interface de usuario, tienes que trabajar con &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt; y &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt;, las cuales son las unidades básicas de expresión de la interface de usuario en la plataforma Android.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Vistas&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Views&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Una vista es un objeto cuya clase base es &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"android.view.View"&lt;/a&gt;. Es una estructura de datos cuyas propiedades almacenan el esquema y contenido para una determinada área rectangular de la pantalla. Un objeto &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt; manipula el dimensionamiento y esquema, realiza el pintado, controla los cambios de foco, desplazamiento de áreas y teclado/gestos para el área de la pantalla que representa.&lt;/p&gt;&lt;p&gt;La clase &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt; sirve de base para los "widgets", que son un conjunto de subclases implementadas completamente que dibujan elementos interactivos en la pantalla. Los "widgets" manipulan sus propios dimensionamientos y pintado, de tal forma que tú puedes usarlos para construir tus propias UI mucho más rápido. La lista de "widgets" disponibles incluye: "Text", "EditText", "InputMethod", "MovementMethod", "Button", "RadioButton", "Checkbox" y "ScrollView".&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Grupos de vistas&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Viewgroups&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Un &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt; es un objeto de la clase &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"android.view.Viewgroup"&lt;/a&gt;. Como su nombre lo indica, un grupo de vistas es un tipo especial de objeto &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt;, cuya función es contener y administrar un conjunto subordinado de &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt; y otros &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt;. Los &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt; nos permiten agregar una estructura a nuestras "UI" y así construir elementos de pantalla mucho más complejos que puedan ser manipulados como un único elemento.&lt;/p&gt;&lt;p&gt;La clase &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt; sirve de clase base para crear esquemas, los cuales son un conjunto de subclases implementadas completamente que provee de los tipos más comunes de elementos de pantalla. Los esquemas nos entregan una forma de construir una estructura para un conjunto de &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Un árbol jeráquico de UI&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;A Tree-Structured UI&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;En la plataforma Android, tú puedes definir una &lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;"Activity"&lt;/a&gt; con UI usando un árbol de &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt; y nodos de &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt;, tal como lo muestra el diagrama que está a continuación. El árbol puede ser simple o complejo según tus necesidades, y puede ser construido usando un conjunto predefinido de "widgets" y elementos de Android o tipos de &lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;"View"&lt;/a&gt; con características especiales que tí hayas creado.&lt;/p&gt;&lt;b&gt;Figura:&lt;/b&gt;&lt;a href="http://code.google.com/android/images/viewgroup.png" title="Link hacia la imagen en el sitio de Android's documentation." alt="Link hacia la imagen en el sitio de Android's documentation."&gt;http://code.google.com/android/images/viewgroup.png&lt;/a&gt;&lt;p&gt;Para enlazar el árbol a la pantalla y así efectuar su visualización, nuestra actividad &lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;"Activity"&lt;/a&gt; llama a sus método "setContentView()" y pasa la referencia una referencia al objeto del nodo raíz. Una vez que el sistema Android tiene una referencia al objeto del nodo raíz, éste puede trabajar directamente con el nodo para invalidarlo, medirlo y dibujar el árbol. Cuando tú &lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;"Activity"&lt;/a&gt; se activa y recibe el foco, el sistema notifica a tu &lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;"Activity"&lt;/a&gt; y le solicita al nodo raíz que mida y dibuje el árbol. Entonces, el nodo raíz le solicita a sus nodos hijos que se dibujen así mismo, a su vez cada nodo de grupo de vistas del árbol es responsable de dibujar sus nodos hijos directos.&lt;/p&gt;&lt;p&gt;Como se mencionó previamente, cada &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt; tiene la responsabilidad de medir su espacio disponible, posicionar sus hijos dentro del esquema y llamar al método "Draw()" por cada uno de sus hijos para que se dibujen asimismos. Los hijos podrían solicitar una ubicación y tamaño específico al padre, pero es el objeto padre quien tiene la última decisión con respecto a que tan grande cada hijo puede ser.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;LayoutParams: ¿Cómo especificar la posición y tamaño de un hijo?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;LayoutParams: How a Child Specifies Its Position and Size&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Cada &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt; usa una clase anidada que hereda de &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.LayoutParams.html"&gt;"ViewGroup.LayoutParams"&lt;/a&gt;. Esta subclase contiene tipos de propiedades que definen el tamaño y posición de un hijo en propiedades que son apropiadas para esa clase de &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.html"&gt;"ViewGroup"&lt;/a&gt;.&lt;/p&gt;&lt;b&gt;Figura:&lt;/b&gt;&lt;a href="http://code.google.com/android/images/layoutparams.png" title="Link hacia la imagen en el sitio de Android's documentation." alt="Link hacia la imagen en el sitio de Android's documentation."&gt;http://code.google.com/android/images/layoutparams.png&lt;/a&gt;&lt;p&gt;NOTA: Cada subclase de &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.LayoutParams.html"&gt;"LayoutParams"&lt;/a&gt; tiene su propia sintaxis para asignar sus valores. Cada elemento hijo debe definir un &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.LayoutParams.html"&gt;"LayoutParams"&lt;/a&gt; que sea apropiado para su padre, aunque éste último podría definir un &lt;a href="http://code.google.com/android/reference/android/view/ViewGroup.LayoutParams.html"&gt;"LayoutParams"&lt;/a&gt; diferente para sus hijos.&lt;/p&gt;&lt;p&gt;Todos los  incluyen ancho y alto. Muchos incluso tienen márgenes y contorno. Tú puedes indicar un ancho y alto determinados, pero probablemente no lo harás de manera frecuente. Lo más probable es que dejarás que tu vista se auto dimensione al tamaño de sus contenidos o tan grande como el objeto que lo contiene lo permita.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-3006859798164594200?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/3006859798164594200/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=3006859798164594200' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/3006859798164594200'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/3006859798164594200'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/desarrollando-aplicaciones-jerarqua-de.html' title='Desarrollando aplicaciones - Jerarquía de los elementos de la pantalla'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-5281643609961892378</id><published>2007-12-17T16:05:00.000-08:00</published><updated>2007-12-21T19:41:25.337-08:00</updated><title type='text'>Desarrollando aplicaciones - Implementando la interface de usuario</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/implementing-ui.html"&gt;Implementing a User Interface&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Implementando la interface de usuario&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Implementing a User Interface&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Esta sección describe las bases de cómo implementar la interface de usuario de una pantalla Android. Se describirán los elementos básicos para construir una pantalla, cómo definirla basada en un esquema XML y cómo cargarla en tu código. Además de varias otras tareas que tú vas a necesitar realizar en el diseño y desarrollo de la interface de usuario.&lt;/p&gt;&lt;p&gt;Estos serán los tópicos abordados en esta sección:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/12/desarrollando-aplicaciones-jerarqua-de.html"&gt;Jerarquía de los elementos de la pantalla&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/12/desarrollando-aplicaciones-objetos.html"&gt;Objetos comunes de esquema&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/12/devel-ui-binding.html"&gt;Trabajando con AdapterViews (asociando datos a vistas)&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/12/devel-ui-xml.html"&gt;Diseñando tu pantalla con XML&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/12/devel-ui-xml.html"&gt;Enganchando un elemento de la pantalla&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/12/devel-ui-notifications.html"&gt;Escuchando notificaciones de la UI&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Aplicando un tema a tu aplicación.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Elementos de UI y glosario de conceptos.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-5281643609961892378?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/5281643609961892378/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=5281643609961892378' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5281643609961892378'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5281643609961892378'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/desarrollando-aplicaciones.html' title='Desarrollando aplicaciones - Implementando la interface de usuario'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-8567892374257954195</id><published>2007-12-17T14:11:00.000-08:00</published><updated>2007-12-21T12:05:04.163-08:00</updated><title type='text'>Desarrollando aplicaciones - Introducción</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/devel/index.html"&gt;Developing Android Applications&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Desarrollando aplicaciones Android&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Developing Android Applications&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Tú puedes desarrollar una aplicación Android con el mismas herramientas de alta calidad que tú usas para desarrollar cualquier otra aplicación Java. Las "Android core libraries" proveen las funcionalidades necesarias para construir impresionantes y poderosas aplicaciones para dispositivos móviles, y las herramientas de desarrollo de Android para hacerla correr, depurar y testear muy rápidamente.&lt;/p&gt;&lt;p&gt;Esta sección explica todos los detalles asociados con el desarrollo de aplicaciones Android y explica los delineamientos de la filosofía detrás del sistema y luego describe en detalle cada uno de los subsistemas claves. Después de leer esta sección tú tendrás el conocimiento y confidencia para comenzar a escribir cualquier aplicación Android que tengas en tu mente.&lt;/p&gt;&lt;p&gt;Antes de leer esta sección tú deberías haber leído toda la sección "&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-introduccin.html"&gt;Manos a la obra&lt;/a&gt;", la cual te entrega la información necesaria para rápidamente impregnarte del "Android SDK" y mostrarte cómo construir tu primera aplicación y algunos tutoriales en los que aprenderás más sobre las aplicaciones Android. Esta sección está basada en la información entregada en "&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-introduccin.html"&gt;Manos a la obra&lt;/a&gt;".&lt;/p&gt;&lt;p&gt;Aquí está el detalles de los contenidos que encontrarás en esta sección:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Implementando una "UI": esta sección explicará cómo construir e interactuar con las interfaces de usuario de las aplicaciones Android. Después de leer esta página tú vas a tener un sólido entendimiento de cómo los esquemas de pantalla son construidos, cómo ellos funcionan en tiempo de ejecución y cómo puedes cambiar su aspecto visual para mejorar su apariencia.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Bloques de construcción: esta sección contiene una descripción detallada de los componentes de Android. Cubre todos los pormenores de los componentes que fueron descritos en "&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-anatoma-de-una-aplicacin.html"&gt;Anatomía de una aplicación Android&lt;/a&gt;" y mucho más. Esta sección profundiza en los detalles de cada uno de los componentes claves de Andriod (Intent, Activity, View y eventos).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Almacenamiento y recuperación de datos: esta sección explica cómo leer y escribir datos desde/hacia varios mecanismos de almacenamiento provistos por Android y hacia servicios de red. Existen varias formas de leer y escribir datos desde una aplicación y cada uno de ellos está orientado a satisfaces diferentes necesidades. En esta sección encontrarás la descripción de todos ellos y la orientación necesaria para saber cual de ellos seleccionar en determinada situación.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Modelo de seguridad: esta sección explica cómo obtener acceso a los recursos y características del sistema de seguridad y cómo declarar los permisos necesarios para controlar el acceso a nuestras propias características de seguridad, es decir, el control de permisos que permiten que dada una aplicación sea pueda tener acceso a piezas de funcionalidad provistas por otra aplicación (por ejemplo, qué aplicación puede marcar un teléfono). Esta sección describe la forma en la cual los permisos funcionan y cómo solicitar los permisos que tú has definido.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Recursos e i18n: esta sección entrega información detallada del sistema de administración de los recursos y aplicaciones, incluyendo cómo es utilizado para propósitos de internalización y regionalización. Los "recursos" son el material que una aplicación necesita en tiempo de ejecución (tales como imágenes, cadenas de caracteres, archivos XML, etcétera). Esta sección describirá cómo Android resuelve cual recurso cargar desde una selección de ellos, y cómo crear y usar estos recursos.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-8567892374257954195?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/8567892374257954195/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=8567892374257954195' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/8567892374257954195'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/8567892374257954195'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/desarrollando-aplicaciones-introduccin.html' title='Desarrollando aplicaciones - Introducción'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-246690525877395389</id><published>2007-12-17T10:48:00.000-08:00</published><updated>2007-12-17T11:02:17.933-08:00</updated><title type='text'>¿CÓMO HACER? - Reaccionar a un mensajes SMS</title><content type='html'>Documento original: &lt;a href="http://www.anddev.org/recognize-react_on_incoming_sms-t295.html"&gt;Recognize/React on incoming SMS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En esta nota les explicaré el código documentado de una aplicación Android que reacciona a la recepción de la llegada de un mensaje SMS.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;SMSReceiver.java&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#808080;"&gt;01&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;package &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;com.northvortex.sms;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;02&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;03&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.app.NotificationManager; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;04&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.content.Context; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;05&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.content.Intent; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;06&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.content.IntentReceiver; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;07&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.os.Bundle; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;08&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.provider.Telephony; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;09&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.telephony.gsm.SmsMessage; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;10&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.util.Log; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;11&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;12&lt;/span&gt; &lt;span style="color:#3f5fbf;"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;13&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;* android.content.IntentReceiver&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;14&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;* Base class for code that will receive intents sent by broadcastIntent()...&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;15&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;* http://code.google.com/android/reference/android/content/IntentReceiver.html&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;16&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;17&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;18&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;SMSReceiver &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;19&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;extends &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;IntentReceiver &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;21&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Etiqueta usada para la bitacora. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;22&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;private static final &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;String TAG_LOG = &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"SMSReceiver"&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;23&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;24&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Un numero aleatorio utilizado por la notificacion. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;25&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;private static final &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ID_NOTIFICACION = &lt;/span&gt;&lt;span style="color:#990000;"&gt;0x1221&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;26&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;27&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Esta es la action que sera gatillada cuando un mensaje SMS es recibido. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;28&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Usamos la "Default Package-Visibility".&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;29&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;private static final &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;String ACCION = &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"android.provider.Telephony.SMS_RECEIVED"&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;30&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;31&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;32&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;* Este metodo es gatillado cuando se recibe el Intent que esperabamos.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;33&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;34&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#646464;"&gt;@Override &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;35&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;onReceiveIntent&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;Context parContext, Intent parIntent&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;36&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;37&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// As we want to display a Notification, we the NotificationManager. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;38&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;NotificationManager elNotificador = &lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;NotificationManager&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;parContext.getSystemService&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;Context.NOTIFICATION_SERVICE&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;39&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;40&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Verifico que la accion recibida es ''&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;41&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;parIntent.getAction&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;.equals&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;ACCION&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;span style="color:#000000;"&gt;== &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;true&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;42&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;43&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// if(message starts with SMStretcher recognize BYTE) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;44&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;StringBuilder elContenido = &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;StringBuilder&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;45&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;46&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// La informacion del mensaje SMS vienen dentro del paquete de datos extras del Intent. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;47&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Bundle losDatosExtras = parIntent.getExtras&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;48&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;losDatosExtras != &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;49&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;50&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Recuperamos los mensajes que vienen dentro del Intent. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;51&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;SmsMessage&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] &lt;/span&gt;&lt;span style="color:#000000;"&gt;losMensajesSMS = Telephony.Sms.Intents.getMessagesFromIntent&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;parIntent&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;52&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;53&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Creo el mensaje que mostrare en la pantalla. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;54&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;for &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;SmsMessage unMensaje : losMensajesSMS&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;55&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;56&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;elContenido.append&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"Mensajes SMS\n"&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;57&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;elContenido.append&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"enviado por:"&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;58&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Numero de quien envio el mensaje. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;59&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;elContenido.append&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;unMensaje.getDisplayOriginatingAddress&lt;/span&gt;&lt;span style="color:#000000;"&gt;() &lt;/span&gt;&lt;span style="color:#000000;"&gt;+ &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"\n"&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;60&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;elContenido.append&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"Mensaje:\n"&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;61&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Contenido del mensaje.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;62&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;elContenido.append&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;unMensaje.getDisplayMessageBody&lt;/span&gt;&lt;span style="color:#000000;"&gt;())&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;63&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;64&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;65&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;66&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Registramos en la bitacora el evento.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;67&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Log.i&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;TAG_LOG, &lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;"onReceiveIntent: " &lt;/span&gt;&lt;span style="color:#000000;"&gt;+ elContenido&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;68&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;69&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Mostramos el mensaje utilizando el administrador de notificaciones &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;70&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;elNotificador.notifyWithText&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;ID_NOTIFICACION, elContenido.toString&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;, &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;71&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;NotificationManager.LENGTH_LONG, &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;72&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;73&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Consumimos este Intent, de esa forma ninguna otra aplicacion lo notara. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;74&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.abortBroadcast&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;75&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;76&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#3f7f5f;"&gt;// Ahora intentamos gatillar una actividad adicional. &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;77&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Intent elIntento = &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Intent&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;parContext, SMSActivity.&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;78&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;elIntento.setLaunchFlags&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;Intent.NEW_TASK_LAUNCH&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;79&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;parContext.startActivity&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;elIntento&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;80&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;81&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;82&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;83&lt;/span&gt; &lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Courier New;color:#7f0055;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;SMSActivity.java&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#808080;"&gt;01&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;package &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;com.northvortex.sms;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;02&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;03&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.app.Activity;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;04&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;import &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;android.os.Bundle;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;05&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;06&lt;/span&gt; &lt;span style="color:#3f5fbf;"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;07&lt;/span&gt; &lt;span style="color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;* &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;08&lt;/span&gt; &lt;span style="color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;* Este es la clase que gatillare despues de mostrar el contenido del mensaje.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;09&lt;/span&gt; &lt;span style="color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;*&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;10&lt;/span&gt; &lt;span style="color:#ffffff;"&gt; &lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;*/&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;11&lt;/span&gt; &lt;span style="color:#7f0055;"&gt;&lt;b&gt;public class &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;SMSActivity&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;12&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;   &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;extends &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Activity&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;13&lt;/span&gt; &lt;span style="color:#000000;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;14&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;   &lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;/**&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;15&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;* Esta clase es llamada la  vez que la actividad es creada.&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;16&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#3f5fbf;"&gt;*/ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;17&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;   &lt;/span&gt;&lt;span style="color:#646464;"&gt;@Override &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;18&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;   &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;onCreate&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;Bundle parICicle&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;19&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;20&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;      &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.onCreate&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;parICicle&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;21&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;      &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;22&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;      &lt;/span&gt;&lt;span style="color:#000000;"&gt;setContentView&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;R.layout.main&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;23&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;      &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;24&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;      &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;25&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;   &lt;/span&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;26&lt;/span&gt; &lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Courier New;color:#7f0055;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;AndroidManifest.xml&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#808080;"&gt;01&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;?xml version=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;1.0&amp;#34; &lt;/span&gt;&lt;span style="color:#000000;"&gt;encoding=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;02&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;manifest xmlns:android=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;03&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;package&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;com.northvortex.sms&amp;#34;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;04&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;uses-permission id=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;android.permission.RECEIVE_SMS&amp;#34; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;05&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;application android:icon=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;@drawable/icon&amp;#34;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;06&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;!-- The Main Activity that gets started by the IntentReceiver listed below --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;07&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;activity &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;.SMSActivity&amp;#34; &lt;/span&gt;&lt;span style="color:#000000;"&gt;android:label=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;@string/app_name&amp;#34;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;08&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;            &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;intent-filter&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;09&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;                &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;action android:value=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;android.intent.action.MAIN&amp;#34; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;10&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;                &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;category android:value=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;android.intent.category.LAUNCHER&amp;#34; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;11&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;            &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/intent-filter&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;12&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/activity&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;13&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;!-- This &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;class &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;will react on the SMS show a notification and start the Main-App afterwards --&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;14&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;receiver &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;.SMSReceiver&amp;#34;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;15&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;            &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;intent-filter&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;16&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;                &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;action android:value=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;android.provider.Telephony.SMS_RECEIVED&amp;#34; &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;17&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;            &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/intent-filter&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;18&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;        &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/receiver&amp;gt;     &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;19&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;/application&amp;gt; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;20&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;/manifest&amp;gt; &lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;span style="font-family:Courier New;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;main.xml&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#808080;"&gt;01&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;?xml version=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;1.0&amp;#34; &lt;/span&gt;&lt;span style="color:#000000;"&gt;encoding=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;02&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;LinearLayout xmlns:android=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;http://schemas.android.com/apk/res/android&amp;#34;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;03&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;android:orientation=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;vertical&amp;#34;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;04&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;android:layout_width=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;fill_parent&amp;#34;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;05&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;android:layout_height=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;fill_parent&amp;#34;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;06&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;07&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;TextView  &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;08&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;android:layout_width=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;fill_parent&amp;#34; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;09&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;android:layout_height=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;wrap_content&amp;#34; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;10&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;android:text=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;SMS Activity&amp;#34;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;11&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;12&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;/LinearLayout&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;strings.xml&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#808080;"&gt;1&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;?xml version=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;1.0&amp;#34; &lt;/span&gt;&lt;span style="color:#000000;"&gt;encoding=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span style="color:#000000;"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;2&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;resources&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;3&lt;/span&gt; &lt;span style="color:#ffffff;"&gt;    &lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;lt;string name=&lt;/span&gt;&lt;span style="color:#2a00ff;"&gt;&amp;#34;app_name&amp;#34;&lt;/span&gt;&lt;span style="color:#000000;"&gt;&amp;gt;SMS Receptor&amp;lt;/string&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#808080;"&gt;4&lt;/span&gt; &lt;span style="color:#000000;"&gt;&amp;lt;/resources&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-246690525877395389?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/246690525877395389/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=246690525877395389' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/246690525877395389'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/246690525877395389'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/cmo-hacer-reaccionar-un-mensajes-sms.html' title='¿CÓMO HACER? - Reaccionar a un mensajes SMS'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-7436550277254040863</id><published>2007-12-17T08:31:00.000-08:00</published><updated>2008-12-11T14:10:26.451-08:00</updated><title type='text'>¿CÓMO HACER? - Simular envío de SMS al emulador</title><content type='html'>Documento original: &lt;a href="http://www.anddev.org/tinytut_-_simulating_incoming_phone_calls_-_sms_in_eclipse-t293.html"&gt;Simulating incoming Phone Calls / SMS in ECLIPSE&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;En esta nota les explicaré como simular el envío de un mensaje SMS al emulador dentro de Eclipse.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: Para este ejemplo necesitas haber instalado la versión "android_sdk_windows_m3-rc37a" del "Android SDK" o una versión posterior.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;A continuación está las instrucciones paso a paso:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;strong&gt;&lt;span style="font-size:130%;"&gt;PASO #1 - Habilita la perspectiva "DDMS". &lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Para esto presiona el botón "Open Perspective", tal como lo muestra la siguiente figura:&lt;/p&gt;&lt;p&gt;&lt;a href="http://1.bp.blogspot.com/__WZr8mbWg3o/R2ansXr7wcI/AAAAAAAAACs/Lhq1QMJXyQ4/s1600-h/figura-03.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5144984005031739842" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/__WZr8mbWg3o/R2ansXr7wcI/AAAAAAAAACs/Lhq1QMJXyQ4/s400/figura-03.PNG" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;Eso hará que se abra el siguiente menú:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/__WZr8mbWg3o/R2aoHHr7wdI/AAAAAAAAAC0/nqjrdYERrd4/s1600-h/figura-04.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5144984464593240530" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/__WZr8mbWg3o/R2aoHHr7wdI/AAAAAAAAAC0/nqjrdYERrd4/s400/figura-04.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Esto hará que se habrá la ventan "Open Perspective". Selecciona "DDMS" y luego presiona el botón "OK". Como lo muestra la siguiente figura:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/__WZr8mbWg3o/R2aoqHr7weI/AAAAAAAAAC8/jK_tIaJJcyU/s1600-h/figura-05.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5144985065888661986" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/__WZr8mbWg3o/R2aoqHr7weI/AAAAAAAAAC8/jK_tIaJJcyU/s400/figura-05.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;Esto hará que se habilite la perspectiva "DDMS". Como lo muestra la siguiente figura:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://4.bp.blogspot.com/__WZr8mbWg3o/R2apxHr7wfI/AAAAAAAAADE/tjMLLOxRTVY/s1600-h/figura-06.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5144986285659374066" style="CURSOR: hand" alt="" src="http://4.bp.blogspot.com/__WZr8mbWg3o/R2apxHr7wfI/AAAAAAAAADE/tjMLLOxRTVY/s400/figura-06.PNG" border="0" /&gt;&lt;/a&gt; &lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: En WINDOWS, después de habilitar esta perspectiva tendrás que reiniciar Eclipse ya que se perderán momentaneamente los tabuladores de la ventan "Run". &lt;/p&gt;&lt;p&gt;&lt;a href="http://2.bp.blogspot.com/__WZr8mbWg3o/R2asXnr7wgI/AAAAAAAAADM/ULt6wVsvw70/s1600-h/figura-07.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5144989146107593218" style="CURSOR: hand" alt="" src="http://2.bp.blogspot.com/__WZr8mbWg3o/R2asXnr7wgI/AAAAAAAAADM/ULt6wVsvw70/s320/figura-07.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;PASO #2 - Envío del SMS&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;Para esto ejecuta alguno de tus proyectos, de esa forma la perspectiva "DDMS" se activará.&lt;br /&gt;&lt;br /&gt;Una vez que tu aplicación esté corriendo, selecciona la perspectiva "DDMS". Dentro de esta perspectiva verás la siguiente el marco "Emulator Control". Usa estos controles para enviar tu mensaje SMS, tal como lo muestra la siguiente figura:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://1.bp.blogspot.com/__WZr8mbWg3o/R2at1Xr7whI/AAAAAAAAADU/IMXyR2kpHig/s1600-h/figura-08.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5144990756720329234" style="CURSOR: hand" alt="" src="http://1.bp.blogspot.com/__WZr8mbWg3o/R2at1Xr7whI/AAAAAAAAADU/IMXyR2kpHig/s400/figura-08.PNG" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-7436550277254040863?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/7436550277254040863/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=7436550277254040863' title='4 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7436550277254040863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7436550277254040863'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/cmo-hacer-simular-envo-de-sms-al.html' title='¿CÓMO HACER? - Simular envío de SMS al emulador'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__WZr8mbWg3o/R2ansXr7wcI/AAAAAAAAACs/Lhq1QMJXyQ4/s72-c/figura-03.PNG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-244378987449311055</id><published>2007-12-15T12:48:00.000-08:00</published><updated>2007-12-16T10:01:08.521-08:00</updated><title type='text'>Usando aapt</title><content type='html'>Documento original : &lt;a href="http://code.google.com/android/reference/aapt.html"&gt;Using aapt &lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Usando "aapt"&lt;/strong&gt; (Using aapt)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Las siglas "&lt;strong&gt;aapt&lt;/strong&gt;" corresponde a "Android Asset Packaging Tool" y la puedes encontrar en el directorio "&lt;strong&gt;tools/&lt;/strong&gt;" del "SDK". Esta herramienta te permite examinar, crear y actualizar archivos compatibles con "ZIP" (zip, jar, apk).  También puede convertir (compilar) archivos de recursos a material binario.&lt;br /&gt;&lt;br /&gt;Aunque probablemente tú no utilices directamente "aapt", algunos "scripts" y "plugins" para IDEs pueden utilizar esta herramienta para empaquetar los archivos de una aplicación Android en un archivo ".apk".&lt;br /&gt;&lt;br /&gt;Para más detalles de cómo usar este comando, abre una consola de comandos y navega al directorio "tools/" y ejecuta el comando:&lt;br /&gt;&lt;br /&gt;Linux:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#000000;"&gt;./aapt&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Windows:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#000000;"&gt;aapt.exe&lt;/span&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-244378987449311055?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/244378987449311055/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=244378987449311055' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/244378987449311055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/244378987449311055'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/android-asset-packaging-tool.html' title='Usando aapt'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-613987045566262761</id><published>2007-12-14T20:36:00.000-08:00</published><updated>2007-12-30T14:02:24.013-08:00</updated><title type='text'>Manos a la obra - Herramientas para el desarrollo</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/intro/tools.html"&gt;Development Tools&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Herramientas de desarrollo&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Development Tools&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El "&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra.html"&gt;Android SDK&lt;/a&gt;" incluye una variedad de herramientas especialmente diseñadas para ayudarte en el desarrollo de aplicaciones móbiles sobre la plataforma Android. La herramienta más importante es el "Android Emulator" y las "Android Development Tools" plugin para Eclipse", pero el SDK también incluye un surtido de otras herramientas para depuración, empaquetado e instalación de aplicaciones en el dispositivo o emulador.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Emulador Android&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Emulator &lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El "Android Emulator" es un dispositivo virtual que corren en tu computador. El emulador tiene como finalidad ayudarte a diseñar, depurar y testear tus aplicaciones en un ambiente similar al que existe en un dispositivo real.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Android Development Tools Plugin para Eclipse IDE&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Development Tools Plugin for the Eclipse IDE&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El "ADT plugin" agrega poderosas extensiones al ambiente integrado de Eclipse haciendo que la creación y depuración de tus aplicaciones Android sea fácil y rápida. Si tú desarrollas estás usando Eclipse, el "ADT plugin" te da un increíble estímulo para el desarrollo de las aplicaciones Android. A continuación algunas de sus características:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Provee acceso a otras herramientas de desarrollo de Android desde el entorno de Eclipse IDE. Por ejemplo, "ADT" te permite el acceso a muchas de las capacidades de la herramienta "DDMS", tales como tomar fotografías de la pantalla, administrar el redireccionamiento de puertos, fijar puntos de quiebre y examinar la información "thread" y procesos directamente dentro de Eclipse. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Provee un asistente para la creación de proyectos Android, el cual te ayuda a crear rapidamente todos los directorios y archivos necesarios para crear una nueva aplicación Android. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Automatiza y simplifica el proceso de construcción de una aplicación. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Provee un editor de código Android que te ayuda a escribir XML válido para el archivo "&lt;a href="http://code.google.com/android/devel/bblocks-manifest.html"&gt;AndroidManifest.xml&lt;/a&gt;". &lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Para mayor información sobre "ADT plugin", incluyendo las instrucciones de instalación, lee "&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra.html"&gt;Instalando el SDK&lt;/a&gt;". Para estudiar un simple ejemplo, lee "&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-hola-androide.html"&gt;Hola Androide!&lt;/a&gt;". &lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Dalvik Debug Monitor Service - ddms&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Dalvik Debug Monitor Service - ddms&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;La "Dalvik Debug Monitor Service" es un herramienta integrada con la "&lt;a href="http://en.wikipedia.org/wiki/Dalvik_virtual_machine"&gt;Dalvik Virtual Machine&lt;/a&gt;", y nos permite administrar los procesos que corren en una instancia de emulador/dispositivo y nos asiste en la depuración de ellos. Podemos usar esta herramienta para terminar la ejecución de un proceso, seleccionar un determinado proceso para depurar, generar reportes a partir de información de bitácoras, examinar el "heap" y la información de "thread, tomar fotografías de la pantalla del emulador/dispositivo y mucho más.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Android Debug Bridge - adb&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Debug Bridge - adb&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;La herramienta "adb" nos permite instalar nuestras aplicaciones (archivos ".apk") en una instancia de emulador/dispositivo y accesar una instancia de emulador/dispositivo usando comandos de línea. También podemos utilizarlo para enlazar un depurador estándar al código de una aplicación que esté corriendo en una instancia de emulador/dispositivo. &lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Herramienta Android Asset Packaging - aapt&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Asset Packaging Tool - aapt&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;La herramienta "aapt" te permite crear archivos ".apk", los cuales contienen las imágenes binarias de tu código y recursos de tus aplicaciones.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Android Interface Description Language - aidl&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Interface Description Language - aidl&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Te permite generar código para una interface de interproceso, tal como la que un servicio podría utilizar.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;sqlite3&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;sqlite3&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Esta herramienta ha sido incluida para comodidad de los desarrolladores. Nos provee acceso a los archivos de datos "SQLite" creados y usados por las aplicaciones Android.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Traceview&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Traceview&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Esta herramienta produce una vista gráfica del análisis de información contenida en bitácoras que puede ser generada desde una aplicación Android.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;mksdcard&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;mksdcard&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Esta herramientas nos ayuda a crear una imagen de disco que podemos usar con el emulador, para simular la presencia de una tarjeta de almacenamiento externa (tal como una tarjeta "SD"). &lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;dx&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;dx&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;La herramienta "dx" convierte los archivos de "bytecode" estándar (".class") en archivos "Android bytecode" ("&lt;a href="http://code.google.com/android/reference/glossary.html"&gt;.dex&lt;/a&gt;").&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;activityCreator&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;activityCreator&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Es un "script" que genera archivos "Ant build" que puedes utilizar para compilar tus aplicaciones Android. Si tú estas desarrollando con Eclipse y "ADT plugin", no necesitas utilizar "activityCreator". &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-613987045566262761?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/613987045566262761/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=613987045566262761' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/613987045566262761'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/613987045566262761'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/herramientas-para-el-desarrollo.html' title='Manos a la obra - Herramientas para el desarrollo'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-596017335722821498</id><published>2007-12-14T14:35:00.000-08:00</published><updated>2007-12-14T20:35:51.038-08:00</updated><title type='text'>Manos a la obra - Tutorial - Depurando tu aplicación</title><content type='html'>Documento original: &lt;a href="http://code.google.com/android/intro/tutorial-extra-credit.html"&gt;Tutorial: Extra Credit&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En este ejercicio, vas a usar el depurador para mirar de cerca el trabajo que hicimiento en el tutorial anterior &lt;a href="http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial-ejercicio-3.html"&gt;Manos a la obra - Tutorial - Ejercicio #3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Aprenderás a:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fijar un punto de quiebre para examinar la ejecución de la aplicación.&lt;/li&gt;&lt;li&gt;Cómo correr una aplicación en modo de depuración.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Usando el proyecto "Notepadv3", colocaremos un punto de quiebre al comienzo del código fuente de los métodos "onCreate()", "onPause()", "onFreeze()" y "onResume()" de la clase "NoteEdit".&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;NOTE&lt;/span&gt;: Para crear un punto de quiere (breakpoint) en Eclipse basta que abrás el menú emergente (clic con botón derecho) del borde gris del lado izquierdo de la ventana de edición, directamente sobre la línea en la cual quieres poner el punto de quiebre. Cuando aparesca el menú emergente, selecciones la opción "&lt;strong&gt;Toggle Breakpoint&lt;/strong&gt;" y luego un punto azul debería aparecer sobre el borde gris.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora inicializaremos la aplicación en mode de depuración:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abre el menú emergente del proyecto "Notepadv3", expande la opción "&lt;span style="FONT-WEIGHT: bold"&gt;Debug As&lt;/span&gt;" y selecciona "&lt;span style="FONT-WEIGHT: bold"&gt;Android Application&lt;/span&gt;".&lt;/li&gt;&lt;li&gt;El emulador de Android debería desplegar por un instante el mensaje "waiting for debugger to connect" y entonces iniciar la ejecución de la aplicación. &lt;/li&gt;&lt;li&gt;Si llegará a quedarse pegado en la pantalla de "waiting...", termina la ejecución del emulador y también Ecliose. Luego, desde una terminal de comandos ejecuta el comando "&lt;span style="FONT-WEIGHT: bold"&gt;adb kill-server&lt;/span&gt;" y entonces reinicia Eclipse y volver a intentar los pasos anteriores. &lt;/li&gt;&lt;/ul&gt;&lt;strong&gt;Paso 3&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Al momento de crear una nueva nota deberías ver que la aplicación se detiene en uno de los puntos de quiebre que hemos definido.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Paso 4&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Presiona el botón "&lt;strong&gt;Resume&lt;/strong&gt;" para que la ejecución de la aplicación continúe (el botón "Resume" es aquel rectángulo amarillo con un triángulo verde a su derecha. Está ubicado en el lado izquierdo de la barra de herramientas de Eclipse).&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Paso 5&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Experimenta un poco presionando los botones "Confirm" y "Back". Prueba presional el botón "Home" y observa los eventos del ciclo de vida que son generados como resultado de esta operación.&lt;br /&gt;&lt;br /&gt;El "Android Eclipse plugin" no sólo ofrece un excelente soporte para depuración de tus aplicaciones, sino que además un poderoso soporte para perfilar (profiling). Si tu aplicación está corriendo muy lento, esta característica del plugin puede ayudarte a encontrar los cuello de botella y corregirlos.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-596017335722821498?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/596017335722821498/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=596017335722821498' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/596017335722821498'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/596017335722821498'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial-depurando-tu_14.html' title='Manos a la obra - Tutorial - Depurando tu aplicación'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-5765184080944351634</id><published>2007-12-13T14:43:00.000-08:00</published><updated>2007-12-19T19:32:17.521-08:00</updated><title type='text'>Android Debug Bridge</title><content type='html'>&lt;h1&gt;&lt;a href="#"&gt;Android Debug Bridge&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Debug Bridge&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/reference/adb.html"&gt;Android Debug Bridge&lt;/a&gt;&lt;/p&gt;&lt;p&gt;El &lt;a href="http://celutron.blogspot.com/2007/12/android-debug-bridge.html"&gt;"Android Debug Bridge"&lt;/a&gt; (&lt;a href="http://code.google.com/android/reference/adb.html"&gt;"adb"&lt;/a&gt;) es un herramienta muy versátil que te permite controlar el estado de un dispositivo o un emulador.&lt;/p&gt;&lt;p&gt;Algunas de las funciones cosas que puedes hacer con &lt;a href="http://code.google.com/android/reference/adb.html"&gt;"adb"&lt;/a&gt; son:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Actualización de código del dispositivo o emulador, tales como aplicaciones o actualizaciones del sistema Android.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ejecutar comandos de "shell" en el dispositivo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Administrar el direccionamiento de puertos de un emulator o dispositivo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Copiar archivos hacia o desde un emulador o dispositivo.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Las siguientes secciones describen algunos de los comandos más comunes de usar con &lt;a href="http://code.google.com/android/reference/adb.html"&gt;"adb"&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Introducción&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Overview&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;La herramienta &lt;a href="http://code.google.com/android/reference/adb.html"&gt;"adb"&lt;/a&gt; es un programa cliente/servidor que incluye los siguientes componentes:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Un cliente que corre en tu máquina de desarrollo. Tú puedes invocar este cliente desde una consola de comandos ejecutando el comando &lt;a href="http://code.google.com/android/reference/adb.html"&gt;"adb"&lt;/a&gt;. Otras herramientas de Android, tales como el "ADT plugin" y "DDMS", crean sus propios clientes &lt;a href="http://code.google.com/android/reference/adb.html"&gt;"adb"&lt;/a&gt;. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Un servidor que se ejecuta como un proceso en segundo plano en tu máquina de desarrollo. Este servidor administra la comunicación entre el cliente y el "adb daemon" que corre dentro del emulador o dispositivo. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Un "daemon" que se ejecuta como un proceso de segundo plano en cada instancia de un emulador o dispositivo.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Cuando tú inicias un cliente &lt;a href="http://code.google.com/android/reference/adb.html"&gt;"adb"&lt;/a&gt;, lo primero que hace este cliente es verificar si hay un proceso servidor "adb" que esté corriendo. Si no lo hay, entonces el cliente inicia un proceso servidor "adb". Cuando el proceso servidor "adb" comienza a ejecutarse, asocia su servicio al puerto TCP número 5037 y se queda escuchando la llegada de comandos enviados desde los clientes "adb". Todos los clientes "adb" utilizan el puerto 5037 para comunicarse con el servidor "adb".&lt;/p&gt;&lt;p&gt;Posteriormente, el servidor "adb" establece conexiones hacia todas las instancias de emuladores/dispositivos que estén corriendo. El servidor "adb" localiza a las instancias de emuladores/dispositivos examinando todos los puertos con número impar dentro del rango de 5555 a 5585, el cual es el rango utilizado por los emuladores/dispositivos. Cuando el servidor "adb" encuentra un "adb daemon", estable de inmediato una conexión con él. Algo importante de saber es que cada emulador/dispositivo adquiere un par de puertos consecutivos: &lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;un puerto de número par para recibir solicitudes de conexión de consola.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;un número de puerto impar para las conexiones con el servidor "adb".&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Por ejemplo:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Emulador #1:&lt;br /&gt;consola: 5554&lt;br /&gt;adb daemon: 5555&lt;br /&gt;&lt;br /&gt;Emulador #2:&lt;br /&gt;consola: 5556&lt;br /&gt;adb daemon: 5557&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Como se muestra en el ejemplo anterior, la instancia del emulador que está conectada con el servidor "adb" a través del puerto 5555, es la misma instancia cuya consola está escuchando en el puerto 5554.&lt;/p&gt;&lt;p&gt;Una vez que el servidor "adb" ha establecido las conexiones con las instancias de los emuladores/dispositivos, podemos comenzar a usar comandos "adb" para controlar y tener acceso a esas instancias. Debido a que el servidor "adb" administra las conexiones hacia todas las instancias de emuladores/dispositivos y maneja los comandos enviados por múltiples clientes "adb", podemos controlar cualquier instancia de un emulador/dispositivo desde cualquier cliente "adb" o "script".&lt;/p&gt;&lt;p&gt;Las secciones que leerás a continuación describen los comandos que tú puedes utilizar para utilizar las capacidades de "adb" y administrar el estado de un emulador/dispositivo. Ten en consideración que si tu estás desarrollando aplicaciones Android en Eclipse y has instalado el "ADT plugin", no es necesario que invoques "adb" desde una consola de comandos. El "ADT plugin" provee una integración transparente con "adb" dentro del entorno de desarrollo de Eclipse. Sin embargo, siempre puedes utilizar "adb" directamente.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Utilizando comandos "adb"&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Issuing adb Commands&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Puedes invocar cualquier comando "adb" desde una consola de comandos en tu máquina de desarrollo o desde un "script". La sintáxis de los comandos es: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb [-d {&amp;lt;ID&amp;gt;&amp;lt;serialNumber&amp;gt;}] &amp;lt;command&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cuando tú When you despachar un comando, el programa invoca un cliente "adb", el cual no está asociado a ninguna instancia de emulador en particular, por lo tanto si hay múltiples emuladores/dispositivos corriendo tienes que utilizar el parámetro "-d" para indicar la instancia hacia la cual el comando debe ser dirigido. Para mayor información sobre cómo usar este parámetro lee "Dirigiendo comando hacia un emulador/dispositivo específico".  &lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Averiguando qué emuladores/dispositivos están conectados&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Querying for Emulator/Device Instances&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Antes de comenzar a ejecutar comando "adb", es de mucha utilidad saber qué instancias de emuladores/dispositivos están conectadas al servidor "adb". Para obtener un listado de las instancias de emuladores/dispositivos que están corriendo y el estado de cada uno de ellos, podemos usar el siguiente comando:&lt;/p&gt;&lt;p /&gt;&lt;p&gt;En respuesta, "adb" imprime la siguiente información de estado para cada una de las instancias:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Idetificador : es un identificador asignado por "adb" a cada instancia que es inicializada ("adb" asigna el identificador "1" a la primera instancia inicializada, y así sucesivamente).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Número de serie : es una cadena de caracteres creada por "adb" para identificar de manera única a cada instancia de emulaor/dispositivo asociado a un puerto específico. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Estado : es el estado de la conexión de la instancia. Hay tres estados que son soportados: (A) device : indica que la instancia está conectada al servidor "adb". (B) offline : indica que la instancia no está conectada o no responde. (C) bootloader : indica que el "bootloader" está corriendo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Bloqueo: Indica si la instancia está bloqueada. Un valor de "0" significa que está no está bloqueada. &lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;La salida de cada instancia es desplegada con el siguiente formato:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;[ID] [serialNumber] [state] [lock]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Este es un ejemplo de cómo podría ser la salida de este comando:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ adb devices&lt;br /&gt;List of devices attached &lt;br /&gt;1 emulator-tcp-5555 device 0&lt;br /&gt;2 emulator-tcp-5557 device 0&lt;br /&gt;3 emulator-tcp-5559 device 0&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si no hubiera ningún emulador/dispositivo corriendo, "adb" imprimiría "no device".&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Dirigiendo comando hacia un emulador/dispositivo específico&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Directing Commands to a Specific Emulator/Device Instance&lt;/b&gt;]&lt;/p&gt;&lt;p&gt; Si múltiples instancias de emuladores/dispositivos están corriendo, necesitas indicar a cual de ellas vas a dirigir tus comandos. Para hacer esto, usa el parámetro "-d" en cada uno de los comandos. La sintáxis para este parámetros es:&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Como se mostró, indicas la instancia objetivo utilizando el número de serie que "adb" asignó a cada una de ellas. Puedes utilizar el comando "devices" para obtener el número serial de las instancias de emuladores/dispositivos que estén corriendo.&lt;/p&gt;&lt;p&gt;A continuación hay dos ejemplos:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb -d 2 install helloWorld.apk&lt;br /&gt;&lt;br /&gt;adb -d emulator-tcp-5557 install helloWorld.apk&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ten en consideración que si envias un comando sin indicar el emulador/dispositivo objetivo, entonces "adb" por omisión enviará al comando a la primera instancia asociada al puerto "5555" (si es que hubiera una instancia conectada a ese puerto).&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Instalación de una aplicación&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Installing an Application&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Tú puedes utilizar "adb" para copiar una aplicación desde tu computador de desarrollo e instalar la en una instancia de emulador/dispositivo. Para hacer esto, usa el comando "install". Al usar este comando tú tienes que indicar la ubicación del archivo ".apk" que deseas instalar:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb install path_to_apk &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Para mayor información sobre cómo crear un archivo ".apk" que pueda ser instalado en una instancia de emulador/dispositivo lee "Usando aapt". &lt;/p&gt;&lt;p&gt;NOTA: Si tú estás usando Eclipse e instalaste "ADT plugin", no necesitas usar "adb" o "aapt" para instalar tus aplicaciones en el emulador/dispositivo. El "ADT plugin" se encarga del empaquetado e instalación de las aplicación. &lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Redireccionamiento de puerto&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Port Forwarding&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Podemos usar el comando "forward" para fijar arbitrariamente el redireccionamiento de un puerto, y así direccionar los requerimientos de un puerto hacia uno diferente en una instancia de un emulador/dispositivo. A continuación hay un ejemplo de cómo fijar el redireccionamiento del puerto 6100 en el host al puerto 7100 en el emulador/dispositivo:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb forward tcp:6100 tcp:7100&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;También podemos usar "adb" para redireccionar un puerto hacia un dominio de socket abstracto de UNIX. El siguiente ejemplo ilustra este caso: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb forward tcp:5556 local:logd &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a href="#"&gt;Copiando archivos desde o hacia una instancia de emulador/dispositivo&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Copying Files to or from an Emulator/Device Instance&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Podemos usar los comandos "pull" y "push" para copiar archivos hacia y desde una instancia de emulador/dispositivo. A diferencia del comando "install", el cual sólo copia un archivo ".apk" a una ubicación específica, los comandos "pull" y "push" nos permiten copiar archivos y directorios arbitrarios a cualquier ubicación dentro de la instancia del emulador/dispositivo. &lt;/p&gt;&lt;p&gt;Para copiar un archivo o directorio (recursivamente) desde el emulador/dispositivo usa:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb pull &amp;lt;remote&amp;gt; &amp;lt;local&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Para copiar un archivo o directorio (recursivamente) hacia el emulador/dispositivo usa: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb push &amp;lt;local&amp;gt; &amp;lt;remote&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En los comandos, "local" y "remote" se refieren a ubicaciones de archivos/directorios en tu máquina de desarrollo ("local") y en la instancia del emulador/dispositivo ("remote").&lt;/p&gt;&lt;p&gt;A continuación se muestra un ejemplo:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb push foo.txt /tmp/foo.txt&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a href="#"&gt;Listado de comandos "adb"&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Listing of adb Commands&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;A continuación se listan los comandos soportados por "adb" y se explica su significado y uso:&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Categoría: Opcional&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Category: Option&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando: -d {&amp;lt;ID&amp;gt;&amp;lt;serialNumber&amp;gt;}&lt;br /&gt;Descripción: Permite que indiquemos una instancia de emulador/dispositivo a la cual deseamos enviar un comando. &lt;br /&gt;La instancia del emulador/dispositivo es referenciada utilizando su identificador o número de serie.&lt;br /&gt;Comentario: Si no se indica este parámetro, "adb" dirigirá el comando a la instancia por omisión &lt;br /&gt;(es decir, la instancia que está asociada al puerto "5555". &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Categoría: General&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Category: General&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando: devices&lt;br /&gt;Descripción: Imprime un listado de todos los emuladores/dispositivos que están conectados.&lt;br /&gt;Comentario: Para más detalles lee "Averiguando qué emuladores/dispositivos están conectados".&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: help &lt;br /&gt;Descripción: Imprime un listado con los comandos soportados por "adb"&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: version&lt;br /&gt;Descripción: Imprime la versión de "adb"&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Categoría: Depuración&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Category: Debug&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando: logcat [&amp;lt;option&amp;gt;] [&amp;lt;filter-specs&amp;gt;]&lt;br /&gt;Descripción: Imprime el log de datos en la pantalla.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: bugreport&lt;br /&gt;Descripción: Imprime información de "dumpsys", "dumpstate" y "logcat" en la pantalla, con el propósito de crear un reporte de defectos.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Categoría: Datos&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Category: Data&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando: install &amp;lt;path-to-apk&amp;gt;&lt;br /&gt;Descripción: Instala una aplicación Android en el emulador/dispositivo (debe indicarse la ubicación completa del archivo ".apk".&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: pull &amp;lt;remote&amp;gt; &amp;lt;local&amp;gt;&lt;br /&gt;Descripción: Copia un determinado archivo desde una instancia de emulador/dispositivo hacia tu máquina de desarrollo.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: push &amp;lt;local&amp;gt; &amp;lt;remote&amp;gt;&lt;br /&gt;Descripción: Copia un determinado archivo desde tu máquina de desarrollo hacia una instancia del emulador/dispositivo.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Categoría: Puertos y redes&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Category: Ports and Networking&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando: forward &amp;lt;local&amp;gt; &amp;lt;remote&amp;gt;&lt;br /&gt;Descripción: Direcciona conexiones de socket desde un específico puerto local a un específico puerto remoto en una instancia de emulador/dispositivo.&lt;br /&gt;Comentario: La especificación de un puerto puede utilizar los siguientes esquemas:&lt;br /&gt;&lt;br /&gt;tcp:&amp;lt;portnum&amp;gt; &lt;br /&gt;local:&amp;lt;UNIX domain socket name&amp;gt; &lt;br /&gt;dev:&amp;lt;character device name&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: ppp &amp;lt;tty&amp;gt; [parm]...&lt;br /&gt;Descripción: Ejecuta "PPP" sobre "USB".&lt;br /&gt;&amp;lt;tty&amp;gt; es el "tty" para el "PPP stream". Por ejemplo, "dev:/dev/omap_csmi_ttyl.&lt;br /&gt;[parm]... es cero o más opciones "PPP/PPPD", tales como "defaultroute", "local", "notty", etc.&lt;br /&gt;NOTA: No debería iniciar automáticamente una conexión "PDP".&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Categoría: Comandos de línea&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Category: Scripting&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando: get-serialno&lt;br /&gt;Descripción: Imprime el identificador de la instancia.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: get-state&lt;br /&gt;Descripción: Imprime el estado "adb" de una instancia de emulador/dispositivo.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: wait-for-bootloader&lt;br /&gt;Descripción: Bloquea la ejecución hasta que el "bootloader" esté en línea, esto es hasta que el estado de la instancia es "bootloader".&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: wait-for-device&lt;br /&gt;Descripción: Bloquea la ejecución hasta que el dispositivo esté en línea, esto es hasta que el estado de la instancia es "device".&lt;br /&gt;Comentario: Este comando puede ser anexado a otros comandos "adb". &lt;br /&gt;En este caso, "adb" va a esperar hasta que la instancia del emulador/dispositivo esté conectada antes de enviar el otro comando. &lt;br /&gt;Por ejemplo: adb wait-for-device &amp;lt;command&amp;gt;.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Categoría: Servidor&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Category: Server&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando: start-server&lt;br /&gt;Descripción: Verifica si el proceso del servidor "adb" está corriendo y lo activa si no lo estuviera.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: kill-server&lt;br /&gt;Descripción: Termina el proceso del servidor "adb".&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Categoría: Intérprete de comandos&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Category: Shell&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando: shell&lt;br /&gt;Descripción: Inicia una "shell" remota en la instancia del emulador/dispositivo objetivo.&lt;br /&gt;Comentario: Lee "Enviando comandos de shell".&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando: shell [&amp;lt;shellCommand&amp;gt;]&lt;br /&gt;Descripción: Envia un comando de "shell" a la instancia del emulador/dispositivo objetivo y luego termina la "shell" remota.&lt;br /&gt;Comentario: Lee "Enviando comandos de shell".&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a href="#"&gt;Enviando comandos al intérprete de comandos&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Issuing Shell Commands&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Podemos usar el comando "shell" para enviar comandos de "shell" remotos a una instancia de emulador/dispositivo. Podemos enviar un simple comando sin tener que abrir una sesión remota de "shell" o también podemos abrir una sesión de shell en donde naveguemos y enviemos comandos UNIX.&lt;/p&gt;&lt;p&gt;Para enviar un simple comando sin ingresar a una sesión remota de "shell", usa el siguiente comando:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb [-d {&amp;lt;ID&amp;gt;&amp;lt;serialNumber&amp;gt;}] shell &amp;lt;shellCommand&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Para abrir una sesión remota de "shell" en una instancia de emulador/dispositivo, usa el siguiente comando:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb [-d {&amp;lt;ID&amp;gt;&amp;lt;serialNumber&amp;gt;}] shell&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cuando hayas terminado de ejecutar tus comando, usa "CTRL+D" o "exit" para cerrar la sesión de "shell".&lt;/p&gt;&lt;p&gt;Las siguientes secciones proveen más información sobre comandos de "shell" que tú podrías utilizar.&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Examinando base de datos sqlite3 desde una shell remota&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Examining sqlite3 Databases from a Remote Shell&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Desde una sesión de shell remota, podemos usar "sqlite3", el cual es un programa de comandos de línea para administrar las base de datos "SQLite" creadas por las aplicaciones. La herramienta "sql3" incluye comandos de mucha utilidad, tales como ".dump" que permite imprimir el contenido de una tabla, y ".schema" que permite genera la sentencia "SQL CREATE" necesaria para reproducir una tabla existente. La herramienta también te provee la capacidad de ejecutar comando dinámicamente. &lt;/p&gt;&lt;p&gt;Para usar "sqlite3", ingresa a una sesión de "shell" remota en la instancia del emulador, tal como se describió anteriormente, y luego invoca la herramienta usando el comando "sqlite3". De manera opcional, al invocar "sqlite3" puedes especificar la ubicación completa de la base de datos que deseas explorar. Las bases de datos en el emulador o dispositivo son almacenadas en el directorio "/data/data/nombrepaquete/databases/".&lt;/p&gt;&lt;p&gt;A continuación se muestra dos ejemplos:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ adb -d emulator-tcp-5557 shell&lt;br /&gt;# sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db&lt;br /&gt;SQLite version 3.3.12&lt;br /&gt;Enter ".help" for instructions&lt;br /&gt;.... enter commands, then quit...&lt;br /&gt;sqlite&amp;gt; .exit &lt;br /&gt;&lt;br /&gt;C:\Android SDK\android_sdk_windows_m3-rc20a\tools&amp;gt;adb shell&lt;br /&gt;sqlite3 /data/data/com.google.android.providers.contacts/databases/contacts.db&lt;br /&gt;sqlite&amp;gt; .tables&lt;br /&gt;.tables&lt;br /&gt;_deleted_people contact_methods peopleLookup&lt;br /&gt;calls people phones&lt;br /&gt;sqlite&amp;gt; .exit&lt;br /&gt;.exit&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Una vez que has invocado "sqlite3", puedes ingresar comandos "sqlite3" en la "shell". Pata terminar la sesión y retornar a la sesión de "shell" remota de "adb" usa el comando "exit" o "CTRL+D". &lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Otros comandos del intérprete de comandos&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Other Shell Commands&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Comando de shell: dumpsys&lt;br /&gt;Descripción: Vacía el contenido de los datos del sistema.&lt;br /&gt;Comentario: La herramienta "Dalvik Debug Monitor Service (DDMS)" ofrece un entorno integrado de depuración que encontrarás más sencillo de utilizar.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando de shell: dumpstate&lt;br /&gt;Descripción: Vacía la información de estado a un archivo.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando de shell: logcat [&amp;lt;option&amp;gt;]... [&amp;lt;filter-spec&amp;gt;]...&lt;br /&gt;Descripción: Habilita el "radio logging" e imprime la salida a la pantalla.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando de shell: dmesg&lt;br /&gt;Descripción: Imprime los mensajes de depuración a la pantalla.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando de shell: start&lt;br /&gt;Descripción: Activa (reinicializa) una instancia de emulador/dispositivo.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Comando de shell: stop&lt;br /&gt;Descripción: Detiene la ejecución de una instancia de emulador/dispositivo.&lt;br /&gt;Comentario:&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a href="#"&gt;Habilitando logcat&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Enabling logcat Logging&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El sistema de bitácora de Android provee un mecanismo para recolectar y ver la información de depuración del sistema. Bitácoras de varias aplicaciones y porciones del systema son recolectadas en una serie de áreas de memoria temporal, las cuales pueden ser vistas y filtradas a través del comando "logcat".&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Usando comandos "logcat"&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Using logcat Commands&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Tú puedes usar el comando para ver y seguir el contenido de la bitácora del sistema. La sintaxis general de uso es:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;[adb] logcat [&amp;lt;option&amp;gt;] ... [&amp;lt;filter-spec&amp;gt;] ...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Las secciones a continuación explican las especificaciones de filtrado y las opciones del comando. Para mayor información lee "Listado de opciones del comando logcat".&lt;/p&gt;&lt;p&gt;Tú puedes usar el comando "logcat" desde tu computador de desarrollo o desde una sesión de "shell" remota en una instancia de emulador/dispositivo. Para ver la salida de la bitácora en tu computador de desarrollo, usa el siguiente comando:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;$ adb logcat&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;y desde la sesión de "shell" remota, usa el siguiente comando:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;# logcat&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Filtrando la salida de la bitácora&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Filtering Log Output&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Cada mensaje de bitácora de Android tiene una etiqueta y una prioridad asociada.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;La etiqueta de un mensaje de bitácora es una pequeña cadena de caracteres indicando el componente de sistema donde el mensaje fue originado (por ejemplo, "View" para una vista del sistema). &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;La prioridad es uno de los siguientes caracteres, ordenados desde la más baja a la más alta prioridad:&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;pre&gt;&lt;code&gt;V - Verbose (baja prioridad) &lt;br /&gt;D - Debug &lt;br /&gt;I - Info &lt;br /&gt;W - Warning &lt;br /&gt;E - Error &lt;br /&gt;F - Fatal &lt;br /&gt;S - Silent (alta prioridad, en la cual nada es impreso) &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tú puedes obtener una lista de etiquetas usadas en el sistema junto con las prioridades, ejecutando el comando "logcat" y examinando las primeras dos columnas de cada mensaje dado como: &amp;lt;priority&amp;gt;/&amp;lt;tag&amp;gt;.&lt;/p&gt;&lt;p&gt;A continuación hay un ejemplo de la salida de "logcat" que muestra un mensaje asociado con la prioridad de nivel "I" y con la etiqueta "ActivityManager":&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Para reducir la salida de la bitácora a un nivel manejable, tú puedes restringir la cantidad de información usando expresiones que filtren estos datos. Las expresiones de filtro te permiten indicarle al sistemas las prioridad y etiquetas en las cuales tú estás interesado y así el sistema suprime todos los otros mensajes.&lt;/p&gt;&lt;p&gt;Una expresión de filtrado sigue el siguiente formato: "tag:priority ...", donde "tag" indica la etiqueta en la cual estamos interesados y "priority" indica el nivel mínimo de prioridad que deseamos examinar. Todos los mensajes para esa etiqueta que sean de la priodidad indica superior serán registrado en la bitácora. Podemos indicar cualquier número de especificaciones "tag:priority" es una expresión de filtrado. Las series de especificaciones son delimitadas por espacios en blanco. &lt;/p&gt;&lt;p&gt;A continuación verás un ejemplo de una expresión de filtrado que suprime todos los mensajes de bitácora excepto aquellos con la etiqueta "ActivityManager" cuya prioridad es "Info" o superior, y todos los mensajes con etiqueta "MyApp" con prioridad "Debug" o superior:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb logcat ActivityManager:I MyApp:D *:S&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;El elemento final de la expresión "*:S", fija el nivel de prioridad de todas las etiquetas a "silent", de esa forma nos aseguramos de ver sólo aquellos mensajes con "View" y "MyApp". El uso de "*:S" es una excelente forma de asegurar que la salida de la bitácora está restringida a los filtros que nosotros hemos explícitamente indicado y así nuestros filtros actúan como una "lista blanca" de mensajes de bitácora.&lt;/p&gt;&lt;p&gt;La siguiente expresión desplega todos los mensajes de bitácora cuyo nivel de prioridad es "warning" o superior, para todas las etiquetas:&lt;/p&gt;&lt;p&gt;Si tú estás corriendo "logcat" desde tu computador de desarrollo (en vez de correrlo en una sesión de "shell" remota), también puedes fijar una expresión de filtrado por omisión. Para hacer esto exporta la variable de entorno "ANDROID_LOG_TAGS":&lt;/p&gt;&lt;pre&gt;&lt;code&gt;export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;NOTA: La variable de entorno "ANDROID_LOG_TAGS" no es exportada a la instancia del emulador/dispositivo, si tú estás corriendo "logcat" desde una sesión de "shell" remota o usando "adb shell logcat".&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Controlando la salida de la bitácora&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Controlling Log Output Format&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Los mensaje de bitácora, además de las etiquetas y nivel de prioridad, contienen información de metadatos. Podemos modificar el formato de salida de los mensajes para que se desplegue determinada información de metadatos. Para hacer esto, usa la opción "-v" e indica uno de los siguientes formatos listados a continuación:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;brief   - Desplega prioridad/etiqueta y PID del proceso que originó el mensaje (formato por omisión). &lt;br /&gt;process - Desplega sólo el PID. &lt;br /&gt;tag     - Desplega sólo prioridad/etiqueta. &lt;br /&gt;thread  - Desplega sólo proceso:thread y prioridad/etiqueta. &lt;br /&gt;raw     - Desplega toda la información del mensaje, sin metadatos. &lt;br /&gt;time    - Desplega la fecha, hora de invocación, prioridad/etiqueta y PID del proceso que originó el mensaje. &lt;br /&gt;long    - Desplega toda la información de metadatos y los mensajes separados por líneas en blanco. &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A continuación está la sintaxis general para ejecutar "logcat" e indicar el formato de salida que deseas:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;[adb] logcat [-v &amp;lt;format&amp;gt;]&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Aquí hay un ejemplo que muestra cómo generar mensajes usando el formato "thread": &lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb logcat -v thread&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;NOTA: Sólo puedes indicar un sólo formato de salida con la opción"-v".&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Examinando bitácoras alternativas&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Viewing Alternative Log Buffers&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El sistema de bitácora de Android mantiene múltiples bitácoras circulares para registrar los mensajes de eventos, y no todos los mensajes son enviados a la bitácora circular por omisión. Para examinar mensajes adicionales, puedes correr "logcat" con la opción "-b", lo cual te permitirá ver bitácoras circulares alternativas. Puedes examinar cualquiera de las siguientes bitácoras alternativas: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;radio  - Muestra la bitácora de mensajes relacionados con radio/telefonía.&lt;br /&gt;events - Muestra la bitácora de mensajes conteniendo mensajes asociados a eventos.&lt;br /&gt;main   - Muestra la bitácora principal de mensajes (por omisión) &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sintaxis de uso de la opción "-b":&lt;/p&gt;&lt;pre&gt;&lt;code&gt;[adb] logcat [-b &amp;lt;buffer&amp;gt;]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Aquí hay un ejemplo de cómo examinar la bitácora que contiene mensajes asociados a "radio" y telefonía: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;adb logcat -b radio&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Examinando Viewing stdout y stderr&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Viewing stdout and stderr&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Por omisión, el sistema Android tiene asociado "stdout" y "stderr" ("System.out" y "System.err") con "/dev/null". En procesos que corren "Dalvik VM", el sistema puede escribir una copia de los mensajes de salida a un archivo de bitácora. En este caso, el sistema escribe los mensajes de bitácora usando las etiquetas "stdout" y "stderr", ambas con prioridad "I".&lt;/p&gt;&lt;p&gt;Para rutear la salida de esta forma, debes detener la instancia del emulador/dispositivo y entonces usar el comando de shell "setprop" para habilitar el redireccionamiento de la salida. Aquí se muestra cómo hacerlo: &lt;/p&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;$ adb shell stop&lt;br /&gt;$ adb shell setprop log.redirect-stdio true&lt;br /&gt;$ adb shell start&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;El sistema mantiene esta configuración hasta que tu termines la ejecución de la instancia del emulador/dispositivo. Para usar esta configuración por omisión en la instancia del emulador/dispositivolt debes modificar el archivo "/data/local.prop" en el dispositivo.&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Listado de las opciones del comando logcat&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Listing of logcat Command Options&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Opción: -b &amp;lt;buffer&amp;gt;&lt;br /&gt;Descripción: Carga una bitácora alternativa para ser examinada, tal como "event" o "radio".&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Opción: -c&lt;br /&gt;Descripción: Borra completamente la bitácora y finaliza.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Opción: -d&lt;br /&gt;Descripción: Vacía la bitácora a la pantalla y finaliza.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;&lt;br /&gt;Opción: -f &amp;lt;filename&amp;gt;&lt;br /&gt;Descripción: Escribe los mensajes de bitácora al archivo "filename". Por omisión es "stdout".&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Opción: -g&lt;br /&gt;Descripción: Imprime el tamaño de la bitácora y finaliza.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Opción: -n &amp;lt;count&amp;gt;&lt;br /&gt;Descripción: Fija el número máximo de vueltas de una bitácora a "count". El valor por omisión es "4". Requiere la opción "-r".&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Opción: -r &amp;lt;kbytes&amp;gt;&lt;br /&gt;Descripción: Rota el archivo de bitácora cada "kbytes" de datos. El valor por omisión es "16". Requiere la opción "-f". &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Opción: -s&lt;br /&gt;Descripción: Fija el filtro a "silent". &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre&gt;&lt;code&gt;Opción: -v &amp;lt;format&amp;gt;&lt;br /&gt;Descripción: Fija el formato de salida de los mensajes de bitácora. Por omisión, el formato es "brief". &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Deteniendo el servidor "adb"&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Stopping the adb Server&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;En algunos casos, podrías necesitar detener el proceso del servidor "adb" y luego reiniciarlo. Por ejemplo, si "adb" no está respondiendo a un comando. En este ejemplo, detener y reiniciar el proceso podría resolver el problema.&lt;/p&gt;&lt;p&gt;Para detener el proceso del servidor "adb", usa el comando "kill-server". Posteriormente, puedes reiniciar el servidor enviando cualquier comando "adb". &lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Información adicional&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;No es parte de la documentación oficial&lt;/b&gt;]&lt;/p&gt;&lt;h4&gt;&lt;a href="#"&gt;Ejemplo salida : adb shell dmesg&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;[Título original: &lt;b&gt;No es parte de la documentación oficial&lt;/b&gt;]&lt;/p&gt;&lt;pre&gt;&lt;code&gt;C:\android_sdk_windows_m3-rc22a\tools&amp;gt;adb shell dmesg &lt;br /&gt;&lt;br /&gt;&amp;lt;5&amp;gt;Linux version 2.6.23-gcc3bc3b4 (arve@arvelnx.corp.google.com) (gcc version 4.2.1) #3 Tue Oct 30 16:28:18 PDT 2007 &lt;br /&gt;&amp;lt;4&amp;gt;CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00003137 &lt;br /&gt;&amp;lt;4&amp;gt;Machine: Goldfish &lt;br /&gt;&amp;lt;4&amp;gt;Memory policy: ECC disabled, Data cache writeback &lt;br /&gt;&amp;lt;7&amp;gt;On node 0 totalpages: 24576 &lt;br /&gt;&amp;lt;7&amp;gt; DMA zone: 192 pages used for memmap &lt;br /&gt;&amp;lt;7&amp;gt; DMA zone: 0 pages reserved &lt;br /&gt;&amp;lt;7&amp;gt; DMA zone: 24384 pages, LIFO batch:3 &lt;br /&gt;&amp;lt;7&amp;gt; Normal zone: 0 pages used for memmap &lt;br /&gt;&amp;lt;7&amp;gt; Movable zone: 0 pages used for memmap &lt;br /&gt;&amp;lt;4&amp;gt;CPU0: D VIVT write-through cache &lt;br /&gt;&amp;lt;4&amp;gt;CPU0: I cache: 4096 bytes, associativity 4, 32 byte lines, 32 sets &lt;br /&gt;&amp;lt;4&amp;gt;CPU0: D cache: 65536 bytes, associativity 4, 32 byte lines, 512 sets &lt;br /&gt;&amp;lt;4&amp;gt;Built 1 zonelists in Zone order. Total pages: 24384 &lt;br /&gt;&amp;lt;5&amp;gt;Kernel command line: qemu=1 console=null android.checkjni=1 android.ril=ttyS0 &lt;br /&gt;... &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-5765184080944351634?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/5765184080944351634/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=5765184080944351634' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5765184080944351634'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5765184080944351634'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/android-debug-bridge.html' title='Android Debug Bridge'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-7835645589350000449</id><published>2007-12-12T18:20:00.000-08:00</published><updated>2007-12-13T14:34:01.389-08:00</updated><title type='text'>Manos a la obra - Tutorial - Ejercicio #3</title><content type='html'>Documento original : &lt;a href="http://code.google.com/android/intro/tutorial-ex3.html"&gt;Tutorial: Notepad Exercise 3&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En este ejercicio, usaremos el ciclo de vida de los métodos "callback" asociados a un evento para almacenar y recuperar los datos del estado de la aplicación.&lt;br /&gt;&lt;br /&gt;Este ejercicio demostrará:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;El ciclo de vida de un evento y cómo una aplicación puede hacer uso de ellos.&lt;/li&gt;&lt;li&gt;Técnicas para mantener el estado de la aplicación.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Paso 1&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;La aplicación que terminamos de desarrollar en el tutorial anterior tiene un grave defecto. Si presionas el botón "Back" del dispositivo cuando estás editando una anotación, esto causará que se lance una "exception" producto que la "Activity" que espera datos no podrá recuperar el texto que estaba siendo editado.&lt;/p&gt;&lt;p&gt;Para remediar lo anterior, moveremos parte de la funcionalidad de creación y edición de una anotación dentro de la clase "NoteEdit" y utilizaremos el completo ciclo de vida de una "Activity" en la edición de una anotación.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Importa el proyecto "Notepadv3" dentro de Eclipse. Si se te presenta un error con el archivo "AndroidManifest.xml" o con el archivo "android.zip", abre el menú de contexto del proyecto y selecciona la opción "&lt;strong&gt;Android Tools-&gt;Fix Project Properties&lt;/strong&gt;". El punto de partida de este ejercicio es el proyecto "Notepadv2".&lt;/li&gt;&lt;li&gt;Remove the NoteEdit code to parse out the title and body from the extras bundle. &lt;/li&gt;&lt;li&gt;Vamos a usar la clase "DBHelper" para accesar las anotaciones directamente desde la base de datos. Todo lo que debemos entregar a "NoteEdit" es el "rowId" (si es que estamos editando, pero si estamos creado no necesitamos entregarla nada). Con este nuevo enfoque no tendremos que utilizar las propiedades que estaban siendo pasadas como datos del paquete.&lt;/li&gt;&lt;li&gt;Remueve las siguientes líneas desde la clase "NoteEdit":&lt;/li&gt;&lt;/ul&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String title = extras.getString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_TITLE&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String body = extras.getString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_BODY&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/code&gt; &lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;también elimina las siguientes líneas:&lt;/p&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;title != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;titleText.setText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;title&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;body != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bodyText.setText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt; &lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: Podrías reemplazar el bloque "if (extras != null) {...}" con el operador ternario: &lt;/p&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId = xtras != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;? extras.getLong&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_ROW_ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;; &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Paso 2&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Declara la siguiente nueva propiedad dentro de la clase "NoteEdit":&lt;/p&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DBHelper dbHelper; &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;luego, crea una instancia de "DBHelper" en el método "onCreate()", justo debajo del llamado al método "super.onCreate()":&lt;/p&gt;&lt;p&gt;&lt;style type="text/css"&gt;    &lt;!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--&gt;  &lt;/style&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dbHelper = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DBHelper&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;; &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Paso 3&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Necesitamos verificar el argumento de "onCreate(Bundle ...)" para comprobar el "rowId" y así valor si la anotación que estaba siendo editada ha sido congelada.&lt;/p&gt;&lt;p&gt;Reemplaza al siguiente código que inicializa "rowId":&lt;/p&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Bundle extras = getIntent&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.getExtras&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;extras != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId = extras.getLong&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_ROW_ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt; &lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;por este código:&lt;/p&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId = icicle != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;? icicle.getLong&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_ROW_ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId == &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Bundle extras = getIntent&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.getExtras&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId = extras != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;? extras.getLong&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_ROW_ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;} &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: Si "rowId" no pudo recuperarse a partir de "icicle", entonces debemos recuperarlo desde el paquete de datos.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Paso 4&lt;/strong&gt;&lt;/p&gt;A continuación, necesitamos llenar las propiedades basándonos en el "rowId" que tenemos. Para ello agrega el siguiente llamado:&lt;br /&gt;&lt;br /&gt;populateFields();&lt;br /&gt;&lt;br /&gt;antes de la sentencia "confirmButton.setOnClickListener(...)"&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Paso 5&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Eliminaremos todo el código asociado con la creación del paquete de datos y la asignación de valores en el método controlador de evento "onClick(...)". La "Activity" ya no necesita devolver ninguna información adicional a quien la invocó. También podemos utilizar una versión corta del método "setResult()":&lt;br /&gt;&lt;style type="text/css"&gt;    &lt;!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--&gt;  &lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;onClick&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;View arg0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;setResult&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RESULT_OK&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;finish&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt; &lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;La nueva versión del método "onCreate(...)" debería quedar de la siguiente forma:&lt;/p&gt;&lt;p&gt;&lt;style type="text/css"&gt;    &lt;!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--&gt;  &lt;/style&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="java" align="left"&gt;&lt;table style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td align="left" valign="top"&gt;&lt;code&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;protected &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;onCreate&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Bundle icicle&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.onCreate&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;icicle&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dbHelper = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DBHelper&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;setContentView&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;R.layout.note_edit&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;titleText = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;EditText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;findViewById&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;R.id.title&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bodyText = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;EditText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;findViewById&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;R.id.body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Button confirmButton = &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Button&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;findViewById&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;R.id.confirm&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId = icicle != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;? icicle.getLong&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_ROW_ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId == &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Bundle extras = getIntent&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.getExtras&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId = extras != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;? extras.getLong&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_ROW_ID&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;: &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.populateFields&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;confirmButton.setOnClickListener&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;View.OnClickListener&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;onClick&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;View arg0&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;setResult&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;RESULT_OK&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;finish&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt; &lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;strong&gt;Paso 6&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Declararemos el método "populateFields()".&lt;br /&gt;&lt;br /&gt;&lt;style type="text/css"&gt;    &lt;!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--&gt;  &lt;/style&gt;&lt;div class="java" align="left"&gt;&lt;table bg="" style="color: rgb(255, 255, 255);" border="0" cellpadding="3" cellspacing="0"&gt;   &lt;tbody&gt;&lt;tr&gt;  &lt;!-- start source code --&gt;   &lt;td align="left" nowrap="nowrap" valign="top"&gt;    &lt;code&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;populateFields&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId != &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DBHelper.Row row = dbHelper.fetchRow&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row.rowId &amp;gt; -&lt;/span&gt;&lt;span style="color: rgb(153, 0, 0);"&gt;1&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;titleText.setText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row.title&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;                &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;bodyText.setText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;row.body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;            &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;            &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}            &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;        &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 255);"&gt;    &lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;       &lt;/td&gt;  &lt;!-- end source code --&gt;   &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;strong&gt;Paso 7&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 255);"&gt;¿Por qué es tan importante manipular los eventos del ciclo de vida?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 255);"&gt;Si tú estás acostumbrado a tener pleno control sobre tus aplicaciones, podrías estarte preguntando por qué es necesario este concepto de ciclo de vida. La razón es porque en Android tú no tienes el control de tus "Activity" sino que es el sistema operativo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 255);"&gt;Tal como ya hemos visto, el modelo de Android está basado en la colaboración mutual entre "Activity" llamándose unas a otras. Cuando una "Activity" llama a otra, la actual "Activity" es pausada y podría ser eliminada posteriormente si los recursos disponibles comienzan a escasear.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 255);"&gt;Si esto llegara a ocurrir, tu "Activity" tendrá la oportunidad de guardar su actual estado para que más tarse cuando sea restaurada puede volver al estado en el cual se encontrada antes de ser eliminada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic; color: rgb(51, 51, 255);"&gt;Android tiene un ciclo de vida muy bien definido. Los eventos del ciclo de vida ocurren incluso si tú no estás pasando el control a otra "Activity" en forma explícita. Por ejemplo, una llamada podría ser recibida cuando el usuario está operando tu aplicación. Si esto ocurre, tu aplicación quedará en segundo plano mientras otra aplicación se encarga de la llamada.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Volvamos al tutorial y a realizar cambios en la clase "NoteEdit". A continuación, sobreescribiremos los métodos "onFreeze()", "onPause()" y "onResume()". Estos son nuestros métodos del ciclo de vida (incluido "onCreate()").&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Método onFreeze()&lt;/span&gt; :  este método es llamado por Android si la "Activity" está siendo detenida y probablemente será eliminada antes de que pueda ser reinicializada. Esto significa que dentro de este método la aplicación debería guardar cualquier estado que sea necesario para reiniciarse en las mismas condiciones que estaba al momento de ser detenida. Este método es la contra parte del método "onCreate(Bundle" y de hecho el argumento que este método recibe es el mismo que tú construyes como "outState" en el método "onFreeze()".&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Métodos onPause()  y onResume() &lt;/span&gt;:  estos métodos son complementarios. El método "onPause()" es siempre llamado cuando una "Activity" finaliza, incluso si hemos sido nosotros quien lo ha programado. Nosotros usaremos este método para guardar la actual anotación en la base de datos. Una buena práctica es liberar cualquier recursos que sea posible en "onPause()", y de esa manera mantener bajo el nivel de recursos cuando nuestra aplicación esta en un estado pasivo. Por esta razón, vamos a cerrar la conexión con la base de datos y asignaremos el valor null al objeto "DBHelper" (de esa manera facilitamos el trabajo del "Garbage Collector"). En el método "onResume()" recrearemos la instancia de "DBHelper" para poder recuperar la anotación desde la base de datos.&lt;/li&gt;&lt;/ul&gt;A continuación está el código del método "onFreeze()":&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;protected &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;onFreeze&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Bundle outState&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.onFreeze&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;outState&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;outState.putLong&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Notepadv3.KEY_ROW_ID, rowId&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A continuación está el código del método  "onPause()":&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;protected &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;onPause&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.onPause&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;saveState&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dbHelper.close&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dbHelper = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;A continuación está el código del método " onResume()":&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;protected &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;onResume&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.onResume&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dbHelper == &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dbHelper = &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;DBHelper&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;this&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;populateFields&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A continuación definiremos el método "saveState()", el cual guarda los datos en la base de datos.&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;private &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;saveState&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;() &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String title = titleText.getText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;String body = bodyText.getText&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.toString&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId == &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dbHelper.createRow&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;title, body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;} &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;else &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;dbHelper.updateRow&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;rowId, title, body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Paso 9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora saquemos modificaremos el método "onActivityResult()" de la clase "Notepadv3". Toda la lógica de recuperación y actualización está en el ciclo de vida de la clase "NoteEdit", por lo tanto lo único que el método "onActivityResult()" debe realizar es actualizar la vista de los datos. El código del método es mostrado a continuación:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(100, 100, 100);"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;protected &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;onActivityResult&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;requestCode, &lt;/span&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;resultCode, String data, Bundle extras&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(127, 0, 85);"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.onActivityResult&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;requestCode, resultCode, data, extras&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;fillData&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;()&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Paso 10&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: normal;"&gt;En el método "&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: normal;"&gt;onListItemClick()" de la &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: normal;"&gt;clase "&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-weight: normal;"&gt;Notepadv3"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: normal;"&gt; también debemos eliminar las líneas que agregar el título y cuerpo de la anotación al paquete de datos.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;i.putExtra&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;KEY_TITLE, rows.get&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;position&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.title&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;i.putExtra&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;KEY_BODY, rows.get&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;(&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;position&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.body&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;)&lt;/span&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;;&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Paso 11&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;La aplicación esta lista para ser ejecutada.&lt;/span&gt;&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0); font-weight: bold;"&gt;&lt;span style="font-weight: normal;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="color: rgb(0, 0, 0);"&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-7835645589350000449?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/7835645589350000449/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=7835645589350000449' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7835645589350000449'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7835645589350000449'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial-ejercicio-3.html' title='Manos a la obra - Tutorial - Ejercicio #3'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-3453891985721446392</id><published>2007-12-12T08:17:00.000-08:00</published><updated>2007-12-30T13:26:18.593-08:00</updated><title type='text'>Manos a la obra - Ciclo de vida de una aplicación Android</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/intro/lifecycle.html"&gt;Life Cycle of an Android Application&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Ciclo de vida de una aplicación Android&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Life Cycle of an Android Application&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;En muchos casos, una aplicación Android corre dentro de su propio proceso Linux. Este proceso es creado para la aplicación cuando parte de su código necesita ser ejecutado, y continuará vivo hasta que ya no sea requerido y el sistema reclame su memoria para asignársela a otra aplicación.&lt;/p&gt;&lt;p&gt;Una característica importante, y poco usual, de Android es que el tiempo de vida de un proceso no es controlado directamente por la aplicación. En lugar de esto, es el sistema quien determina el tiempo de vida del proceso basado en el conocimiento que tiene el sistema de las partes de la aplicación que están corriendo, qué tan importante es la aplicación para el usuario y cuánta memoria disponible hay en un determinado momento.&lt;/p&gt;&lt;p&gt;Es muy importante tener en consideración cómo los distintos componentes de una aplicación (en particular "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;", "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;" y "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;") impactan de el tiempo de vida del proceso asociado con una aplicación. Si estos componentes no son empleados de manera apropiada, el sistema detendrá el proceso de la aplicación aún cuando se esté haciendo algo importante. &lt;/p&gt;&lt;p&gt;Un típico ejemplo de lo anterior es un "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;" que inicia un "thread" cuando recibe un "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" en su método "onReceiveIntent()" y entonces finaliza el método y devuelve el control. Una vez que el método devuelve el control, el sistema considera que el "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;" no continúa activo y por lo tanto el proceso asociado a él ya no se requiere mantener corriendo (a menos que otro componente de la aplicación esté activo dentro de él). Debido a esto, el sistema en cualquier momento que requiera memoria eliminará el proceso y como consecuencia también el "thread" que fue creado anteriormente. La solución a este problema es iniciar un "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;" desde el "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;", de esa manera el sistema sabrá que después de que "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;" finalice aún habrá un trabajo activo asociado al proceso.&lt;/p&gt;&lt;p&gt;Para determinar que procesos deberían ser eliminados ante una condición de baja memoria, Android ordena los procesos en una estructura jerárquica y asignándole a cada proceso una determinada "importancia" basada en los componentes que están corriendo dentro de ellos y el estado de aquellos componentes.&lt;/p&gt;&lt;p&gt;De acuerdo a esta jerarquía de importancia se distinguen los siguientes tipos de procesos:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Foreground process : (proceso de primer plano) es un proceso que hospeda una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" en la superficie de la pantalla y con la cual el usuario está interactúando (su método "onResume()" ha sido llamado) o un "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;" está corriendo (su método "onReceiveIntent()" se está ejecutando). Dentro de Android debería haber sólo unos pocos procesos que dentro de esta categoría y estos procesos sólo serán eliminados cómo último recurso, si es que la memoria está tan baja que ni siquiera estos procesos pueden continuar corriendo. Si esta fuera la situación, el dispositivo probablemente alcanzó un "memory paging state" y esta acción es necesaria para mantener la interface del usuario con capacidad para responder al usuario.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Visible process : (proceso visible) es un proceso que hospeda una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" que es tá visible en la pantalla, pero no en el primer plano (su método "onPause()" ha sido llamado). Esto podría ocurrir, si por ejemplo, la actividad de primer plano está siendo desplegada en la pantalla con la apariencia de un cuadro de diálogo que permite que la actividad previa pueda ser vista detrás de ella. Este tipo de proceso es considerado extremadamente importante y no será eliminado a menos sea extrictamente necesario para mantener a todos los procesos de primer plano corriendo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Service process : (proceso de servicio) es un proceso que hospeda a un "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;" que ha sido inicializado con el método "startService()". Aunque estos procesos no son directamente visibles al usuario, generalmente están haciendo tareas que para el usuario son muy importantes (tales como reproducir un archivo mp3 o mantener una conexión con un servidor de contenidos), por lo tanto el sistema siempre tratará de mantener esos procesos corriendo a menos que los niveles de memoria comiencen a comprometer el funcionamiento de los procesos de primer plano.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Background process : (proceso de fondo) es un proceso que hospeda una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" que no es actualmente visible al usuario (su método "onStop()" ha sido llamado). Si estos procesos son eliminados no tendrán un directo impacto en la experiencia del usuario. Basado en el hecho que la "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" ha sido programada para implementar correctamente su ciclo de vida, el sistema puede eliminar estos procesos en cualquier momento para reclamar la memoria que estén usando para entregársela a cualquiera de los tres tipos de procesos anteriormente descritos. Generalmente, hay muchos de estos procesos corriendo, por lo tanto el sistema mantiene una lista "LRU" para asegurar que el último proceso visto por el usuario sea el último en ser eliminado en caso que se requiere recolectar memoria.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Empty process : (proceso vacío) es un proceso que no hospeda a ningún componente de aplicación activo. La única razón para mantener ese proceso es tener un "cache" que permita mejorar el tiempo de activación en la próxima oportunidad que un componente de su aplicación requiera correr. Como consecuencia de esto, el sistema con frecuencia va a eliminar estos procesos para mantener el balance entre los recursos de cache utilizados por estos procesos con los utilizados por los "cache" del kernel del sistema.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Al momento de clasificar un proceso, el sistema toma el nivel más importante de todos los componentes activos de un proceso. Lee sobre la documentación de "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;", "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;" y "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;" para estudiar más detalles de cómo cada uno de estos componentes contribuyen en el ciclo de vida del proceso. La documentación de cada una de estas clases también entregan más detalles de cómo estos componentes impactan en el ciclo de vida de una aplicación.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-3453891985721446392?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/3453891985721446392/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=3453891985721446392' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/3453891985721446392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/3453891985721446392'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/ciclo-de-vida-de-una-aplicacin-android.html' title='Manos a la obra - Ciclo de vida de una aplicación Android'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-1542429784242363568</id><published>2007-12-12T04:49:00.000-08:00</published><updated>2007-12-12T04:59:02.548-08:00</updated><title type='text'>IMPORTANTE NOTICIA!</title><content type='html'>&lt;strong&gt;Documentación + Experiencia Práctica&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;He decidido comenzar a publicar cada día algo nuevo que haya aprendido sobre Android. Si se fijan, además de traducir complemente la parte #2 del tutorial de Android, también he publicado tres notas &lt;strong&gt;¿COMO HACER?&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Creo que en la medida que vaya entregándoles la documentación clara y algunos consejos de cómo sacarle el mayor provecho a las herramientas y plataforma, el contenido de este blog se convertirá en una buena referencia para los hablantes hispanos.&lt;br /&gt;&lt;br /&gt;Si alguno de ustedes tiene un documento interesante de Android (y el código fuente) y desea que haga una traducción de él, sólo agreguen un comentarios con la URL del documento.&lt;br /&gt;&lt;br /&gt;Que tengan un excelente día.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-1542429784242363568?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/1542429784242363568/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=1542429784242363568' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/1542429784242363568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/1542429784242363568'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/importante-noticia_12.html' title='IMPORTANTE NOTICIA!'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-5035478191001875633</id><published>2007-12-11T20:37:00.000-08:00</published><updated>2007-12-12T07:34:09.559-08:00</updated><title type='text'>¿CÓMO HACER? - Simular una llamada entrante</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Llámame&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A continuación explicaré cuales son los pasos que debes realizar para simular una llamada entrante:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abre una aplicación "&lt;strong&gt;telnet&lt;/strong&gt;" (la que sea de tu gusto).&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Luego ejecuta el comando "&lt;strong&gt;o 127.0.0.1 5554&lt;/strong&gt;". La "&lt;span style="font-weight: bold;"&gt;o&lt;/span&gt;" es de "&lt;span style="font-style: italic;"&gt;open&lt;/span&gt;". A continuación del comando "&lt;span style="font-weight: bold;"&gt;o&lt;/span&gt;" colocas la &lt;span style="font-style: italic;"&gt;direción IP&lt;/span&gt; del "Android Emulator" y su puerto de escucha (en mi caso, tengo el emulador corriendo en mi laptop asi es que utilicé la dirección "&lt;span style="font-style: italic;"&gt;localhost&lt;/span&gt;".&lt;/li&gt;&lt;li&gt;Una vez que el emulador acepte tu solicitud de conexión, verás un mensaje similar a "&lt;strong style="font-style: italic;"&gt;Android Console: type 'help' for a list of commands&lt;/strong&gt;".&lt;/li&gt;&lt;li&gt;Finalmente, ejecuta el comando "&lt;strong&gt;gsm call&lt;/strong&gt; &lt;em&gt;unnúmerotelefónico&lt;/em&gt;".Donde "&lt;em&gt;unnúmeroteléfonico&lt;/em&gt;"es el número del teléfono que supuestamente está haciendo el llamado. Por ejemplo, "&lt;strong&gt;gsm call 1234567&lt;/strong&gt;". &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: Puedes agregar algunos teléfonos a tu libreta de contactos y posteriormente usar aquellos números para hacer simulaciones de llamadas de personas que conoces. Así la experiencia resulta más entretenida.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: Si quieres escuchar el ring de la llamada deberías ejecutar el emulador a través del comando "&lt;strong&gt;./emulator -useaudio&lt;/strong&gt;" o "&lt;strong&gt;emulator.exe -useaudio&lt;/strong&gt;".&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-5035478191001875633?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/5035478191001875633/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=5035478191001875633' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5035478191001875633'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5035478191001875633'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/cmo-hacer-simular-una-llamada-entrante.html' title='¿CÓMO HACER? - Simular una llamada entrante'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-417733576745534050</id><published>2007-12-11T20:02:00.000-08:00</published><updated>2007-12-11T20:10:01.463-08:00</updated><title type='text'>¿CÓMO HACER? - Cargar un archivo al emulador</title><content type='html'>En algunas ocaciones es necesario cargar archivo de música o video al emulador, para posteriormente reproducirlos utilizando las APIs de Android.&lt;br /&gt;&lt;br /&gt;A continuación están las instrucciones para cargar un archivo (mp3, etc) al emulador:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abre una consola en tu sistema operativo.&lt;/li&gt;&lt;li&gt;Navega hasta el directorio "Android Tools" (Por ejemplo: C:\android_sdk_windows_m3-rc22a\tools). &lt;/li&gt;&lt;li&gt;Ejecuta el comando "&lt;strong&gt;adb push&lt;/strong&gt; &lt;em&gt;[origen]/nombrearchivo [destino]nombrearchivo&lt;/em&gt;".&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ejemplo:&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;C:\android_sdk_windows_m3-rc22a\tools&gt;&lt;br /&gt;&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;adb push C:\basura\misirlou.mp3 /tmp/mismp3/misirlou.mp3&lt;br /&gt;1129 KB/s (0 bytes in 6451012.005s)&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-417733576745534050?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/417733576745534050/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=417733576745534050' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/417733576745534050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/417733576745534050'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/cmo-hacer-cargar-un-archivo-al-emulador.html' title='¿CÓMO HACER? - Cargar un archivo al emulador'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-3703676342030661730</id><published>2007-12-11T19:13:00.000-08:00</published><updated>2008-02-03T09:42:08.612-08:00</updated><title type='text'>¿CÓMO HACER? - Eliminar una aplicación del emulador</title><content type='html'>Documento Original : &lt;a href="http://code.google.com/android/intro/installing.html#uninstalling"&gt;Removing an Android Application&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;NOTA: El emulador de Android debe estar ejecutándose.&lt;br /&gt;&lt;br /&gt;Para eliminar una aplicación que haz instalado en el emulador, lo que debes hacer es:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abre una consola en tu sistema operativo.&lt;/li&gt;&lt;li&gt;Navega hasta el directorio "Android Tools" (Por ejemplo: C:\android_sdk_windows_m3-rc22a\tools). &lt;/li&gt;&lt;li&gt;Ejecuta el comando "&lt;strong&gt;adb shell&lt;/strong&gt;". Si el emulador no se está ejecutando vas a ver el siguiente mensaje: &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;color:#3333ff;"&gt;C:\android_sdk_windows_m3-rc37a\tools&gt;adb shell&lt;br /&gt;* daemon still not running&lt;br /&gt;*error: no device&lt;/span&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Navega al directorio "data/app", para ello ejecuta el comando "&lt;strong&gt;cd data/app&lt;/strong&gt;".&lt;/li&gt;&lt;li&gt;(&lt;em&gt;Opcional&lt;/em&gt;) Lista los archivos de este directorio con el comando "&lt;strong&gt;ls&lt;/strong&gt;".&lt;/li&gt;&lt;li&gt;Finalmente elimina el archivo de tu aplicación con el comando "&lt;strong&gt;rm&lt;/strong&gt; &lt;em&gt;tuaplicacion.apk&lt;/em&gt;"&lt;br /&gt;&lt;br /&gt;Ejemplo de la salida de una consola:&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;C:\android_sdk_windows_m3-rc22a\tools&gt;adb shell&lt;br /&gt;#&lt;/strong&gt;&lt;/span&gt;&lt;span style="font-family:courier new;font-size:85%;"&gt;&lt;strong&gt;cd data/appcd&lt;br /&gt;data/app&lt;br /&gt;# ls&lt;br /&gt;ls&lt;br /&gt;-rw-rw-rw- root root 31483 2007-12-11 20:09 notepad2.apk&lt;br /&gt;-rw-rw-rw- root root 22539 2007-12-11 19:24 notepad1.apk&lt;br /&gt;-rw-rw-rw- root root 28835 2007-12-09 17:00 comunicacion-xpmm-01.apk&lt;br /&gt;-rw-r--r-- system system 1325834 2007-11-14 13:41 ApiDemos.apk&lt;br /&gt;-rw-rw-rw- root root 26455 2007-12-09 12:40 p2p-services-01.apk&lt;br /&gt;-rw-rw-rw- root root 35537 2007-12-10 14:19 friend-finder-01.apk&lt;br /&gt;-rw-rw-rw- root root 29148 2007-12-10 22:08 lista-con-iconos.apk&lt;br /&gt;-rw-rw-rw- root root 18974 2007-12-10 22:18 lista-de-contactos.apk&lt;br /&gt;-rw-rw-rw- root root 14388 2007-12-10 22:35 open-browser-01.apk&lt;br /&gt;# rm notepad1.apk&lt;br /&gt;rm notepad1.apk&lt;br /&gt;#&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-family:Courier New;font-size:85%;"&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-3703676342030661730?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/3703676342030661730/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=3703676342030661730' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/3703676342030661730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/3703676342030661730'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/cmo-hacer-eliminar-una-aplicacin-del.html' title='¿CÓMO HACER? - Eliminar una aplicación del emulador'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-2275791165037137623</id><published>2007-12-11T11:21:00.000-08:00</published><updated>2007-12-12T18:19:29.308-08:00</updated><title type='text'>Manos a la obra - Tutorial - Ejercicio #2</title><content type='html'>Documento original: &lt;a href="http://code.google.com/android/intro/tutorial-ex2.html"&gt;Tutorial: Notepad Exercise 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;En este ejercicio agregaremos una segunda "Activity" a nuestra aplicación de anotaciones y permitiremos que el usuario cree, edite y borre anotaciones. La nueva "Activity" asumirá la responsabilidad de crear nuevas anotaciones al colectar los datos de entrada del usuario y empaquetarlos y devolverlos a la "Activity" que la invocó.&lt;br /&gt;&lt;br /&gt;Este ejercicio demostrará:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Desarrollo de una nueva "Activity" y cómo agregarla al archivo "Android manifest".&lt;/li&gt;&lt;li&gt;Invocación asincrónica de otra "Activity" usando "startSubActivity()".&lt;/li&gt;&lt;li&gt;Paso de datos entre "Activity" ("bundles").&lt;/li&gt;&lt;li&gt;Cómo utilizar características más avanzadas de diseño de pantalla.&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso #1&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Importa el proyecto "Notepadv2" de la misma forma en que lo describí en el tutoríal anterior. Los archivos de este proyecto están localizados en el directorio "NotepadCodeLab". Si se te presenta un error con el archivo "AndroidManifest.xml" o con el archivo "android.zip", abre el menú de contexto del proyecto y selecciona la opción "&lt;span style="FONT-WEIGHT: bold"&gt;Android Tools-&gt;Fix Project Properties&lt;/span&gt;".&lt;br /&gt;&lt;br /&gt;Expande el proyecto "Notepadv2" y dale un vistazo general:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Abre y examina el archivo "strings.xml" (directorio "res/values"). Verás la declaración de nuevas cadenas de texto, las cuales las usaremos en las nuevas funcionalidades.&lt;/li&gt;&lt;li&gt;Abre y examina el encabezado de la clase "Notepadv2". Notarás que también hay algunos cambios: declaraciones de nuevas constantes y propiedades. &lt;/li&gt;&lt;li&gt;También notarás que el método "fillData()" ha sido modificado para usar la propiedad "rows" en vez de una variable local.&lt;/li&gt;&lt;li&gt;Adicionalmente, hemos sobreescrito nuevos métodos: "onListItemClick()" y "onActivityResult()".&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso #2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Revisa el método "onCreate()", verás que no ha cambiado desde la versión anterior.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso &lt;/span&gt;&lt;span style="FONT-WEIGHT: bold"&gt;#&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold"&gt;3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Debemos agregar la opción "Delete Note" al menú de la "Activity". Para esto:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En el método "onCreateOptionsMenu()" agrega la siguiente línea:&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="java" align="left"&gt;&lt;table cellspacing="0" cellpadding="3" border="0"  style="color:#ffffff;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td valign="top" align="left"&gt;&lt;code&gt;&lt;span style="color:#000000;"&gt;menu.add&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#990000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, DELETE_ID, R.string.menu_delete&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Ahora, el método debería verse así:&lt;/li&gt;&lt;/ul&gt;&lt;div class="java" align="left"&gt;&lt;table cellspacing="0" cellpadding="3" border="0"  style="color:#ffffff;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td valign="top" align="left"&gt;&lt;code&gt;&lt;span style="color:#646464;"&gt;@Override &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;onCreateOptionsMenu&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;Menu menu&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.onCreateOptionsMenu&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;menu&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;menu.add&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#990000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, INSERT_ID, R.string.menu_insert&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;menu.add&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#990000;"&gt;0&lt;/span&gt;&lt;span style="color:#000000;"&gt;, DELETE_ID, R.string.menu_delete&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return true&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 4&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul&gt;&lt;li&gt;En el método "onMenuItemSelected()" agrega el siguiente fragmento de código:&lt;/li&gt;&lt;/ul&gt;&lt;style type="text/css"&gt;    &lt;!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--&gt;  &lt;/style&gt;&lt;br /&gt;&lt;div class="java" align="left"&gt;&lt;table cellspacing="0" cellpadding="3" border="0"  style="color:#ffffff;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td valign="top" align="left"&gt;&lt;code&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;case &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DELETE_ID: &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;dbHelper.deleteRow&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;rows.get&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;getSelection&lt;/span&gt;&lt;span style="color:#000000;"&gt;())&lt;/span&gt;&lt;span style="color:#000000;"&gt;.rowId&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;fillData&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;Este código usa el método "getSelection()" perteneciente a "ListActivity", el cual nos indica cual es el actual elemento seleccionado de la lista. Luego, referenciamos el registro de esa anotación y finalmente tomamos el valor de la propiedad "rowId". Es este valor el que finalmente utilizamos con "deleteRow" para borrar el registro.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Posteriormente, llamamos al método "fillData()" para mantener todo actualizado.&lt;/li&gt;&lt;li&gt;El método debería quedar de la siguiente forma:&lt;/li&gt;&lt;/ul&gt;&lt;div class="java" align="left"&gt;&lt;table cellspacing="0" cellpadding="3" border="0"  style="color:#ffffff;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td valign="top" align="left"&gt;&lt;code&gt;&lt;span style="color:#646464;"&gt;@Override &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;public &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;boolean &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;onMenuItemSelected&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;featureId, Item item&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.onMenuItemSelected&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;featureId, item&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;switch&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;item.getId&lt;/span&gt;&lt;span style="color:#000000;"&gt;()) { &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;case &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;INSERT_ID: &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;createNote&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;fillData&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;case &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;DELETE_ID: &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;dbHelper.deleteRow&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;rows.get&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;getSelection&lt;/span&gt;&lt;span style="color:#000000;"&gt;())&lt;/span&gt;&lt;span style="color:#000000;"&gt;.rowId&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;fillData&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return true&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora, modificaremos el cuerpo del método "createNote()":&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Definiremos un "Intent" para crear una anotación ("ACTIVITY_CREATE"). Los argumentos que utilizaremos será "this" y la clase "NoteEdit". A continuación, gatillaremos el "Intent" usando el método "startSubActivity()".&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;NOTA&lt;/span&gt;: La clase "NoteEdit" será definida en unos momentos.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;NOTA&lt;/span&gt;: En este ejemplo, nuestro "Intent" utiliza el nombre específico de una clase. Mientras esto es adecuado para determinadas circunstancias, lo más común es invocar un "Intent" usando una "Action" y una "URI". Ver "android.content.Intent" para más información.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 6&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Modificaremos el cuerpo del método "onListItemClick()".&lt;br /&gt;&lt;br /&gt;El método "onListItemClick()" sobreescribe el método que es llamado cuando un usuario selecciona un elemento de la lista. Este método entrega 4 parámetros:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Objeto ListView : referencia al objeto desde el cual fue invocado el elemento. &lt;/li&gt;&lt;li&gt;Objeto View : referencia al objeto que fue seleccionado dentro de la ListView.&lt;/li&gt;&lt;li&gt;Un entero con la posición del elemento seleccionado. &lt;/li&gt;&lt;li&gt;Un entero con la identificación del elemento que fue seleccionado. &lt;/li&gt;&lt;/ul&gt;En nuestro ejemplo, podemos ignorar los dos primeros parámetros (tenemos sólo una "ListView" desde la cual el elemento pudo ser seleccionado). También ignoraremos la identificación del elemento. Todo lo que nos interesa por ahora es la posición del elemento que el usuario seleccionó. Utilizaremos esta posición para recuperar los datos de la anotación desde la lista y los empaquetamos para enviarlo a la "Activity" "NoteEdit".&lt;br /&gt;&lt;br /&gt;Este método crea el "Intent" para editar la anotación usando la clase "NoteEdit". Luego, agregamos todos los datos al "Intent" (título, cuerpo de la anotación y la identificación). Finalmente, gatillamos el "Intent" invocando al método "startSubActivity()" con los argumentos "ACTIVITY_EDIT" y la clase "NoteEdit". &lt;style type="text/css"&gt;    &lt;!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--&gt;  &lt;/style&gt;&lt;br /&gt;&lt;div class="java" align="left"&gt;&lt;table cellspacing="0" cellpadding="3" border="0"  style="color:#ffffff;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td valign="top" align="left"&gt;&lt;code&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.onListItemClick&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;l, v, position, id&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;Intent i = &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;new &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;Intent&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;this, NoteEdit.&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;class&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;i.putExtra&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;KEY_ROW_ID, rows.get&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;position&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;.rowId&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;i.putExtra&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;KEY_BODY, rows.get&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;position&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;.body&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;i.putExtra&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;KEY_TITLE, rows.get&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;position&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;.title&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;startSubActivity&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;i, ACTIVITY_EDIT&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;El método "putExtra()" permite agregar elementos adicionales al paquete del "Intent".&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 7&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A continuación modificaremos el método "onActivityResult()".&lt;br /&gt;&lt;br /&gt;El método "onActivityResult()" sobreescribe un método que es invocado cuando una sub "Activity" finaliza su tarea. Los parámetros que este método entrega son:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;requestCode&lt;/span&gt; : s el código original utilizado en la invocación del "Intent" (en nuestro caso podrá ser "ACTIVITY_CREATE" o "ACTIVITY_EDIT").&lt;/li&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;resultCode&lt;/span&gt; : es el resultado (o código de error) del llamado. Este valor debería ser cero si todo fue correcto y valor distinto para indicar que algo falló. Existen algunos códigos predefinidos que pueden ser utilzados, pero también pueden definirse nuevos códigos para errores más específicos.&lt;/li&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;data&lt;/span&gt; : esta es una cadena de texto que es utilizada para recibir algún tipo de información descriptiva (por ejemplo: el texto que el usuario escribió en un cuadro de diálogo). Esto es útil únicamente cuando tenemos sólo una cosa que devolver. Si requerimos retornar más información, debemos usar "extras".&lt;/li&gt;&lt;li&gt;&lt;span style="FONT-WEIGHT: bold"&gt;extras&lt;/span&gt; : este parámetro entrega los "extras bundle" (si es que existen) que retornó el "Intent" invocado.&lt;/li&gt;&lt;/ul&gt;La combinación de "startSubActivity()" y "onActivityResult()" puede ser vista como un llamado asincrónico a un procedimiento remoto ("asynchronous RPC" o "remote procedure call"). Esta es la forma recomendada para que una "Activity" invoque a otra "Activity" y compartir servicios.&lt;br /&gt;&lt;br /&gt;A continuación está el código completo de este método:&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;style type="text/css"&gt;    &lt;!--code { font-family: Courier New, Courier; font-size: 10pt; margin: 0px; }--&gt;  &lt;/style&gt;&lt;br /&gt;&lt;div class="java" align="left"&gt;&lt;table cellspacing="0" cellpadding="3" border="0"  style="color:#ffffff;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;!-- start source code --&gt;&lt;td valign="top" align="left"&gt;&lt;code&gt;&lt;span style="color:#646464;"&gt;@Override &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;protected &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;void &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;onActivityResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;requestCode, &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;int &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;resultCode, String data, Bundle extras&lt;/span&gt;&lt;span style="color:#000000;"&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;{ &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;super&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;.onActivityResult&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;requestCode, resultCode, data, extras&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#ffffff;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;switch&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;requestCode&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;case &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ACTIVITY_CREATE: &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;String title = extras.getString&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;KEY_TITLE&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;String body = extras.getString&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;KEY_BODY&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;dbHelper.createRow&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;title, body&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;fillData&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;case &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;ACTIVITY_EDIT: &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;Long rowId = extras.getLong&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;KEY_ROW_ID&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;if &lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;rowId != &lt;/span&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;null&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;) { &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;String editTitle = extras.getString&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;KEY_TITLE&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;String editBody = extras.getString&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;KEY_BODY&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;dbHelper.updateRow&lt;/span&gt;&lt;span style="color:#000000;"&gt;(&lt;/span&gt;&lt;span style="color:#000000;"&gt;rowId, editTitle, editBody&lt;/span&gt;&lt;span style="color:#000000;"&gt;)&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;fillData&lt;/span&gt;&lt;span style="color:#000000;"&gt;()&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;break&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#7f0055;"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/span&gt;&lt;span style="color:#000000;"&gt;; &lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/td&gt;&lt;!-- end source code --&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;En este método distinguimos los resultados de dos "Activity": "ACTIVITY_CREATE" y "ACTIVITY_EDIT".&lt;/li&gt;&lt;li&gt;En el caso de "ACTIVITY_CREATE", tomamos el título y el cuerpo desde "extras" para usarlos en la creación de la anotación.&lt;/li&gt;&lt;li&gt;En el caso de "ACTIVITY_EDIT", tomamos además el "KEY_ROW_ID" para localizar el registro que deseamos actualizar.&lt;/li&gt;&lt;li&gt;El método "fillData()" al final nos asegura que todo será actualizado.&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 8&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Abre el archivo "note_edit.xml" y revísalo. Este archivo contiene la definición de la pantalla que será usada para editar nuestras anotaciones.&lt;br /&gt;&lt;br /&gt;Este archivo hace uso de un nuevo parámetro: "android:layout_weight" (en este caso tiene el valor "1").&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;layout_weight&lt;/span&gt; es usado en "LinearLayouts" para asignar a las vistas un nivel de "importancia" dentro del diseño de la pantalla. Todas las vistas tienen un valor por omisión de cero para "layout_weight", lo cual significa que ellas pueden ocupar el espacio que requieran para ser desplegadas. Al asignar un valor mayor que cero hará que el resto del espacio disponible sea dividido entre el padre de acuerdo al valor de "layout_weight" y su proporción con el total de "layout_weight", especificado en el actual trazado y en otras vistas.&lt;br /&gt;&lt;br /&gt;Para dar un ejemplo de lo anterior, digamos que tenemos una etiqueta de texto y dos áreas de edición en un vista horizontal. La etiqueta de texto no tiene especificado valor para su "layout_weight", por lo tanto tomará el mínimo espacio requerido para desplegarse. Si el valor de "layout_weight" para las áreas de texto es "1", el restanto espacio dentro del área definida por el padre será dividida entre ambas. Si la primera área tuviera un valor de "1" y la segunda un valor de "2" para "layout_weight", entonces un tercio del espacio disponible será entregado a la primera área y los dos restantes a la segunda.&lt;br /&gt;&lt;br /&gt;Este diseño de pantalla también demuestra cómo anidar múltiples esquemas para así lograr complejos trazados de pantalla. En este caso, el esquema horizontal lineal está anidado dentro de uno vertical, lo cual permite que la etiqueta del título y el área de edición estén una al lado de otra.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crea una clase llamada "NoteEdit" y que extienda "android.app.Activity".&lt;br /&gt;&lt;br /&gt;Esta es la primera vez que crearemos una "Activity" sin la ayuda del "Android Eclipse plugin". Al hacerlo de esta manera, el método "onCreate()" no es automáticamente etiquetado con la anotación de sobreescritura. Es difícil imaginar una "Activity" que no sobreescriva el método "onCreate()".&lt;br /&gt;&lt;br /&gt;A continuación están las instrucciones en detalle:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Abre el menú de contexto del paquete "com.google.android.demo.notepad2" y selecciona "&lt;span style="FONT-WEIGHT: bold"&gt;New-&gt;Class&lt;/span&gt;".&lt;/li&gt;&lt;li&gt;Escribe en el campo "Name:" el nombre de la clase ("NoteEdit").&lt;/li&gt;&lt;li&gt;En el campo "Superclass:", escribe "android.app.Activity" o puedes simplemente escribir "Activity" y presionar "&lt;span style="FONT-WEIGHT: bold"&gt;Ctrl-Space&lt;/span&gt;" (Windows y Linux) para invocar el asistente de código y encontrar path completo del paquete en el cual está esta clase.&lt;/li&gt;&lt;li&gt;Presiona el botón "Finish".&lt;/li&gt;&lt;li&gt;En el editor de texto abre el menú de contexto y selecciona la opción "&lt;span style="FONT-WEIGHT: bold"&gt;Source&lt;/span&gt;", luego selecciona "&lt;span style="FONT-WEIGHT: bold"&gt;Override/Implement Methods...&lt;/span&gt;".&lt;/li&gt;&lt;li&gt;Busca el método "onCreate(Bundle)" y selecciónalo.&lt;/li&gt;&lt;li&gt;Presiona el botón "&lt;span style="FONT-WEIGHT: bold"&gt;OK&lt;/span&gt;".&lt;/li&gt;&lt;/ol&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 10&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Completaremos el código del método "onCreate()".&lt;br /&gt;&lt;br /&gt;Haremos las declaraciones necesarias para definir el título de nuestra "Activity" ("Edit Note"). Este valor está definido en el archivo "strings.xml". Aquí también definiremos que la vista que utilizaremos será aquella definida en el archivo "note_edit.xml layout". Después de esto, podemos asociar a objetos Java las vistas correspondientes al título, el cuerpo de la anotación y el botón de confirmación. De esta forma, nuestro código puede usarlos para asignar y recuperar el texto del título y el cuerpo; y además asociar cñodigo al evento gatillado cuando el usuario presiona el botón de confirmación.&lt;br /&gt;&lt;br /&gt;Los valores que fueron enviados por la "Notepadv2" serán extraidos desde el paquete y usados para llenar el título y el cuerpo de la anotación. La identificación de la anotación la almacenaremos para saber que registro estamos editando.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Asociación de la "Activity" con un esquema:&lt;/li&gt;&lt;/ul&gt;&lt;span style="COLOR: rgb(51,51,255);font-family:courier new;font-size:85%;"  &gt;setContentView(R.layout.note_edit);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Examinar el esquema de pantalla para encontrar el título, el cuerpo y el botón de confirmació. Utilizamos los identificadores generados en la clase "R" y luego los convertimos al tipo apropiado. &lt;/li&gt;&lt;/ul&gt;&lt;span style="COLOR: rgb(51,51,255);font-family:courier new;font-size:85%;"  &gt;titleText = (EditText) findViewById(R.id.title);&lt;br /&gt;bodyText = (EditText) findViewById(R.id.body);&lt;br /&gt;Button confirmButton = (Button) findViewById(R.id.confirm); &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;NOTA&lt;/span&gt;: "titleText" y "bodyText" son propiedades de la clase que aún no hemos definido.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Declarar una propiedad llamada "rowId", la cual almacenará la identificación del registro editado.&lt;/li&gt;&lt;/ul&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;private Long rowId;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Agregar código para inicializar el título, cuerpo y la propiedad "rowId" a partir de los datos extraidos del paquete recibido desde "Notepadv2".&lt;/li&gt;&lt;/ul&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;rowId = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Bundle extras = getIntent().getExtras();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (extras != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String title = extras.getString(Notepadv2.KEY_TITLE);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String body = extras.getString(Notepadv2.KEY_BODY);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rowId = extras.getLong(Notepadv2.KEY_ROW_ID);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (title != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;titleText.setText(title);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (body != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bodyText.setText(body);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;} &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Definir un controlador para el evento clic del botón de confirmación. Esto lo hacemos utilizando el método "onClickListener()".&lt;/li&gt;&lt;/ul&gt;&lt;span style="FONT-WEIGHT: bold"&gt;NOTA&lt;/span&gt;: Los controladores de eventos ("listeners") son uno de los aspectos más difíciles de entender en la implementación de una "UI", pero lo que intentamos hacer aquí es bastante simple. Lo que deseamos hacer es simplemente llamar al método "onClick()" cuando el usuario presione el botón de confirmación. Dentro de este método podremos hacer los necesario para devolver los valores ingresados por el usuario al "Intent" que llamo a esta "Activity". La técnica empleada en este código se llama "anonymous inner class". Resulta enredado de leer a menos que hayas visto este patrón anteriormente, pero por ahora sólo nos interesa usar este código a modo de receta de cómo invocar un método como reacción a un evento de la "UI".&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 11&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Completaremos el cuerpo del método "onClick()".&lt;br /&gt;&lt;br /&gt;Este es el código que se ejecutará cuando el usuario haga clic sobre el botón de confirmación. Aquí es donde debemos recuperar el título y cuerpo de la anotación y colocarlos dentro del paquete de datos que devolveremos a la "Activity" que invocó esta "Activity". Si la operación es editar en vez de crear, también deberemos poner la identificación del registro de la anotación.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Creación del paquete donde pondremos el título y cuerpo de la anotación.&lt;/li&gt;&lt;/ul&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;Bundle bundle = new Bundle();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bundle.putString(Notepadv2.KEY_TITLE, titleText.getText().toString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bundle.putString(Notepadv2.KEY_BODY, bodyText.getText().toString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (rowId != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bundle.putLong(Notepadv2.KEY_ROW_ID, rowId);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Asignar la información de resultado, incluyendo el paquete y resultado final de la operación. &lt;/li&gt;&lt;/ul&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;setResult(RESULT_OK, null, bundle);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;finish();&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El método "setResult()" es usado para asignar el código de retorno, la cadena de información textual y el paqueta de datos que será entregado al "Intent" que invocó a esta "Activity". En este caso suponemos que todo estará bien, asi es que devolvemos "RESULT_OK" como valor del código de retorno. No usaremos la cadena de información textual , por esta razón estamos pasando el valor "null".&lt;br /&gt;&lt;br /&gt;El método "finish()" es usado como una señal que la "Activity" ha realizado su tarea (una especia de "return"). Todos los argumentos entregados a "setResul()" van a ser devueltos junto con el control de ejecución.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;La siguiente es la declaración de las propiedades utilizadas en el código de esta clase.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="COLOR: rgb(51,51,255);font-family:courier new;" &gt;private EditText titleText;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255);font-family:courier new;" &gt;private EditText bodyText;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255);font-family:courier new;" &gt;private Long rowId;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;El código completo del método "onCreate()" es mostrado a continuación.&lt;/li&gt;&lt;/ul&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;@Override&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;protected void onCreate(Bundle icicle) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;super.onCreate(icicle);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;setContentView(R.layout.note_edit);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;titleText = (EditText) findViewById(R.id.title);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bodyText = (EditText) findViewById(R.id.body);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Button confirmButton = (Button) findViewById(R.id.confirm);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rowId = null;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Bundle extras = getIntent().getExtras();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (extras != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String title = extras.getString(Notepadv2.KEY_TITLE);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;String body = extras.getString(Notepadv2.KEY_BODY);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;rowId = extras.getLong(Notepadv2.KEY_ROW_ID);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (title != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;titleText.setText(title);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (body != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bodyText.setText(body);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;confirmButton.setOnClickListener(new View.OnClickListener() {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;public void onClick(View view) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;Bundle bundle = new Bundle();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bundle.putString(Notepadv2.KEY_TITLE, titleText.getText().toString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bundle.putString(Notepadv2.KEY_BODY, bodyText.getText().toString());&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;if (rowId != null) {&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;bundle.putLong(Notepadv2.KEY_ROW_ID, rowId);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;setResult(RESULT_OK, null, bundle);&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;finish();&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;});&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;}&lt;span style="font-size:100%;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:georgia;"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 12&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:georgia;" &gt;Finalmente, la nueva "Activity" debe ser declarada en el archivo "Android Manifest".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:georgia;" &gt;Antes de que una actividad pueda ser "vista" por Android, esta actividad debe tener su propia entrada en el archivo"AndroidManifest.xml". Esto le entregará al sistema la información necesaria para localizar la actividad y saber que requiere para funcionar.&lt;br /&gt;&lt;br /&gt;A continuación se muestra el archivo "&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:georgia;" &gt;AndroidManifest.xml&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:georgia;" &gt;" modificado:&lt;br /&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;package="com.google.android.demo.notepad2"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;application android:icon="@drawable/icon"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;activity class=".Notepadv2" android:label="@string/app_name"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;intent-filter&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;action android:value="android.intent.action.MAIN" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;category android:value="android.intent.category.LAUNCHER" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/intent-filter&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/activity&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;activity class=".NoteEdit"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/application&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;/manifest&amp;gt; &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Paso 13&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="COLOR: rgb(51,51,255);font-size:85%;" &gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-size:85%;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="COLOR: rgb(0,0,0);font-family:georgia;" &gt;Ejecución de la aplicación.&lt;br /&gt;&lt;br /&gt;1. Haz clic con el botón derecho sobre el proyecto "Notepadv2" para abrir el menú de contexto y seleccionar "&lt;span style="FONT-WEIGHT: bold"&gt;Run As &gt; Android Application&lt;/span&gt;".&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-2275791165037137623?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/2275791165037137623/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=2275791165037137623' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/2275791165037137623'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/2275791165037137623'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial-ejercicio-2.html' title='Manos a la obra - Tutorial - Ejercicio #2'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-6272936594432149709</id><published>2007-12-09T11:00:00.000-08:00</published><updated>2008-12-11T14:10:26.871-08:00</updated><title type='text'>Soluciones a problemas</title><content type='html'>&lt;strong&gt;&lt;span style="font-size:130%;"&gt;Soluciones a problemas&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;En el sitio &lt;a href="http://www.blogger.com/www.anddev.org"&gt;Android Development Community&lt;/a&gt; y &lt;a href="http://www.android-spa.com/"&gt;Android-Spa Team&lt;/a&gt; estoy publicando algunas de las soluciones a problemas que he encontrado mientras desarrollo. Aquí iré creado un índice de referencia hacia esas publicaciones.&lt;br /&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Problema&lt;/strong&gt;:&lt;/span&gt; &lt;/p&gt;&lt;p&gt;Al ejecutar mi aplicación apareció el siguiente mensaje de error en la consola de Eclipse (además la aplicación no se ejecutó): [2007-12-09 10:53:03 - p2p-services-01] ActivityManager: Error: Activity class {com.northvortex/com.northvortex.Transmisor} does not exist. &lt;/p&gt;&lt;p&gt;&lt;a href="http://www.anddev.org/viewtopic.php?p=702#702"&gt;Lee la solución&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Problema&lt;/strong&gt;:&lt;/span&gt; &lt;/p&gt;&lt;p&gt;Este es un proble que se les puede presentar después de la instalación de la última versión del SDK ("android_sdk_windows_m3-rc37a.zip") en Windows. Ninguna de las aplicaciones funcionarán correctamente. Incluso el mismo Android Browser dejará de funcionar y desplegará el siguiente error:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#000000;"&gt;An error has occurred in process com.google.android.browser. Unable to create application com.google.android.browser.Browser: java.lang.NullPointerException.&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://3.bp.blogspot.com/__WZr8mbWg3o/R2YgN3r7wbI/AAAAAAAAACk/ickqaeh5ll8/s1600-h/figura-02.PNG"&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/__WZr8mbWg3o/R2YgN3r7wbI/AAAAAAAAACk/ickqaeh5ll8/s1600-h/figura-02.PNG"&gt;&lt;img id="BLOGGER_PHOTO_ID_5144835046975979954" style="CURSOR: hand" alt="" src="http://3.bp.blogspot.com/__WZr8mbWg3o/R2YgN3r7wbI/AAAAAAAAACk/ickqaeh5ll8/s400/figura-02.PNG" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;strong&gt;SOLUCIÓN&lt;/strong&gt;:&lt;br /&gt;&lt;br /&gt;Deben borrar los siguientes archivos:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#000000;"&gt;emulator.cfg&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#000000;"&gt;userdata.img&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Estos archivo en WINDOWS, están ubicados en:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;span style="color:#000000;"&gt;C:\Documents and Settings\tu-usuario\Local Settings\Application Data\Android&lt;/span&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;Al parecer, la nueva versión del SDK no es capaz de reconocer correctamente las imágenes que creo la versión anterior del SDK.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;NOTA&lt;/strong&gt;: Al borrar estos archivos perderás los cambios que habías hecho en el emulador (aplicaciones instaladas, etc.)&lt;br /&gt;&lt;br /&gt;Esta información también la publiqué &lt;a href="http://www.android-spa.com/viewtopic.php?t=118"&gt;aquí&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;&lt;a href="http://www.anddev.org/viewtopic.php?p=701#701"&gt;&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-6272936594432149709?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/6272936594432149709/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=6272936594432149709' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6272936594432149709'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6272936594432149709'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/soluciones-problemas.html' title='Soluciones a problemas'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/__WZr8mbWg3o/R2YgN3r7wbI/AAAAAAAAACk/ickqaeh5ll8/s72-c/figura-02.PNG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-8708855456650481121</id><published>2007-12-08T09:40:00.000-08:00</published><updated>2007-12-11T07:22:45.767-08:00</updated><title type='text'>IMPORTANTE NOTICIA!</title><content type='html'>&lt;strong&gt;Voy a la competencia de Google Android&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;Quiero informarles que &lt;a href="http://www.damashekconsulting.com/"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/a&gt;he decidido participar en el &lt;a href="http://code.google.com/android/adc.html"&gt;desafío de Google&lt;/a&gt; y durante los próximos 2 meses trabajaré en la creación de una aplicación Android que haga uso de las más interesantes características de Android Platform.&lt;br /&gt;&lt;br /&gt;Debido a lo anterior además de la traducción de la documentación de Google, tambén comenzaré a publicar mis propias experiencias en el uso de Android y todo el código fuente (bien documentado).&lt;br /&gt;&lt;br /&gt;Los documentos que seas de mi creación tendrán el título &lt;span style="font-weight: bold;"&gt;¿CÓMO HACER? - tópico&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;P-e-d-r-o&lt;br /&gt;&lt;a href="http://www.damashekconsulting.com/"&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-8708855456650481121?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/8708855456650481121/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=8708855456650481121' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/8708855456650481121'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/8708855456650481121'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/importante-noticia.html' title='IMPORTANTE NOTICIA!'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-6575545282133883579</id><published>2007-12-02T15:44:00.000-08:00</published><updated>2007-12-09T14:31:32.460-08:00</updated><title type='text'>Observaciones</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Proyectos&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este es un índice con las notas importantes aprendidas en cada ejemplo.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;lista-de-contactos&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Declaración del permiso para leer información de la lista de contactos.&lt;/li&gt;&lt;li&gt;Cómo leer información de la lista de contactos.&lt;/li&gt;&lt;li&gt;Cómo asociar la declaración de un objeto (en código Java) con un elemento declarado en un layout (main.xml). &lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;comunicacion-xpmm-01&lt;/strong&gt;&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Utilización del protocolo XMPP para mensajería entre dispositivos.&lt;/li&gt;&lt;li&gt;Implementación de la interface &lt;strong&gt;OnClickListener&lt;/strong&gt;. Esta interface define el "Callback" que será invocado como respuesta al evento clic sobre una "View".&lt;/li&gt;&lt;li&gt;Implementación de la interface &lt;strong&gt;ServiceConnection&lt;/strong&gt;. Esta interface define un monitor del estado de una aplicación tipo servicio.&lt;/li&gt;&lt;li&gt;Declaración de un elemento "receiver" &lt;strong&gt;&lt;receiver class=".Receptor"&gt;&lt;/strong&gt;en el archivo "AndroidManifest.xml". Esto permite declarar un "IntentReceiver" que reaccione a datos o eventos enviados/gatillados desde una "Activity".&lt;/li&gt;&lt;li&gt;Declaración y uso de un objeto &lt;strong&gt;Spinner&lt;/strong&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-6575545282133883579?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/6575545282133883579/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=6575545282133883579' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6575545282133883579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6575545282133883579'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/observaciones.html' title='Observaciones'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-6230920452434990465</id><published>2007-12-01T22:40:00.000-08:00</published><updated>2008-12-11T14:10:27.125-08:00</updated><title type='text'>Manos a la obra - Tutorial - Ejercicio #1</title><content type='html'>&lt;h1&gt;&lt;a href="#"&gt;Tutorial: Ejercicio #1 &lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Tutorial: Notepad Exercise 1&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/intro/tutorial-ex1.html"&gt;Tutorial: Notepad Exercise 1&lt;/a&gt;&lt;/p&gt;&lt;p&gt;En este ejercicio construiremos una simple lista de anotaciones que permitirá al usuario agregar una nueva nota, pero por ahora no le permitirá editarla. Este ejercicio demostrará:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Conceptos básicos de una "ListActivity". Además, la creación y manipulación de opciones de un menú.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Recuperación y almacenamiento de las notas en una base de datos "SQLite".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Cómo enlazar datos dentro de una "ListView" usando un "ArrayAdapter" (una de las formás más simples de enlazar datos a un "ListView"). &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Los conceptos básicos de diseño de una pantalla, incluyendo cómo diseñar una lista, cómo agregar elementos al menú de una "Activity" y cómo manipular la selección de esos elementos.     &lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #1&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 1&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Importar el proyecto "Notepadv1" a nuestro "workspace" de Eclipse.&lt;/p&gt;&lt;p&gt;NOTA: "Notepadv1" es un proyecto que provee el punto de partida a este ejercicio y nos ahorrará el tiempo de hacer las cosas que ya aprendiste al desarrollar la aplicación "Hola Mundo".&lt;/p&gt;&lt;p&gt;A continuación están las instrucciones para esta sección:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Dentro del "Package Explorer" haz clic con el botón derecho y selecciona "Import... &amp;gt; General &amp;gt; Existing Projects into Workspace. Luego presiona el botón "Next  &amp;gt; ".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;A continuación, presiona el botón "Browse" y navega hasta donde extrajiste los directorios de los ejercicios y selecciona "Notepadv1". Finalmente, presiona el botón "OK". &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Después del paso anterior deberías ver el elemento "Notepadv1" en la lista de proyectos con una marca de seleccionado al lado de él. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Presiona el botón "Finish". &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;El proyecto debería haberse abierto en el "Package Explorer" y estar listo para trabajar con él.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Si vieras un error relacionado con el archivo "AndroidManifest.xml", o con un archivo ".zip" de Android, has clic con el botón derecho sobre el proyecto y selecciona desde el menú de contexto "Android Tools &amp;gt; Fix Project Properties".&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #2&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 2&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Dale un vistazo a la clase "DBHelper". Esta clase encapsula el acceso y actualización de los datos de nuestras anotaciones almacenadas en una base de datos "SQLite" local en nuestro dispositivo.&lt;/p&gt;&lt;p&gt;Normalmente, el acceso a datos debería ser implementado usando un "ContentProvider", y de hecho la aplicación "Notepad" que está incluida en el SDK (en el directorio "samples/") implamenta un "ContentProvider". Sin embargo, no hay ninguna restricción en utilizar directamente tu propia base de datos tal como lo haremos en este ejercicio. Lo más importante a destacar de la clase "DBHelper" es que toma la responsabilidad de todos los detalles relacionados con el almacenamiento, recuperación y actualización de datos de una base de datos "SQLite". Provee métodos para: (A) recuperar todas los registros, (B) recuperar un registro basado en un "rowIds", (C) crear un nuevo registro, (D) borrar un registro (E) actualizar un registro.&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Accesando y modificando datos&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Accessing and modifying data&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;En este ejercicio, vamos a usar directamente una base de datos SQLite para almacenar nuestros datos, pero en una aplicación real sería mucho más conveniente escribir un "ContentProvider" para encapsular este comportamiento.&lt;/p&gt;&lt;p&gt;Si tú estás interesado en aprender más sobre &lt;a href="http://code.google.com/android/reference/android/content/IContentProvider.html"&gt;"ContentProvider"&lt;/a&gt; o el tema "Almacenamiento, recuperación y exposición de datos".&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #3&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 3&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Abre el archivo "notepad_list.xml" que está localizado en "res/layout" y dale un vistazo. &lt;/p&gt;&lt;p&gt;Este archivo contiene la definición del diseño de la pantalla y contiene el punto de inicio para dibujar la pantalla. &lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Todos los archivos de diseño de pantalla comienzan con un encabezado XML.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Con frecuencia, pero no siempre, la raíz del documento de diseño es una definición del tipo de distribución que tendrán los elementos en la pantalla, en este caso es"LinearLayout".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;El "xml namespace" de Android (xmlns:android="http://schemas.android.com/apk/res/android") debería ser siempre definido como un atributo del elemento de mayor jerarquía en el documento de diseño de pantalla, de esa forma el espacio de nombre "android:" podrá ser utilizado por los elementos que estén anidados.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h3&gt;&lt;a href="#"&gt;Esquemas y actividades&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Layouts and activities&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Muchas actividades tendrán un esquema asociado a ellas. El esquema será la "cara" que el usuario verá de la actividad. En este ejemplo, el esquema ocupará completamente la pantalla y proveerá una lista de anotaciones.&lt;/p&gt;&lt;p&gt;Los esquema de pantalla completa no son la única opción para una actividad. Tú también podrías usar un esquema flotante (por ejemplo para un mensaje de alerta) o quizá ni siquiera necesites un esquema (en este caso la actividad es invisible al usuario a menos que quieras asociar un esquema a la actividad).&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #4&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 5&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Ahora, necesitamos modificar el diseño de la pantalla para que contenga nuestra lista. Para hacer esto agregaremos dentro de la etiqueta "LinearLayout" las etiquetas "ListView" y "TextView".&lt;/p&gt;&lt;p&gt;El siguiente archivo corresponde a la nueva versión después de realizar las modificaciones:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt; android:layout_width="wrap_content"&lt;br /&gt;    android:layout_height="wrap_content"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;ListView id="@+id/android:list"&lt;br /&gt;        android:layout_width="wrap_content"&lt;br /&gt;        android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;        &lt;br /&gt;  &amp;lt;TextView id="@+id/android:empty"&lt;br /&gt;        android:layout_width="wrap_content"&lt;br /&gt;        android:layout_height="wrap_content"&lt;br /&gt;        android:text="@string/no_notes"/&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p /&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Los elementos "ListView" y "TextView" pueden ser entendidos como dos vistas alternativas, es decir, en cualquier momento sólo una de ellas será desplegada. El elemento "ListView" será usado sólo cuando tengamos anotaciones para ser mostradas y "TextView" será usado para desplegar el mensaje "No Notes Yet!" cuando aún no tengamos anotaciones para mostrar. (El valor inicial de "TextView" está definido como un recurso de tipo "string").&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;El caracter "@" en los atributos "id" de "ListView" y "TextView" le indican al "XML parser" que debe reemplazar estos valores por valores definidos en el archivo de recursos o en la "Android platform".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Los textos "android:list" y "android:empty" son identificadores que son proporcionados por la "Android platform". El elemento identificado con "empty" será usado automáticamente cuando no hayan datos para ser desplegados en la lista. &lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;En general, la clase "android.R" es un conjunto predefinido de recursos que la plataforma te provee, por el contrario, la clase "R" de tu proyecto es el conjunto de recursos que tu proyecto a definido. Los recursos que se encuentran definidos en la clase "android.R" pueden ser usados en los archivos XML anteponiendo el espacio de nombre "android:", como se ve en el ejemplo anterior.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #5&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 5&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Para crear una vista con una lista, también debemos definir la vista para cada una de las filas:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Crearemos un nuevo archivo dentro de "res/layout" llamado "notes_row.xml".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Agregarenos el siguiente contenido al archivo: &lt;pre&gt;&lt;code&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;TextView id="@+id/text1" xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;    android:layout_width="wrap_content"&lt;br /&gt;    android:layout_height="wrap_content"/&amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Esta es la vista que será usada para el título de cada anotación. Es sólo un texto.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En este caso, hemos creado un nuevo identificador llamado "text1". El caracter "+" que está a continuación del caracter "@" indica que el identificador deberá ser creado automáticamente si es que no existe, es decir, estamos definiendo "text1" dinámicamente y luego empleándolo. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Después de grabar el archivo, si abrimos el archivo "R.java" deberemos ver una nueva definición para "notes_row" y "text1", lo que significa que ahora tendremos acceso a esos elementos desde nuestro código.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h3&gt;&lt;a href="#"&gt;Recursos y la clase "R"&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Resources and the R class&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;En los proyectos Eclipse, los subdirectorios de "res/" son especiales. Hay un estructura específica para los directorios y archivos bajo este directorio.&lt;/p&gt;&lt;p&gt;En particular, los recursos definidos en estos directorios y archivos tendrán sus correspondientes entradas en la clase "R" lo que permitirá que sea muy fácil referenciarlos y usarlos desde tus aplicaciones. Adicionalmente, estos archivos serán empaquetados y distribuidos como parte de tu aplicación.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #6&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 6&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;A continuación, abre la clase "Notepadv1"; ya que la vamos a modificar para convertirla en el adaptador de nuestra lista y así desplegar las anotaciones y agregar nuevas.&lt;/p&gt;&lt;p&gt;La clase "Notepadv1" es una subclase de "Activity" llamada "ListActivity", la cual tiene un funcionalidad adicional que es proporcionar todo tipo de operaciones que comúnmente desearíamos realizar con una lista. Por ejemplo, desplegar un número arbitrario de filas en la lista y permitir seleccionarlas.&lt;/p&gt;&lt;p&gt;Dale un vistazo al código de la clase "Notepadv1". Hay algunas definiciones de constantes, seguidas de propiedades privadas y finalmente algunos métodos que sobreescriben métodos de la super clase.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #7&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 7&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Cambia la herencia de "Notepadv1" de "Activity" a "ListActivity":&lt;/p&gt;&lt;pre&gt;&lt;code&gt;public class Notepadv1 extends ListActivity&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;NOTA: Debes importar la clase "ListActivity" en el archivo "Notepadv1". En Eclipse puedes precionar ctrl-shift-O (Windows y Linux).&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #8&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 8&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Debemos agregar código a los siguientes métodos: "onCreate", "onCreateOptionsMenu" y "onOptionsItemSelected".&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;onCreate() es llamado cuando la "Activity" es activada. Es una especie de método "main" en una aplicación "C". Este método es utilizado para definir recursos y estados de la "Activity" que se está ejecutándo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;onCreateOptionsMenu() es usado para poblar el menú de la "Activity". Este menú es mostrado cuando el usuario presiona el botón de menú.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;onOptionsItemSelected() es usado para controlar los eventos generados por el menú. Por ejemplo, cuando el usuario selecciona un elemento del menú.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #9&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 9&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;A continuación modificaremos el método "onCreate()".&lt;/p&gt;&lt;p&gt;Aquí definiremos el título de la actividad (el título es mostrado en el borde superior de la pantalla). Usaremos el diseño indicado en "notepad_list.xml" para desplegar los contenidos de la actividad. Además, definiremos una instancia de "DBHelper" para tener acceso de los datos de las anotaciones.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Llamamos al método "super.onCreate()" con el parámetro "icicle" que entrega nuestro método.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Llamamos al método "setContentView()" para definir "R.layout.notepad_list" como el esquema que usaremos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Creamos una propiedad privada llamada "dbHelper", la cual es una instancia de la clase "DBHelper" (esto lo hacemos antes del código del método "onCreate()").&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En el método "onCreate()", instanciamos la propiedad "dbHelper" (debemos pasar el valor "this" como argumentos del constructor de la clase "DBHelper").&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Finalmente, llamamos al método "fillData()" (será definido más adelante) para llenar nuestra lista con datos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Él método "onCreate()" debería verse así: &lt;pre&gt;&lt;code&gt;/** Called when the activity is first created. */&lt;br /&gt;@Override&lt;br /&gt;public void onCreate(Bundle icicle)&lt;br /&gt;{&lt;br /&gt; super.onCreate(icicle);&lt;br /&gt; setContentView(R.layout.notepad_list);&lt;br /&gt; dbHelper = new DBHelper(this);&lt;br /&gt; fillData();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;Recuerda agregar la definición de la propiedad (justo debajo de la definición de "private int noteNumber = 1;"):&lt;pre&gt;&lt;code&gt;private DBHelper dbHelper;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #10&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 10&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;A continuación modificaremos el método "onCreateOptionsMenu()".&lt;/p&gt;&lt;p&gt;Por ahora sólo agregaremos una opción al menú de la aplicación: "Add Item". El texto para esta opción es parte de los recursos de la aplicación y está definido en "strings.xml".&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;En el archivo "strings.xml" (localizado en "res/values"), agrega una nueva etiqueta para "menu_insert" con el texto "Add Item". &lt;pre&gt;&lt;code&gt;&amp;lt;string name="menu_insert"&amp;gt;Add Item&amp;lt;/string&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Necesitamos agregar una constante para la posición del menú: public static final int INSERT_ID = Menu.FIRST;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En el método "onCreateOptionsMenu()" agregar el ítem del menú. También nos hacemos cargo del resultado retornado por el llamado del método "super.onCreateOptionsMenu(menu)". &lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;La nueva versión del método debe verse de la siguiente forma:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;@Override&lt;br /&gt;public boolean onCreateOptionsMenu(Menu menu) &lt;br /&gt;{&lt;br /&gt; boolean result = super.onCreateOptionsMenu(menu);&lt;br /&gt; menu.add(0, INSERT_ID, R.string.menu_insert);&lt;br /&gt; return result;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Más información sobre menús&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;More on menus&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;La aplicación "Notepad" que estamos construyendo sólo muestra la superficie de los menús.&lt;/p&gt;&lt;p&gt;Podemos usar teclas para acelarar el uso de menús, crear submenús e incluso agregrar items de menús a otras aplicaciones.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #11&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 11&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Este método va a responder cuando se seleccione en el menú la opción "Add Note". Cuando la opción sea seleccionada, este método será llamado con el valor de "item.getId()" en "INSERT_ID" (la constante que nosotros definimos para identificar este elemento del menú). Realizaremos las siguientes acciones: &lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;El llamado al método "super.onOptionsItemSelected(item)" va al final del método porque primero nos interesa capturar los eventos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Codificamos una sentencia "switch" para evaluar "item.getId()".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;El "case INSERT_ID:" llama al método "createNote()".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Retornamos el valor devuelto por "super.onOptionsItemSelected(item)".&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;La nueva versión del método debe verse de la siguiente forma:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;@Override&lt;br /&gt;public boolean onOptionsItemSelected(Item item) &lt;br /&gt;{&lt;br /&gt; switch (item.getId()) {&lt;br /&gt; case INSERT_ID:&lt;br /&gt;  createNote();&lt;br /&gt;  fillData();&lt;br /&gt;  break;&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; return super.onOptionsItemSelected(item);&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #12&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 12&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Creación del método "createNote()".&lt;/p&gt;&lt;p&gt;En esta primera versión de "createNote()" simplemente crearemos una nueva nota con un título basado en un contador: "Note 1", "Note 2"... y tendrá un cuerpo en blanco. Algunas observaciones sobre el código:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;La sentencia: String noteName = "Note " + noteNumber++; es usada para construir el título de la nota.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;El llamado a "dbHelper.createRow()" creará la nota usando "noteName" como título y la el texto vacío ("") como cuerpo.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;La nueva versión del método debe verse de la siguiente forma:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;private void createNote() &lt;br /&gt;{&lt;br /&gt; String noteName = "Note " + noteNumber++;&lt;br /&gt; dbHelper.createRow(noteName, "");&lt;br /&gt; fillData();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #13&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 13&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Creación del método "fillData()".&lt;/p&gt;&lt;p&gt;Este método usa un "ArrayAdapter", el cual es la forma más fácil de poner datos en un "ListView". Un "ArrayAdapter" toma una "List" o un arreglo de "String" y los enlaza a una vista de texto provista en el diseño de una fila de la lista (esto es el campo "text1" de nuestro archivo "notes_row.xml"). Este método simplemente obtiene una lista de anotaciones desde el "database helper" y construye una "List" de "String" usando el título de cada registro y entonces crea un "ArrayAdapter" con todos esos ítems y los asocia con el diseño "notes_row".&lt;/p&gt;&lt;p&gt;Algunas observaciones sobre el ccódigo:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;"ArrayAdapter" necesita un "List" conteniendo los ítems a desplegar.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Los datos son recuperados como registros, y el título del registro es utilizado para poblar la lista.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Nosotros indicamos que "notes_row" es la vista que usaremos como receptora de los datos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Para importar automáticamente las clases utilizadas presiona ctrl-shift-O.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;La nueva versión del método debe verse de la siguiente forma:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;private void fillData() &lt;br /&gt;{&lt;br /&gt; // We need a list of strings for the list items&lt;br /&gt; List&amp;lt;String&amp;gt; items = new ArrayList&amp;lt;String&amp;gt;();&lt;br /&gt;&lt;br /&gt; // Get all of the rows from the database and create the item list&lt;br /&gt; List&amp;lt;Row&amp;gt; rows = dbHelper.fetchAllRows();&lt;br /&gt; for (Row row : rows) &lt;br /&gt; {&lt;br /&gt;  items.add(row.title);&lt;br /&gt; }&lt;br /&gt; &lt;br /&gt; // Now create an array adapter and set it to display using our row&lt;br /&gt; ArrayAdapter&amp;lt;String&amp;gt; notes = new ArrayAdapter&amp;lt;String&amp;gt;(this, R.layout.notes_row, items);&lt;br /&gt; setListAdapter(notes);     &lt;br /&gt; &lt;br /&gt; return;&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;NOTA: En este ejercicio hemos utilizado "ArrayAdapter", pero este objeto no es una solución escalable. Generalmente, "SimpleCursorAdapter" podría ser empleado en combinación con "ContentProvider" o al menos un "Cursor" retornado desde el "query". &lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Adaptadores de listas&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;List adapters&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Nuestro ejemplo utiliza un adaptador de colección muy simple, el cual asocia una colección o lista de items con una "ListView". En Android es más común que los adaptadores de listas vayan mano a mano con "ContentProviders" y esta es una forma muy fácil de usar listas.&lt;/p&gt;&lt;p&gt;Para asociar un "ContentProvider" con una "ListView" podemos usar un "SimpleCursorAdapter" que asociará los datos desde un "ContentProvider" con una "ListView".&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Paso #14&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Step 14&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Ejecución de la aplicación.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Paso #14&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;a href="http://2.bp.blogspot.com/__WZr8mbWg3o/R17iAnUfWNI/AAAAAAAAAB0/qKkKGa88g1Q/s320/figura-07.jpg" title="Link hacia la imagen en el sitio de Android's documentation." alt="Link hacia la imagen en el sitio de Android's documentation."&gt;&lt;img src="http://1.bp.blogspot.com/__WZr8mbWg3o/R2qHIXr7wjI/AAAAAAAAADk/erAvoaROx-8/s200/androidito.jpg" border="0"&gt;http://2.bp.blogspot.com/__WZr8mbWg3o/R17iAnUfWNI/AAAAAAAAAB0/qKkKGa88g1Q/s320/figura-07.jpg&lt;/a&gt;&lt;h2&gt;&lt;a href="#"&gt;Solución y próximos pasos&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Solution and Next Steps&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Puedes ver la solución a este clase en "Notepadv1Solution" para comparar su contenido con el tuyo.&lt;/p&gt;&lt;p&gt;Una vez que estés listo, continúa con el documento &lt;a href="http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial-ejercicio-2.html"&gt;Tutorial: Ejercicio #2&lt;/a&gt;, en el cual agregaremos la capacidad de crear, editar y borrar anotaciones.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-6230920452434990465?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/6230920452434990465/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=6230920452434990465' title='1 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6230920452434990465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6230920452434990465'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial-ejercicio-1.html' title='Manos a la obra - Tutorial - Ejercicio #1'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/__WZr8mbWg3o/R2qHIXr7wjI/AAAAAAAAADk/erAvoaROx-8/s72-c/androidito.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-2205171346120548016</id><published>2007-12-01T20:02:00.000-08:00</published><updated>2007-12-20T19:27:10.544-08:00</updated><title type='text'>Manos a la obra - Tutorial - Introducción</title><content type='html'>&lt;h1&gt;&lt;a href="#"&gt;Tutorial: Un editor de anotaciones&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Tutorial: A Notepad Application&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/intro/tutorial.html"&gt;Tutorial: A Notepad Application&lt;/a&gt;&lt;/p&gt;&lt;p&gt;El tutorial de esta sección te dará la oportunidad de utilizar el "Android framework" y las herramientas necesarias para la construcción de una aplicación. Partiendo desde un proyecto preconfigurado, continuaremos con el proceso de desarrollo de una aplicación en la que tendremos que programar la lógica y diseñar la UI. Finalmente, compilar el código y ejecutar la aplicación.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;Para el momento en que hayas terminado el tutorial, tú habrás creado una aplicación Android completamente funcional y además habrás aprendido en profundidad los conceptos más importantes en el desarrollo de una aplicación Android. Si te interesa agregar funcionalidades más complejas a tu aplicación, puedes darle un vistazo al código de ejemplo que es suministrado con el "Android SDK".&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;¿Quiénes deberían leer este tutorial?&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Who Should Use this Tutorial&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Este tutorial está concebido para ser utilizado por desarrolladores, especialmente para aquello que tienen conocimiento de Java. Si tú no tienes experiencia escribiendo aplicaciones Java, también puedes utilizar el tutorial pero deberás trabajar un poco más lento.&lt;/p&gt;&lt;p&gt;Este tutorial está basado en la información descrita en los documentos &lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra.html"&gt;Instalando el SDK&lt;/a&gt; y &lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-hola-androide.html"&gt;Hola Androide!&lt;/a&gt;, los cuales explican en detalle cómo preparar tu entorno de desarrollo para la construcción de aplicaciones Android. Antes de que comiences este tutorial, asegúrate de haber descargado e instalarlo el "SDK" de acuerdo a las instrucciones dadas.&lt;/p&gt;&lt;p&gt;Finalmente, este tutorial describe cómo desarrollar un editor de anotaciones dentro del entorno de desarrollo de Eclipse y con el "Android plugin" instalado. Si tú no estás usando Eclipse, puedes seguir los ejercicios y construir la aplicación, pero tú tendrás que determinar como realizar las instrucciones específicas para Eclipse en tu entorno particular. Si tú quieres agregar características más complejas a tu aplicación, puedes darle un vistazo al código de la aplicación "Notepad" que es suministrada en el área de ejemplos de código del "Android SDK".&lt;/p&gt;&lt;p&gt;El tutorial asume que tú ya estás familiarizado con los conceptos básicos de las aplicaciones Android y su terminología. Si este no es el caso, deberías comenzar a leer &lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-anatoma-de-una-aplicacin.html"&gt;Anatomía de una aplicación Android&lt;/a&gt; antes de continuar.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Archivos necesarios para los ejercicios&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Preparing for the Exercises&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Antes de que comencemos, es importante que tú instales y configures el entorno de desarrollo de Eclipse. Una vez que tu entorno esté completamente configurado, ubica el archivo "NotepadCodeLab.zip", el cual es parte de la distribución del SDK y desempaqueta los archivos de los ejercicios. Este archivo contiene una serie de archivos de proyectos Eclipse que serán usados en los ejercicios. Tú puedes usar estos proyectos y archivos para así evitar crear y configurar tus propios archivos de proyectos.&lt;/p&gt;&lt;p&gt;El archivo "NotepadCodeLab.zip" se encuentra en el directorio:&lt;/p&gt;&lt;p&gt;[Android SDK]\docs\intro\codelab&lt;/p&gt;&lt;p&gt;Una vez que ubicaste el archivo, extrae los archivos a un directorio de tu elección (yo lo haré en C:\NotepadCodeLab). Al extraer los archivos deberías ver seis directorios: Notepadv1, Notepadv2, Notepadv3, Notepadv1Solution, Notepadv2Solution y Notepadv3Solution. Los directorios llamados Notepadv* contienen los proyectos que utilizaremos en cada ejercicio, mientras que los directorios llamados "Notepadv*Solution" contienen los archivos correspondientes a la solución final. Las soluciones finales te permitirán detectar errores en caso que tus ejercicios no funciones adecuadamente.&lt;/p&gt;&lt;p&gt;NOTA: El archivo "NotepadCodeLab.zip" también puede ser descargado desde &lt;a href="http://code.google.com/android/intro/codelab/NotepadCodeLab.zip"&gt;NotepadCodeLab.zip&lt;/a&gt;&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Descripción de los ejercicios&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Exercises&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El siguiente listado contiene un breve descripción sobre las áreas que cada ejercicios cubre. Cada ejercicio asume que tú has completado el ejercicio anterior.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Ejercicio #1: Construir un simple lista de notas a la cual el usuario podrá agregar otras, pero no podrás editarlas. Esto demostrará: (a) los conceptos básicos de "ListActivities", (b) la creación y manipulación de opciones de menú y (c) la utilización de una base de datos SQLite para almacenar los datos. &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ejercicio #2: Agregar una segunda "Activity" a la aplicación. Esto demostrará: (a) la construción de una nueva "Activity", (b) modificación del archivo "Android manifest" para agregar la nueva "Activity", (c) paso de datos entre "Activity", (d) diseño más avanzado de pantallas y (e) cómo invocar asincrónicamente otra "Activity" a través de "startSubActivity()".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ejercicio #3: Agregar a la aplicación un controlador de eventos del ciclo de vida, para así mantener el estado de la aplicación a través de su ciclo de vida.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ejercicio #4: Demostrará cómo utilizar "Eclipse debugger" para ver los eventos del ciclo de vida de una aplicación en la medida que ellos van siendo generados. Esta sección es opcional, pero altamente recomendable.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Otros recursos para acelarar el aprendizaje&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Other Resources and Further Learning&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Más revisar algunos detalles no cubiertos en este tutorial, te recomiendo que leer la sección titulada "Tareas comunes en Android".&lt;/p&gt;&lt;p&gt;El "Android SDK" incluye una variedad de ejemplos completamente funcionales que te darán una excelente oportunidad para aprender nuevos conceptos. Estos ejemplos se encuentras en el directorio "[Android SDK]/samples/". &lt;/p&gt;&lt;p&gt;Este tutorial está basado en uno de los ejemplos distribuidos con el SDK. Es altamente recomendable que al final del tutorial revises esa aplicación ya que podrás aprender algunas interesantes caraterísticas, tales como: (a) definición de un lista personalizada para la lista de notas, (b) creación de una "VIEW" personalizada para editar el texto, (c) implementación completa de una "ContentProvider" y (d) revertir y descartar ediciones en vez de grabarlas automáticamente.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-2205171346120548016?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/2205171346120548016/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=2205171346120548016' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/2205171346120548016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/2205171346120548016'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial.html' title='Manos a la obra - Tutorial - Introducción'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-6462629942942661445</id><published>2007-11-29T15:17:00.000-08:00</published><updated>2007-12-30T15:04:48.935-08:00</updated><title type='text'>Manos a la obra - Anatomía de una aplicación Android</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/intro/anatomy.html"&gt;Anatomy of an Android Application&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Anatomía de una aplicación Android&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Anatomy of an Android Application&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Las aplicaciones Android están constituidas a partir de la combinación de los siguientes bloques:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;ContentProvider&lt;/a&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;NOTA: Una aplicación no requiere utilizar todos estos componentes.&lt;/p&gt;&lt;p&gt;Una vez que has seleccionado los componentes que utilizarás en tu aplicación, es necesario que los listes en un archivo llamado: "&lt;a href="http://code.google.com/android/devel/bblocks-manifest.html"&gt;AndroidManifest.xml&lt;/a&gt;". Este es un archivo XML en el que declaras los componentes de tu aplicación, sus capacidades y sus requerimientos.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Actividad&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Activity&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Una "actividad" es el bloque más usado en las aplicaciones "Android". Generalmente, una "actividad" es una pantalla individual en tu aplicación. Cada "actividad" se implementa como una clase que hereda de "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;", lo que hará que tu clase despliegue una UI compuesta de "&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;View&lt;/a&gt;"s y resonda a eventos. Lo común es que una aplicación consista de múltiples pantallas. Por ejemplo, una aplicación de mensajería podría usar una pantalla para mostrar el listado de contactos y en una segunda pantalla para escribir el mensaje al contacto seleccionado; y otras pantallas para ver cambiar la configuración. Cada una de estas pantallas debe ser implementada como una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;". La navegación entre las pantallas se hace iniciando una nueva "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;". En algunos casos, una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" podría devolver un valor a la "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" anterior, por ejemplo la "Actividad#1" podría permitir seleccionar una foto y esta foto sería devuelta a la "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" que hizo el llamado a "Actividad#1".&lt;/p&gt;&lt;p&gt;Cuando una pantalla es abierta, la previa es puesta en pausa y agregada al "History Stack". Posteriormente, el usuario puede navegar hacia previas pantallas invocando las pantallas almacenadas en el "History Stack". Las pantallas también pueden ser removidas del "History Stack" cuando resulta inapropiado su almacenamiento. Android mantiene un "History Stack" por cada una de las aplicaciones que son activadas desde la "Home Screen".&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Intentos y filtros de intentos&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Intent and Intent Filters&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Android usa una clase especial llamada "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" para moverse de una pantalla a otra. Un "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" describe lo que una aplicación desea hacer. Las dos partes más importantes de la estructura de datos de un "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" son la acción y los datos sobre los cuales se actuará. Los valores típicos para la acción son "MAIN", "VIEW", "PICK", "EDIT", etc. Los datos son expresados como una URI. Por ejemplo, para ver la información de contacto de una persona podría ser necesario crear un "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" con la acción "VIEW" y los datos definidos como una URI que representa a esa persona. &lt;/p&gt;&lt;p&gt;Una clase relacionada con "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" es "&lt;a href="http://code.google.com/android/reference/android/content/IntentFilter.html"&gt;IntentFilter&lt;/a&gt;". Si bien un "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" es una solicitud para realizar algo, un "&lt;a href="http://code.google.com/android/reference/android/content/IntentFilter.html"&gt;IntentFilter&lt;/a&gt;" es una descripción de lo que intenta hacer una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" (o de lo que intenta recibir). Una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" que es capaz de desplegar la información de contacto de una persona podría declarar que sabe cómo tratar la acción "VIEW" cuando es aplicada a los datos que representan a la persona. Una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" declara sus "&lt;a href="http://code.google.com/android/reference/android/content/IntentFilter.html"&gt;IntentFilter&lt;/a&gt;"s en el archivo "&lt;a href="http://code.google.com/android/devel/bblocks-manifest.html"&gt;AndroidManifest.xml&lt;/a&gt;".&lt;/p&gt;&lt;p&gt;La navegación de pantalla a pantalla es ejecutada a través de la resolución de intentos. Para navegar hacia adelante, una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" llama "startActivity(myIntent)". Entonces, el sistema examina todos los "&lt;a href="http://code.google.com/android/reference/android/content/IntentFilter.html"&gt;IntentFilter&lt;/a&gt;"s que existen para las aplicaciones instaladas y toma aquellas "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" cuyos "&lt;a href="http://code.google.com/android/reference/android/content/IntentFilter.html"&gt;IntentFilter&lt;/a&gt;" mejor se acercan a "myIntent". La nueva "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" es informada del "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;", lo que causa que sea activada. El proceso de resolución de "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;" ocurre en tiempo de ejecución cuando "startActivity" es llamado, lo cual tiene dos beneficios claves:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" puede reutilizar funcionalidades de otras componentes con sólo hacer un una solicitud en la forma de "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Una "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" puede ser reemplazada en cualquier momento por una nueva "&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity&lt;/a&gt;" que tenga un "&lt;a href="http://code.google.com/android/reference/android/content/IntentFilter.html"&gt;IntentFilter&lt;/a&gt;" equivalente.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h3&gt;&lt;a href="#"&gt;Recibidor de intento&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Intent Receiver&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Tú puedes utilizar un "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;" cuando quieras programar tu aplicación para que se ejecute como respuesta a un evento. Por ejemplo, cuando recibes una llamada, cuando la red de datos esta disponible o cuando es media noche. Los "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;"s no despliegan UI, sin embargo ellos podrían utilizar el "&lt;a href="http://code.google.com/android/reference/android/app/NotificationManager.html"&gt;NotificationManager&lt;/a&gt;" para avisar al usuario que algo interesante está pasando. Los "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;"s son registrados en el archivo "&lt;a href="http://code.google.com/android/devel/bblocks-manifest.html"&gt;AndroidManifest.xml&lt;/a&gt;", pero también pueden ser registrados programáticamente con el uso de "&lt;a href="http://code.google.com/android/reference/android/content/Context.html"&gt;Context&lt;/a&gt;.registerReceiver()". Tu aplicación no requiere estar corriendo para que sus "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;"s puedan ser llamados. Si tu aplicación no estuviera corriendo, el sistema la puede activar cuando uno de sus "&lt;a href="http://code.google.com/android/reference/android/content/IntentReceiver.html"&gt;IntentReceiver&lt;/a&gt;"s sea gatillado. Las aplicaciones también pueden transmitir sus propios "&lt;a href="http://code.google.com/android/reference/android/content/Intent.html"&gt;Intent&lt;/a&gt;"s a otras aplicaciones a través de "&lt;a href="http://code.google.com/android/reference/android/content/Context.html"&gt;Context&lt;/a&gt;.broadcastIntent()".&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Servicios&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Service&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Un "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;" es una aplicación que se mantiene activada por un largo tiempo y no despliega una UI. Un ejemplo es un programa que reproduce archivos mp3 desde una lista de música, mientras el usuario realiza otras actividades. En este caso, el programa podría iniciar un servicio con "&lt;a href="http://code.google.com/android/reference/android/content/Context.html"&gt;Context&lt;/a&gt;.startService()" y de esa forma reproducir la música sin necesidad de usar la pantalla. El sistema mantendrá el servicio de reproducción de música corriendo hasta que finalice. Si quieres aprender más sobre la prioridad que es dada a los servicios por el sistema, lee "&lt;a href="http://celutron.blogspot.com/2007/12/ciclo-de-vida-de-una-aplicacin-android.html"&gt;Ciclo de vida de una aplicación Android&lt;/a&gt;". Es posible conectarse a un "&lt;a href="http://code.google.com/android/reference/android/app/Service.html"&gt;Service&lt;/a&gt;" (y activarlo si no estuviera corriendo) haciendo uso del método "&lt;a href="http://code.google.com/android/reference/android/content/Context.html"&gt;Context&lt;/a&gt;.bindService()". Una vez que la aplicación está conectada al servicio, la comunicación entre tu aplicación y el servicio se realiza a través de la interfaz que el "servicio" expone. Para nuestro ejemplo del reproductor mp3, está interfaz podría permitir hacer pausa o saltar a una nueva canción.&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Proveedor de contenidos&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Content Provider&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Las aplicaciones puedes almacenar sus datos en archivos, una base de datos "&lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt;" o cualquier otro mecanismo. Sin embargo, un "&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;Content Provider&lt;/a&gt;" es de utilidad cuando los datos de tu aplicación deben ser compartidos con otras aplicaciones. Un "&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;Content Provider&lt;/a&gt;" es una clase que implementa un conjunto estándar de métodos para que otras aplicaciones almacenen o recuperen el tipo de datos que el "&lt;a href="http://code.google.com/android/reference/android/content/ContentProvider.html"&gt;Content Provider&lt;/a&gt;" manipula.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-6462629942942661445?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/6462629942942661445/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=6462629942942661445' title='5 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6462629942942661445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6462629942942661445'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/manos-la-obra-anatoma-de-una-aplicacin.html' title='Manos a la obra - Anatomía de una aplicación Android'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-6428420591019407671</id><published>2007-11-26T19:19:00.000-08:00</published><updated>2008-12-11T14:10:28.262-08:00</updated><title type='text'>Manos a la obra - Hola Androide</title><content type='html'>&lt;span style="font-size:130%;"&gt;&lt;strong&gt;Hola Androide&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La mejor forma de hacerse una primera impresión del entorno de desarrollo de Android es experimentando que tan fácil es crear la famosa aplicación: "Hola Mundo" al estilo Android.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Descripción genérica del proceso&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;La creación de un proyecto Android Eclipse es realmente sencillo, esta es una descripción del proceso a grandes rasgos:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Crea un nuevo "Android Project" seleccionando del menú principal &lt;strong&gt;File &gt; New &gt; Project&lt;/strong&gt;. &lt;/li&gt;&lt;li&gt;Ingresa la información con el detalle del proyecto en el cuadro de diálogo "New Android Project". &lt;/li&gt;&lt;li&gt;Modifica el código de la plantilla auto-generada para que despliegue el mensaje "Hola Mundo".&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;strong&gt;Creación del proyecto&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Desde el menú principal selecciona "&lt;strong&gt;File &gt; New &gt; Project&lt;/strong&gt;". Si el "Android Plugin" para Eclipse fue correctamente instalado, debería abrirse el cuadro de diálogo "New Project" y deberías ver el elemento llamado "Android" y al expandirlo deberías ver el subelemento llamado "Android Project". &lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[agregar imagen]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;Después de seleccionar "Android Project", pressiona el botón "Next".&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Información del proyecto&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;En el cuadro de diálogo "New Android Project" debes ingresar la información relevante del proyecto. La siguiente figura es un ejemplo:&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;[agregar imagen]&lt;/span&gt;&lt;/p&gt;&lt;p&gt;A continuación está la descripción de cada uno de los datos que debes ingresar:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;strong&gt;Project Name&lt;/strong&gt; :  Este es el nombre del directorio en tu computador que contendrá los archivos del proyecto.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Package Name&lt;/strong&gt; :  Este es el "package namespace" (es el mismo concepto de "package" en Java). Esto también fijará el nombre del "package" que será utilizado al momento de generar el "stub" de la "Activity". El nombre del "package" utilizado en tu aplicación debe ser único y distinto a todos aquellos intalados en el sistema, por esta razón es muy importante utilizar nombres de "packages" en un formato estándar de dominios. En este ejemplo, utilizaré el nombre de dominio "com.northvortex.android" y tú deberías utilizar uno diferente y apropiado a tu organización.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;Activity Name&lt;/strong&gt; :  Este es el nombre de la clase que será generada por el "plugin". Esta clase será una subclase de "Activity". Una "Activity" es simplemente una clase que puede ejecutarse y realizar una tarea. Puede crear una UI si lo deseas, pero no es necesario.&lt;/li&gt;&lt;li&gt; &lt;span style="font-weight: bold;"&gt;Application Name&lt;/span&gt; : Este es el nombre con el cual tu aplicación será conocida por los usuarios.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Use default location&lt;/span&gt; : este checkbox permite cambiar la ubicación en el disco donde los archivos del proyecto serán generados y almacenados.&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Revisión del código fuente generado&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;El código fuente que será generado para la aplicación "Hola Androide" será el siguiente:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);font-size:100%;" &gt;public class HolaAndroide extends Activity&lt;br /&gt;{&lt;br /&gt;/** Called when the activity is first created. */&lt;br /&gt;@Override&lt;br /&gt;public void onCreate(Bundle icicle)&lt;br /&gt;{&lt;br /&gt;super.onCreate(icicle);&lt;br /&gt;setContentView(R.layout.main);&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Edición del código fuente&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El siguiente código muestra la aplicación modificada para que despliegue el mensaje "Hola Androide".&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;import android.widget.TextView;&lt;br /&gt;public class &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);font-size:100%;" &gt;HolaAndroide &lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;extends Activity&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    /** Called when the activity is first created. */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public void onCreate(Bundle icicle) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        super.onCreate(icicle);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        TextView tv = new TextView(this);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        tv.setText("Hola Androide");&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        setContentView(tv);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Descripción de los cambios en el código&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El primer cambio corresponde a "import android.widget.TextView;", la cual es necesaria para utilizar la clase "TextView".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NOTA&lt;/span&gt;: En Android, la interfaz de usuario está compuesta de un jerarquía de clases llamadas "Views.  Una "View" es simplemente un objeto que puede ser pintado en la pantalla, tal como una animación o un botón.  El nombre específico para la subclase de "View" que manipula texto es "TextView".&lt;br /&gt;&lt;br /&gt;Esta es la sintaxis para crear un objeto "TextView":&lt;br /&gt;&lt;br /&gt;TextView tv = new TextView(this);&lt;br /&gt;&lt;br /&gt;El argumento para el constructor de "TextView" es una instancia de "Context". Un "Context" es simplemente un enlace hacia el sistema y es lo que provee el acceso a recursos como bases de datos, preferencia entre otras cosas. La clase "Activity" hereda de "Context" y debido a que nuestra aplicación es un subclase de "Activity", entonces también lo es de Context", de ese modo podemos pasar "this" como argumento al constructor de "TextView".&lt;br /&gt;&lt;br /&gt;A continuación indicamos que texto deseamos desplegar:&lt;br /&gt;&lt;br /&gt;tv.setText("Hello, Android");&lt;br /&gt;&lt;br /&gt;Con la siguiente línea, conectamos la "TextView" con la pantalla:&lt;br /&gt;&lt;br /&gt;setContentView(tv);&lt;br /&gt;&lt;br /&gt;El método "setContentView()" (de "Activity") le indica indica al sistema que "View" debe ser asociada con la UI de la "Activity". Si una "Activity" no llama a este método ninguna UI será presentada y el sistema simplemente mostrará una pantalla en blanco.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ejecución de la aplicación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"Eclipse plugin" hace muy sencilla la ejecución de tus aplicaciones. Comienza abriendo el cuadro de diálogo "Run", para ello selecciona "Run &gt; Open Run Dialog". La siguiente figura muestra este cuadro:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__WZr8mbWg3o/R0yn885OzqI/AAAAAAAAABU/buoOOO8sQW4/s1600-h/figura-03.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/__WZr8mbWg3o/R0yn885OzqI/AAAAAAAAABU/buoOOO8sQW4/s320/figura-03.jpg" alt="" id="BLOGGER_PHOTO_ID_5137665940503056034" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A continuación expande el elemento "Android Application" y presiona el ícono  mostrado en la siguiente figura:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/__WZr8mbWg3o/R0yopM5OzrI/AAAAAAAAABc/ZKd1-d_M3xM/s1600-h/figura-04.jpg"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/__WZr8mbWg3o/R0yopM5OzrI/AAAAAAAAABc/ZKd1-d_M3xM/s400/figura-04.jpg" alt="" id="BLOGGER_PHOTO_ID_5137666700712267442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;o simplemente haz doble clic in el elemento "Android Application". Como resultado de esto deberías tener un nuevo elemento bajo "Android Application" llamado "New_configuration".&lt;br /&gt;&lt;br /&gt;Ingresa en la casilla de texto algo que identique tu aplicación, para nuestro ejemplo será "Hola, Androide" y luego selecciona tu proyecto usando el botón "Browse". El plugin automáticamente va a revisar tu proyecto y buscar todas las "Activity" para así llenar el combo box "Activity:". Selecciona de este combo box la "Activity" principal. Finalmente, presiona el botón "Apply".&lt;br /&gt;&lt;br /&gt;Ahora presiona el botón"Run" y el "Android Emulator" debería activarse.  Una vez que esté activo, tu aplicación debería aparecer y verse similar a como muestra la siguiente figura:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/__WZr8mbWg3o/R0yras5OzsI/AAAAAAAAABk/GBNnFBbi87s/s1600-h/figura-05.jpg"&gt;&lt;img style="cursor: pointer;" src="http://3.bp.blogspot.com/__WZr8mbWg3o/R0yras5OzsI/AAAAAAAAABk/GBNnFBbi87s/s320/figura-05.jpg" alt="" id="BLOGGER_PHOTO_ID_5137669750139047618" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cambios en la UI a través del "XML Layout"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La UI de la aplicación que hemos programado fue creada "programáticamente". Esto significa que la UI de una aplicación puede ser construida invocando operaciones de las API.  Este enfoque tiene las siguientes deficiencias: un pequeño cambio en el diseño de la pantalla puede resultar en grandes dolores de cabeza. Además, es muy fácil olvidar conectar las "Views "; lo cual puede causar errores en el despliegue de datos en la pantalla y pérdida de tiempo depurando la aplicación.&lt;br /&gt;&lt;br /&gt;Para evitar lo descrito anteriormente es que "Android" provee un modelo alternativo para la construcción de la UI de una aplicación. Este nuevo enfoque es llamado"XML-based layout". La forma más sencilla de explicar este concepto es mostrar un ejemplo.&lt;br /&gt;&lt;br /&gt;A continuación se muestra un archivo XML que describe un diseño idéntico al que construimos a través del enfoque programático:&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;textview&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;xmlns:android="http://schemas.android.com/apk/res/android"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;android:layout_width="fill_parent"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;android:layout_height="fill_parent"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;android:text="Hola Androide"/&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;La estructura general de un archivo "Android XML layout" es sencilla: es un árbol de etiquetas y cada  etiqueta es el nombre de una de las clases "View". En este ejemplo, la estructura del archivo sólo tiene un elemento: un TextView.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;El los archivo "Android XML layout", es posible utilizar etiquetas con el nombre de cualquier clase que herede de "View". Esto incluye el nombres de las clases que tú mismo hayas creado. El uso de archivos "Android XML layout" hace mucho más fácil y rápida la construcción de UI en comparación lo que tendrías que hacer si lo hicieras programáticamente. Este modelo está inspirado en el "web development model", el te permite separar la presentación de tu aplicación (su UI) de la lógica utilizada para manipular los datos.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;A continuación está un breve descripción de los atributos empleados en el archivo &lt;/span&gt;&lt;/textview&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"Android XML layout" de este ejemplo.&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;xmlns:android&lt;/span&gt; : esto corresponde a la declaración de un "XML namespace" y le indica a las herramientas de "Android" que haremos referencia a atributos definidos en el "Android namespace". La etiqueta raíz de cada archivo &lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;textview&gt;&lt;/textview&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"Android XML layout" debe tener este atributo&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;android:layout_width&lt;/span&gt; : este atributo indica el espacio a lo ancho que este elemento utilizará en la pantalla.  En nuestro ejemplo, como tenemos un sólo elemento haremos que ocupe toda la pantalla, por esta razón su valor es "fill_parent" means.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;android:layout_height&lt;/span&gt; : este es similar a "android:layout_width", pero se refiere a la altura.&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;android:text&lt;/span&gt; : este atributo define el texto que el elemento "TextView" va a contener inicialmente.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold;"&gt;NOTA&lt;/span&gt;: Los archivos "&lt;/span&gt;&lt;/span&gt;XML layout" deben almacenarse en el subdirectorio "res/" del directorio de tu proyecto. Además, en este subdirectorio debemos almacenar todos aquellos archivos que no son de código fuente, esto incluye imágenes, textos regionalizados y los archivos "XML layout". El nombre "res" es la abreviación para "resources".&lt;br /&gt;&lt;br /&gt;El "Eclipse plugin" crea automáticamente uno de estos archivos para tu proyecto. En nuestro ejemplo, nosotros simplemente no hicimos uso de él.  A continuación modificaremos el archivo &lt;span style="color: rgb(51, 51, 255);"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;"&lt;/span&gt;&lt;/span&gt;XML layout" de nuestro proyecto, para ello en la ventana "Package Explorer" expande el elemento "res/layout" y reemplaza el contenido del archivo "main.xml" con el texto XML descrito anteriormente.&lt;br /&gt;&lt;br /&gt;Ahora, en la ventana "Package Explorer", expande el elemento "src" y edita el archivo "R.java". Debería ser verse como el siguiente código:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;/* AUTO-GENERATED FILE.  DO NOT MODIFY.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; *&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; * This class was automatically generated by the&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; * aapt tool from the resource data it found.  It&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; * should not be modified by hand.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt; */&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;package com.patatas;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public final class R {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public static final class attr {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public static final class drawable {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        public static final int icon=0x7f020000;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public static final class layout {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        public static final int main=0x7f030000;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public static final class string {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        public static final int app_name=0x7f040000;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El archivo "R.java" es un índice a todos los recursos definidos en el proyecto. Esta clase sirve de abreviación al momento de referenciar cualquier recurso que hayas definido en tu proyecto. Esta característica resulta muy poderosa en combinación con las facilidades de autocompletación de Eclipse, porque te permite rápidamente e interactivamente localizar las referencias que estás buscando.&lt;br /&gt;&lt;br /&gt;Por ahora, lo más importante es fijar la atención en la clase llamada "layout" y su miembro llamado "main". "Eclipse plugin" se dió cuenta que agregaste un archivo "XML layout" y por lo tanto regeneró el archivo "R.java". En la medida que agregues nuevos recursos a tu proyecto, notarás que el archivo "R.java" es actualizado para reflejar los cambios.&lt;br /&gt;&lt;br /&gt;La última cosa que necesitas modificar es el código fuente de "HolaAndroide" para indicar que utilizarás el  "XML layout" para la UI de la aplicación.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;NOTA&lt;/span&gt;: Cuando hagas este cambio, utiliza las facilidades de Eclipse para autocompletación, de esa forma el use la clase "R" te parecerá más interesante.&lt;br /&gt;&lt;br /&gt;A continuación está el nuevo código y como ves es mucho más sencillo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class HelloAndroid extends Activity {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    /** Called when the activity is first created. */&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    @Override&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    public void onCreate(Bundle icicle) {&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        super.onCreate(icicle);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;        setContentView(R.layout.main);&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ahora que haz hecho el cambio, vuelve a ejecutar la aplicación. Cuando la aplicación se active, tú deberías ver exactamente la misma UI que tenías anteriormente.&lt;br /&gt;&lt;br /&gt;Para más información sobre "XML layouts" lee "Implementado la interfaz de usuario".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Depurando nuestra aplicación&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;"Android Plugin" para Eclipse está muy bien integrado con "Eclipse debugger". Para demostrarlo, introduciremos un error en nuestro código y posteriormente depuraremos el código para encontrar el error. Cambia el código fuente de la siguiente forma:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 255);"&gt;public class HelloAndroid extends Activity {&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    /** Called when the activity is first created. */&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    @Override&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    public void onCreate(Bundle icicle) {&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;        super.onCreate(icicle);&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;        Object o = null;&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;        o.toString();&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;        setContentView(R.layout.main);&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;    }&lt;/span&gt; &lt;span style="color: rgb(51, 51, 255);"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Este cambio hará que nuestra aplicación genere un "NullPointerException". Si corres el programa deberías ver algo como esto:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/__WZr8mbWg3o/R09EGM5OztI/AAAAAAAAABs/12Pr3bexjF8/s1600-h/figura-06.jpg"&gt;&lt;img style="cursor: pointer;" src="http://4.bp.blogspot.com/__WZr8mbWg3o/R09EGM5OztI/AAAAAAAAABs/12Pr3bexjF8/s320/figura-06.jpg" alt="" id="BLOGGER_PHOTO_ID_5138400573184200402" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Para encontrar el error, fija un "breakpoint" en el código fuente en la línea "Object o = null;" Luego, seleccionar Run &gt; Debug Last Launched para entrar en modalidad de depuración(debug mode). Tu aplicación va a reiniciar el emulador, pero esta vez se suspenderá antes de llegar al "breakpoint" que tú fijaste. Desde ese momento, puedes comenzar a ejecutar el código línea a línea dentro de la perspectiva "Debug" de Eclipse, tal como lo harías con cualquier otra aplicación.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-6428420591019407671?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/6428420591019407671/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=6428420591019407671' title='2 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6428420591019407671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/6428420591019407671'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/manos-la-obra-hola-androide.html' title='Manos a la obra - Hola Androide'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/__WZr8mbWg3o/R0yn885OzqI/AAAAAAAAABU/buoOOO8sQW4/s72-c/figura-03.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-1674045011801159333</id><published>2007-11-26T13:14:00.000-08:00</published><updated>2007-12-28T11:06:20.074-08:00</updated><title type='text'>Manos a la obra - Instalación del SDK</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/intro/installing.html"&gt;Installing the SDK&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Instalando el SDK&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Installing the SDK&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;A continuación se encuentran las instrucciones necesarias para instalar "Android SDK" y configurar tu entorno de desarrollo.&lt;/p&gt;&lt;p&gt;Utiliza el siguiente link para nevegar a la página desde la cual podrás bajar el software necesario : &lt;a href="http://code.google.com/android/download.html"&gt;Descarga de Android SDK&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Requerimiento de sistema operativo y software&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;System and Software Requirements&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Para desarrollar aplicaciones Android usando el código y herramientas del "Android SDK" es necesario que tu computador y entorno de desarrollo cumplan con los siguientes requerimientos.&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Sistemas operativos soportados&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Supported Operating Systems&lt;/b&gt;]&lt;/p&gt;&lt;p /&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Windows XP o Vista&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Linux (probado en Linux Ubuntu Dapper Drake)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Mac OS X 10.4.8 o superior (sólo x86)&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h3&gt;&lt;a href="#"&gt;Entornos de desarrollo&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Supported Development Environments&lt;/b&gt;]&lt;/p&gt;&lt;h4&gt;&lt;a href="#"&gt;Eclipse IDE&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;[Título original: &lt;b&gt;Eclipse IDE&lt;/b&gt;]&lt;/p&gt;&lt;p /&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Eclipse 3.2, 3.3 (Europa)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Eclipse JDT Plugin.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;JDK 5 ó JDK 6 (JRE por sí solo no es suficiente)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;No es compatible con Gnu Compiler para Java (gcj)&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h4&gt;&lt;a href="#"&gt;Otros entornos de desarrollo&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;[Título original: &lt;b&gt;Other development environments or IDEs&lt;/b&gt;]&lt;/p&gt;&lt;p /&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;JDK 5 o JDK 6 (JRE por sí solo no es suficiente)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;No es compatible con Gnu Compiler para Java (gcj)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Apache Ant 1.6.5 o superior para Linux y Mac&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;NOTA: Si JDK ya está instalado en tu computador, debes verificar que la versión que tienes cumple con los requerimientos descritos. Generalmente, las distribuciones Linux incluyen JDK 1.4 o Gnu Compiler para Java; los cuales no tienen soporte en el entorno de desarrollo de Android.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Instalando el SDK&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Installing the SDK&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Después de bajar el "SDK", extrae el contenido del archivo ".zip". Por omisión, los archivos del "SDK" serán extraídos en un directorio llamado: android_sdk_&amp;lt;platform&amp;gt;_&amp;lt;release&amp;gt;_&amp;lt;build&amp;gt;.  (ejemplo: android_sdk_windows_m3-rc20a). Este directorio contendrá los siguientes subdirectorios: "tools/", "samples/" y "docs/"&lt;/p&gt;&lt;p&gt;NOTA: Posteriormente, cuando configuremos el "Android plugin" o usemos las "SDK tools", nos referiremos a este directorio como el "SDK directory". &lt;/p&gt;&lt;p&gt;Opcionalmente, puedes agregar a la variable de entorno "path" el directorio "tools/". Como está mencionado anteriormente, este directorio está ubicado dentro del "SDK directory" y lo llamaremos "SDK tools directory".&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Linux : edita tu archivo "~/.bash_profile" o "~/.bashrc". Busca la línea que modifica la variable de entorno "PATH" y agrega la ubicación completa del "SDK tools directory". En caso que no exista esa línea, agrega lo siguiente: &lt;pre&gt;&lt;code&gt;export PATH=${PATH}:&amp;lt;your_sdk_dir&amp;gt;/tools&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Windows : haz clic en "My Computer" y selecciona "Properties". En la lengüeta "Advanced" presiona el botón "Environment Variables" y en el cuadro que diálogo que se abrirá haz doble clic en "Path" que está en el cuadro "System Variables". Finalmente, agrega la ubicación completa del "SDK tools directory".&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;NOTA: El hecho de agregar el "SDK tools directory" a tu "path" te permitirá ejecutar el "Android Debug Bridge (adb)" y otras herramientas de comandos de línea sin la necesidad de escribir la ubicación completa del "SDK tools directory". Si posteriormente actualizas el "SDK", debes también actualizar el valor de la variable "PATH" con la ubicación de la nueva actualización del "SDK".&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Instalación del Eclipse Plugin - ADT&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Installing the Eclipse Plugin - ADT&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Si actualmente utilizas "Eclipse IDE" como tu entorno de desarrollo Java, te recomiento que instales el "plugin" llamado "Android Development Tools (ADT)", el cual provee soporte y acceso integrado para los proyectos Android y las herramientas del "SDK". El "ADT plugin" incluye una variedad de extensiones que te permitirán crear, ejecutar y depurar aplicaciones Android de una manera fácil y rápida.&lt;/p&gt;&lt;p&gt;NOTA: Si tu no vas a usar "Eclipse IDE", no es necesario que bajes e instales "ADT plugin".&lt;/p&gt;&lt;p&gt;A continuación se describe paso a paso las instrucciones necesarias para bajar e instalar el "ADT plugin" y configurar Eclipse para realizar la actualización del plugin desde su sitio de publicación.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Inicia Eclipse, luego selecciona "Help &amp;gt; Software Updates &amp;gt; Find and Install...".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En el cuadro de diálogo que aparece, selecciona "Search for new features to install" y presiona el botón "Next".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Presiona el botón "New Remote Site...".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En el cuadro de diálogo, ingresa un nombre para el sitio remoto (por ejemplo: "Android Plugin") e ingresa la siguiente URL: &lt;pre&gt;&lt;code&gt;https://dl-ssl.google.com/android/eclipse/&lt;/code&gt;&lt;/pre&gt; y presiona el botón "OK".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ahora deberías ver "Android Plugin" agregado a la lista de búsqueda y además debería estar seleccionado. Presiona el botón "Finish". Esto abrirá el cuadro de diálogo "Updates".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En el cuadro de diálogo "Updates", marca la casilla de selección para "Android Plugin" y presiona el botón "Next".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Lee el "ANDROID SOFTWARE DEVELOPMENT KIT LICENSE AGREEMENT" y si estas de acuerdo, entonces selecciona "I accept terms of the license agreement". Presiona el botón "Next".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Presiona el botón "Finish". El "ADT Plugin" comenzará a descargarse.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;El "ADT plugin" no está firmado pero igual puedes aceptar la instalación presionando el botón "Install All".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Reinicia Eclipse.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Después de reiniciar Eclipse, selecciona "Window &amp;gt; Preferences..." (esto abrirá el cuadro de diálogo "Preferences"). Luego haz clic en el elemento "Android". A continuación actualiza la casilla de texto "SDK Location" con el directorio "SDK directory". Finalmente, presiona el botón "Apply" y el botón "OK".&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h3&gt;&lt;a href="#"&gt;Actualización del ADT Plugin&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Updating the ADT Plugin&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Sigue las siguientes instrucciones para actualizar el "ADT plugin" con la última versión:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Selecciona "Help &amp;gt; Software Updates &amp;gt; Find and Install...."&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Selecciona Search for updates of the currently installed features y presiona Finish.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Si hubiese disponible una nueva actualización del ADT, selecciónala e instálala.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Otra alternativa es:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Selecciona Help &amp;gt; Software Updates &amp;gt; Manage Configuration.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Expande el árbol y selecciona el elemento Android Development Tools [versión]&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Selecciona Scan for Updates bajo Available Tasks.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h3&gt;&lt;a href="#"&gt;Consejo para descargar ADT&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Tips for downloading ADT&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Si estás teniendo problemas para descargar ADT plugin después de haber seguido los antes antes mencionados, aquí tienes algunas sugerencias:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;En el paso 4, intenta usar http en vez de https en la URL del sitio remoto.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Si tú estás detrás de un firewall (tal como un firewall corporativo), asegúrate que tú tienes apropiadamente configurado tu proxy en Eclipse. En Eclipse 3.3, tú puedes configurar tu información de proxy desde el menú principal "Window &amp;gt; Preferences &amp;gt; General &amp;gt; Network Connections". En Eclipse 3.2, usa "Window &amp;gt; Preferences &amp;gt; Install/Update".&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Si aún después de lo anterior no logras descargar el ADT plugin a través de Eclipse, sigue los siguientes pasos para descargar e instalar el plugin desde tu computador:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Descarga el archivo ZIP del ADT&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Descomprime el archivo ZIP en su propio directorio&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Sigue los pasos 1 y 2 de las instrucciones estándard mencionadas anteriormente&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Presiona "New Local Site..."&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En el cuadro de diálogo, selecciona el directorio donde descomprimiste el archivo ZIP&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Sigue los pasos 5 hasta el 11 de las instrucciones estándard mencionadas anteriormente para completar la instalación&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;NOTA: Para actualizar el plugin tendrás que seguir estos mismos pasos en vez de las instrucciones estándard de instalación&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Desarrollando aplicaciones Android con Eclipse&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Developing Android Applications on Eclipse&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El primer paso en el desarrollo de una aplicación Android con "Eclipse IDE" es crear un proyecto Android y luego configurar la ejecución de la aplicación. Después de esto, puedes escribir, ejecutar y depurar tu aplicación.&lt;/p&gt;&lt;p&gt;La sección a continuación provee instrucciones asumiendo que tu haz instalado el ADT plugin en tu entorno Eclipse. Si tú no lo haz instalado, deberías hacerlo antes de continuar con las siguientes instrucciones. Lee "&lt;b&gt;&lt;i&gt;Actualización del ADT Plugin&lt;/i&gt;&lt;/b&gt; [falta link]" para más información.&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Creación de un proyecto Android&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Creating an Android Project&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El "ADT plugin" provee un "New Project Wizard" que puede ser utilizado para crear rapidamente un proyecto Eclipse nuevo o uno a partir de código existente. Para crear el proyecto sigue las siguientes instrucciones:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Selecciona "File &amp;gt; New &amp;gt; Project"&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Selecciona Android &amp;gt; Android Project, y presiona Next, esto abrirá el cuadro de diálogo "New Android Project".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En la casilla de texto "Project name" ingresa el nombre del proyecto. En el marco llamado "Contents" selecciona Create new project in workspace para así crear un nuevo proyecto. En el marco llamado "Properties", ingresa el nombre del paquete base ("Package name"), el nombre de tu "Activity" ("Activity name") para crear su correspondiente archivo ".java" y un nombre con el cual será conocida tu aplicación ("Application name"). En el marco llamado "Contents" selecciona Create project from existing source para así crear un proyecto basado en código que ya existe. Usa esta opción si tú quieres construir y ejecutar cualquiera de las aplicaciones de ejemplo incluidas en el SDK. Las aplicaciones de ejemplo están ubicadas en el directorio "samples/" del "SDK directory". Navega al directorio que contiene los archivos fuentes y clic OK. Si el directorio contiene un archivo "Android manifest" válido, el "ADT plugin" llenará automáticamente las casillas de texto para "Package name", "Activity name" y "Application name". &lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Presiona Finish.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Después de realizado los pasos anteriores podrás ver los siguientes directorios y archivos en la estructura de tu proyecto:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;src/ un directorio que contiene el archivo ".java" para tu "Activity".&lt;br /&gt;res/ un directorio que contendrá los recursos de tu aplicación.&lt;br /&gt;AndroidManifest.xml Este es el archivo "Android manifest" de tu proyecto.&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;&lt;a href="#"&gt;Configurando la activación de una aplicación Android&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Creating a Launch Configuration&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Para poder ejecutar o depurar una aplicación desde Eclipse debes definir una "launch configuration" para ella. Una "launch configuration" indica qué proyecto activar, qué "Activity" iniciar y las opciones que utilizará el emulador, etcétera.&lt;/p&gt;&lt;p&gt;Para definir una "launch configuration" para tu aplicación sigue las siguientes instrucciones:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Selecciona "Run &amp;gt; Open Run Dialog... o Run &amp;gt; Open Debug Dialog...", según corresponda.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En la lista de tipos de proyectos ubica "Android Application" y abre su menú de contexto (clic con botón derecho) y selecciona la opción New.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En la casilla de texto "Name", reemplaza "New_configuration" con el nombre de tu configuración.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En la lengüeta Android, usa el botón "browse"para seleccionar el proyecto y usa la lista "Activity" para seleccionar la "Activity" que será iniciada con la activación del proyecto.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En la lengüeta "Emulator", define el tamaño de pantalla y las propiedades de tu red y cualquier otro parámetro adicional para el emulador.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;En la lengüeta "Common" puedes definir más opciones.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Presiona "Apply" para guardar los valores de tu "launch configuration". Luego presiona Run o Close, según corresponda.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h3&gt;&lt;a href="#"&gt;Ejecución y depurado de una aplicación&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Running and Debugging an Application&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Una vez que has definido el "launch configuration" para tu aplicación, puedes ejecutarla o depurarla. Las siguientes instrucciones explican cómo realizar estas acciones.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Desde el menú principal de Eclipse selecciona "Run &amp;gt; Run" o "Run &amp;gt; Debug" , según corresponda.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Nota: la "launch configuration" activa es la más reciente "launch configuration" seleccionada en el "Run configuration manager", y por lo tanto no necesariamente corresponde a la aplicación que esté seleccionada en el panel "Eclipse Navigation". &lt;/p&gt;&lt;p&gt;Para fijar o cambiar la "launch configuration" usa el "Run configuration manager", el cual puedes activar a través de "Run &amp;gt; Open Run Dialog..." o "Run &amp;gt; Open Debug Dialog...."&lt;/p&gt;&lt;p&gt;La ejecución o depuración de una aplicación realiza los siguientes pasos:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Activa el emulador, si es no estuviera activo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Compila el proyecto (si hubo algún cambio desde la última compilación) e instala la aplicación en el emulador.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Run : activa la aplicación.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Debug : activa la aplicación en modalidad "Wait for debugger", luego abre la "Debug perspective" y anexa el "Eclipse Java debugger" a la aplicación.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Desarrollando aplication Android con otros IDEs y herramientas&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Developing Android Applications with Other IDEs and Tools&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Esta sección no la traduciré.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Depuración una aplicación&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Debugging&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Android provee un amplio conjunto de herramientas que te ayudarán a depurar tus programas:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;DDMS - Es un programa gráfico que soporta "port forwarding" (esto permite definir "breakpoints" en el código fuente directamente en tu IDE), captura el contenido de la pantalla del emulador, despliega información de "threads" y del "stack" y muchas otras facilidades. Además, es posible ejecutar logcat para recuperar los mensajes de Log de tu aplicación.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;logcat - Esta herramienta la puedes utilizar para descargar los mensaje de log del sistema. Estos mensajes incluyen información del "stack trace" en el caso que el emulador lance un error, como también los mensajes de Log. &lt;pre&gt;&lt;code&gt;...&lt;br /&gt;I/MemoryDealer( 763): MemoryDealer (this=0x54bda0): Creating 2621440 bytes heap at 0x438db000&lt;br /&gt;I/Logger( 1858): getView() requesting item number 0&lt;br /&gt;I/Logger( 1858): getView() requesting item number 1&lt;br /&gt;I/Logger( 1858): getView() requesting item number 2&lt;br /&gt;D/ActivityManager( 763): Stopping: HistoryRecord{409dbb20 com.google.android.home.AllApps}&lt;br /&gt;...&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Android Log - Es una clase que provee facilidades para imprimir mensajes de log a hacia un archivo en el emulador. Para leer estos mensaje (en tiempo real) sólo necesitas invocar algunos de los siguientes métodos dentro de tu código: Log.v() (verboso), Log.d() (depurar), Log.i() (información), Log.w() (advertencia) or Log.e (error) . Por ejemplo, Log.i("MiActividad", "MyClass.getView() - La posición : " + posicion). Posteriormente, ejecuta logcat dentro de DDMS.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Traceview - Es una aplicación gráfica para leer logs.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Eclipse plugin - El "Eclipse Android plugin" incorpora varias de las herramientas para depuración (ADB, DDMS, logcat output y otras funcionalidades).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Debug and Test Device Settings - Android expone varias opciones de configuración que permiten recolectar información sobre "CPU usage" y "frame rate".&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Te recomiendo que también leas la sección "Troubleshooting" para resolver problemas tales como que tu aplicación no es desplegada en el emulador o por qué no se activa.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Opciones del emulador para depurar y hacer pruebas&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Debug and Test Settings on the Device&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El emulador te permite definir varias opciones que te ayudarán a depurar y testear tus aplicaciones. Para ver las opciones de depuración y pruebas del emulador, selecciona desde la barra de navegación "Dev Tools &amp;gt; Development Settings". Esto abrirá la página "Development Settings".&lt;/p&gt;&lt;p&gt;En esta página verás las siguientes opciones (entre otras):&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Debug app : selecciona la aplicación que será depurada. No es necesario que uses está opción para anexar un "debugger", pero al cambiar este valor podrás ver los siguientes efectos: (a) evita que Android lance un error si es que tú haces una pausa o detienes la aplicación en un "breakpoint" por un periodo de tiempo largo cuando estás depurando. (b) te permite seleccionar la opción "Wait for Debugger" para hacer una pausa en la activación de la aplicación hasta que el debugger esté anexado.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Wait for debugger : bloquea la aplicación seleccionada hasta que el debugger sea anexado. Esto te permite fijar un breakpoint en onCreate(), el cual es de utilidad al momento de depurar el proceso de inicialización de una "Activity". Cuando seleccionas esta opción, cualquier instancia de la aplicación seleccionada que esté corriendo será destruida. Esta opción sólo puede ser modificada si has seleccionado previamente una aplicación para ser depurada. Para hacer esta misma operación se puede invocar el método waitForDebugger() directamente en tu código.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Immediately destroy activities : le comunica al sistema que destruya una "Activity" tan pronto como se detenga (como si Android tuviera que reclamar memoria). Esta opción es de mucha utilidad cuando se requiere probar onFreeze(Bundle) / onCreate(android.os.Bundle) , los cuales de otra forma son difíciles de testear. Esta opción te ayudará a revelar algunos problemas producto que el estado de la aplicación no está siendo guardado correctamente.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Show screen updates : muestra por unos instantes un pequeño rectángulo rosado sobre cada área de la pantalla que está siendo pintada. Esta opción es de mucha utilidad para descubrir innecesarios pintados de pantalla.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Show CPU usage : despliega "CPU meters" en el borde superior de la pantallaque muestran cuánto de CPU está siendo utilizado. La barra roja muestra el total de CPU usada y la barra verde muestra el tiempo de CPU utilizado en refrescar la pantalla. Nota: no es posible desactivar esta opción una vez que ha sido seleccionada sin reiniciar el emulador.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Show screen FPS : despliega el actual "frame rate". Esta opción es de utilidad cuando desarrollar juegos y deseas saber cual es el "frame rate" que posee tu juego. Nota: no es posible desactivar esta opción una vez que ha sido seleccionada sin reiniciar el emulador.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Show background : despliegua un patrón de fondo cuando ninguna "activity screens" es visible. Esto generalmente no ocurre, pero puede ocurrir al momento de depurar una aplicación.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Estas opciones son guardadas y cargadas por el emulador cada vez que es detenido y reiniciado.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Consejos de utilidad al depurar una aplicación&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Top Debugging Tips&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;¿Cómo vaciar rápidamente el stack del emulador? : para obtener un vaciado del stack desde el emulador puedes conectarte a través de la "adb shell" y usar "ps" para encontrar el proceso que te interesa y posteriormente ejecutar "kill -3 ", con esto último el "stack trace" aparecerá en el archivo de log.&lt;/p&gt;&lt;p&gt;¿Cómo desplegar información de utilidad en la pantalla del emulador?: El emulador (y el dispositivo) puede desplegar información como "CPU usage", para ello activa o desactiva estas opciones en la página "Development Settings".&lt;/p&gt;&lt;p&gt;¿Cómo obtener información del estado del sistema desde el emulador (dumpstate)? : Es posible obtener la información del "dumpstate" desde el emulador a través del "Dalvik Debug Monitor Service tool".&lt;/p&gt;&lt;p&gt;¿Cómo obtener información del estado de la aplicación desde el emulador (dumpsys)? : Es posible obtener la información del "dumpsys" desde el emulador a través del "Dalvik Debug Monitor Service tool".&lt;/p&gt;&lt;p&gt;¿Cómo obtener información de "wireless connectivity"? : Es posible obtener la información de "wireless connectivity" desde el emulador a través del "Dalvik Debug Monitor Service tool". Desde el menú Device selecciona "Dump radio state".&lt;/p&gt;&lt;p&gt;¿Cómo registro información de rastreo? : Es posible registrar llamados a métodos y cualquier otro tipo de información de rastreo en una "activity" invocando a android.os.Debug.startMethodTracing().&lt;/p&gt;&lt;p&gt;¿Cómo registro "Radio Data"? : Por omisión, información de "radio" no es registrada en el sistema (es un montón de datos). Sin embargo, se puede activar su registro con los siguientes comandos: &lt;pre&gt;&lt;code&gt;adb shell&lt;br /&gt;logcat -b radio&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;&lt;p&gt;¿Cómo ejecuto adb? : Android es distribuido con una herramienta llamada "adb", la cual provee facilidades como: sincronización y movimiento de archivos del emulador, forwarding ports, y ejecución de una "UNIX shell" en el emulador.&lt;/p&gt;&lt;p&gt;¿Cómo capturo el contenido de la pantalla del emulator? : La herramienta "Dalvik Debug Monitor Server (DDMS)" puede ser utilizada para capturar el contenido de la pantalla del emulador.&lt;/p&gt;&lt;p&gt;¿Cuáles son las Helper Classes de Android para depurar? : Android provee las soguientes clases para depurar util.Log y Debug.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Contrucción e instalación de una aplicación Android&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Building and Installing an Android Application&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Android requiere de algunas herramientas especiales para construir los archivos de recursos y otros componentes de la aplicación. Debido a este razón es que es necesario contar con un entorno de desarrollo especializado para tus aplicaciones.&lt;/p&gt;&lt;p&gt;El proceso de compilación de Android comprende la compilación de los archivos XML y otros archivos de recursos a los formatos requeridos por la plataforma. Una vez que se compila una aplicación, el resultado es un archivo con extensión ".apk", el cual es un archivo comprimido conteniendo archivos ".dex", archivos de recursos, archivos de datos y otros archivos. Es posible crear manualmente la estructura de un proyecto Android o a partir de algunos archivos fuentes.&lt;/p&gt;&lt;p&gt;Actualmente, Android no provee soporte para el desarrollo de aplicaciones en código nativo (C/C++).&lt;/p&gt;&lt;p&gt;El proceso recomendado para desarrollar aplicaciones Android es usar Eclipse junto con el "Android plugin", los cuales proveen soporte para construir, ejecutar y depurar las aplicaciones Android.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Eliminación de una aplicación Android &lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Removing an Android Application&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Para remover una aplicación que tú haz instalado en el emulador es necesario ejecutar"adb" y borrar el archivo ".apk" asociado con la aplicación. Usa la "adb shell" para navegar hasta el directorio "data/app/" y utiliza el comando "rm" para borrar el archivo "your_app.apk".&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Consejos para Eclipse&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Eclipse Tips&lt;/b&gt;]&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Ejecución de expresiones Java en Eclipse&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Executing arbitrary Java expressions in Eclipse&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Es posible ejecutar código arbitrario en el momento en que Eclise hace una pausa en un "breakpoint". Por ejemplo, tú puedes llamar a métodos static. Si ingresas android.os.Debug.startMethodTracing() esto hará que se active el dmTrace.&lt;/p&gt;&lt;p&gt;Abre la "code execution window", selecciona Window&amp;gt;Show View&amp;gt;Display desde el menú principal para abrir la "Display window" (un editor de texto). Escribe tu expresión, seleccionar el texto y luego haz clic en el ícono 'J' (o presiona CTRL + SHIFT + D) para ejecutar tu código. El código será ejecutado en el contexto del "thread" seleccioando, el cual debe estar detenido en un "breakpoint" o "single-step point". Si tú suspendes manualmente un "thread", entonces tú tienes un "single-step point", pero esto no funciona si el "thread" está en Object.wait().&lt;/p&gt;&lt;p&gt;Si tú tienes detenida la aplicación en un "breakpoint", tú puedes seleccionar y ejecutar cualquier pieza de código con sólo presionar CTRL + SHIFT + D.&lt;/p&gt;&lt;p&gt;Tú puedes seleccionar un bloque de texto dentro de un contexto presionando ALT +SHIFT + UP ARROW o DOWN ARROW.&lt;/p&gt;&lt;p&gt;Aquí hay unos ejemplos de la respuesta de Eclipse al momento de evaluar expresiones:&lt;/p&gt;&lt;pre&gt;&lt;code&gt;Entrada: zip (java.lang.String)&lt;br /&gt;Resultado: /work/device/out/linux-x86-debug/android/app/android_sdk.zip&lt;br /&gt;&lt;br /&gt;Entrada: zip.endsWith(".zip")&lt;br /&gt;Resultado: (boolean) true&lt;br /&gt;&lt;br /&gt;Entrada: zip.endsWith(".jar")&lt;br /&gt;Resultado: (boolean) false &lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;También es posible ejecutar código aún cuando no se está depurando usando la ventana "scrapbook". Más información en la documentación de Eclipse ("scrapbook").&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Corriendo DDMS manualmente&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Running DDMS Manually&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;A pesar que se recomienda depurar utilizando el "ADT plugin", también es posible hacerlo manualmente ejecutando "DDMS" y configurando Eclipse para depurar conectándose al puerto 8700.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-1674045011801159333?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/1674045011801159333/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=1674045011801159333' title='3 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/1674045011801159333'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/1674045011801159333'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/manos-la-obra.html' title='Manos a la obra - Instalación del SDK'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-1908115348303908924</id><published>2007-11-20T19:11:00.000-08:00</published><updated>2007-12-22T23:57:39.047-08:00</updated><title type='text'>Manos a la obra - Introducción</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/intro/index.html"&gt;Getting Started with Android&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;Manos a la obra&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Getting Started with Android&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Para de comenzar a desarrollar aplicaciones, por favor lee las siguientes secciones y realiza las instrucciones mencionadas.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra.html"&gt;Instalando el SDK&lt;/a&gt; : explica cómo instalar el SDK y el Eclipse plugin. Además, explica cómo utilizar otras herramientas para constuir aplicaciones Android. También se explica cómo ejecutar las aplicaciones de ejemplo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-hola-androide.html"&gt;Hola Androide!&lt;/a&gt; : explica cómo escribir tu primera aplicación Android, el popular Hello World al estilo Android.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-anatoma-de-una-aplicacin.html"&gt;Anatomía de una aplicación Android&lt;/a&gt; : explica la estructura y arquitectura de una aplicación Android. Esta guía te ayudará a comprender el funcionamiento de las piezas que conforman una aplicación Android.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;a href="http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial.html"&gt;Tutorial: Un editor de anotaciones&lt;/a&gt; : aquí encontrarás las instrucciones para construir una aplicación Android de verdad: un editor de anotaciones con el cual podrás crear, editar y borrar tus anotaciones. Esta aplicación cubre muchos de los conceptos básicos a través de ejemplos prácticos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Herramientas de desarrollo : explica qué son y cómo usar las command line tools(*) incluidas con el SDK(*).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Ciclo de vida de una aplicación Android : explica los detalles del ciclo de vida de las aplicaciones y de las Activities(*) corriendo dentro de ellas.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Otros materiales introductorios&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Other Introductory Material&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Después de leer la secciones anteriores, puedes continuar con la siguiente información que es de mucha utilidad:&lt;/p&gt;&lt;h3&gt;&lt;a href="#"&gt;Core Packages&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;[Título original: &lt;b&gt;Core Packages&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Estos son los paquetes básicos del Android SDK y permiten la construcción de cualquier aplicación Android. Estos paquetes están organizados en capas y aquí están ordenados y listados desde el nivel más inferior al superior.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;android.util : contiene varias clases de utilidad de bajo nivel, tales como utilidades XML, etc.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.os : provee los operating system services(*) básicos, message passing(*) e inter-process communication(*)&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.graphics : este es el paquete fundamental para el core rendering(*).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.text , android.text.method, android.text.style y android.text.util : proveen un conjunto de herramientas para procesamiento de texto, soporte para rich text(*), métodos de entrada de datos, etc.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.database : contiene APIs de bajo nivel para trabajar con bases de datos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.content : provee varios servicios para accesar datos en el dispositivo, tales como aplicaciones instaladas en el dispositivo y sus recursos asociados; content providers para persistent dynamic data(*).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.view : este es el core user-interface framework(*).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.widget : provee los elementos estándard para la interface de usuario (listas, botones, layout managers, etc). Este paquete es construido a partir de android.view.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.app : provee el modelo de aplicación más alto y es implementado usando Activities(*).&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h4&gt;&lt;a href="#"&gt;Otros paquetes de interes&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;[Título original: &lt;b&gt;Other Notable Packages&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Los siguientes paquetes proveen caraterísticas particulares de la Android platform(*), lo que significa que son necesariamente de utilidad para la construcción de aplicaciones.&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;android.provider : contiene las definiciones de varios content providers(*) incluidos en la plataforma.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.telephony : provee APIs para la interacción con el phone stack(*) del dispositivo.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;android.webkit : incluye varias APIs para trabajar con contenidos basados en web.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-1908115348303908924?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/1908115348303908924/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=1908115348303908924' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/1908115348303908924'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/1908115348303908924'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/manos-la-obra-introduccin.html' title='Manos a la obra - Introducción'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-3317576084520598201</id><published>2007-11-19T07:46:00.000-08:00</published><updated>2007-12-22T23:17:46.377-08:00</updated><title type='text'>¿Qué es Android?</title><content type='html'>&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/what-is-android.html"&gt;What is Android?&lt;/a&gt;&lt;/p&gt;&lt;h1&gt;&lt;a href="#"&gt;¿Qué es Android?&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;What is Android?&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Android es un &lt;b&gt;&lt;i&gt;software stack&lt;/i&gt;&lt;/b&gt; [falta link] para dispositivos móviles, que incluye un sistema operativo, &lt;b&gt;&lt;i&gt;middleware&lt;/i&gt;&lt;/b&gt; [falta link] y aplicaciones de usuario final. Este lanzamiento preliminar del &lt;a href="http://code.google.com/android/intro/installing.html"&gt;Android SDK&lt;/a&gt; provee las herramientas y las "API"s necesarias para comenzar a desarrollar aplicaciones para la plataforma Android usando el lenguage de programación &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Principales características&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Features&lt;/b&gt;]&lt;/p&gt;&lt;p /&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Provee el &lt;b&gt;&lt;i&gt;Android Application Framework&lt;/i&gt;&lt;/b&gt; [falta link] que facilita la reutilización y reemplazo de componentes.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Incluye la &lt;a href="http://code.google.com/android/reference/glossary.html"&gt;Dalvik&lt;/a&gt;, la cual es una &lt;a href="http://es.wikipedia.org/wiki/M%C3%A1quina_virtual"&gt;Virtual Machine&lt;/a&gt; optimizada para dispositivos móviles.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Disponibilidad de un browser integrado con la plataforma, el cual está basado en &lt;a href="http://webkit.org/"&gt;WebKit&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Capacidades gráficas mejoradas a través de librerías gráficas 2D optimizadas y gráficos 3D basados en la especificación "OpenGL ES 1.0" (la aceleración del hardware es opcional).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Incluye &lt;a href="http://www.sqlite.org/"&gt;SQLite&lt;/a&gt; para el almacenamiento estructurado de datos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Soporte para multi media y sus formatos más comunes: audio, video, and fotografías (MPEG4, H.264, MP3, AAC, AMR, JPG, PNG, GIF).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Soporte para telefonía GSM (dependiente del hardware).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Bluetooth, EDGE, 3G y WiFi (dependiente del hardware).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;"API"s de acceso a recursos de cámaras, GPS, brújula y acelerómetro (dependiente del hardware).&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Un entorno de desarrollo que incluye un emulador de dispositivo, herramientas para depurar, perfilador de memoria y rendimiento, y un "plugin" para Eclipse.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Arquitectura de Android&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Architecture&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;El siguiente diagrama muestra los principales componentes del sistema operativo de Android. Cada una de las secciones es descrita en detalle a continuación del gráfico.&lt;/p&gt;&lt;b&gt;Figura:&lt;/b&gt;&lt;a href="http://code.google.com/android/images/system-architecture.jpg" title="Link hacia la imagen en el sitio de Android's documentation." alt="Link hacia la imagen en el sitio de Android's documentation."&gt;http://code.google.com/android/images/system-architecture.jpg&lt;/a&gt;&lt;h2&gt;&lt;a href="#"&gt;Aplicaciones&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Applications&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Android será distribuido junto a un grupo de aplicaciones que incluyen: cliente de email, programas de SMS, calendario, mapas, browser, contactos y otras interesantes aplicaciones. En adelante, utilizaré el término &lt;b&gt;&lt;i&gt;Core Applications&lt;/i&gt;&lt;/b&gt; [falta link] para referirme a este conjunto de applicaciones. Todas las &lt;b&gt;&lt;i&gt;Core Applications&lt;/i&gt;&lt;/b&gt; [falta link] fueron escritas utilizando el lenguaje de programación &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Estructura de las aplicaciones&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Application Framework&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Los desarrolladores tienen completo acceso a las "API"s que fueron usadas para construir las &lt;b&gt;&lt;i&gt;Core Applications&lt;/i&gt;&lt;/b&gt; [falta link]. La &lt;b&gt;&lt;i&gt;Android Application Architecture&lt;/i&gt;&lt;/b&gt; [falta link] está diseñada para simplificar la reutilización de componentes, esto gracias a que cualquier aplicación puede publicar sus capacidades y entonces otras aplicaciones pueden hacer uso de aquellas capacidades (todo sujeto a restricciones de seguridad impuestas por Android). Este mecanismo permite que cualquier componente pueda ser reemplazado a voluntad del usuario.&lt;/p&gt;&lt;p&gt;Subyacente a todas las aplicaciones existe un conjunto de servicios y sistemas que incluyen:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;Un conjunto rico y extensible de vistas (&lt;a href="http://code.google.com/android/reference/android/view/View.html"&gt;View&lt;/a&gt;) que pueden ser usados para construir una aplicación, incluyendo listas, matrices, casillas para entrada de texto, botones e incluso un browser.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Varios proveedores de contenidos (&lt;a href="http://code.google.com/android/reference/android/content/IContentProvider.html"&gt;Content Provider&lt;/a&gt;) que proveen a las aplicaciones la capacidad para accesar datos desde otras aplicaciones (tales como &lt;a href="http://code.google.com/android/reference/android/provider/Contacts.html"&gt;Contacts&lt;/a&gt;) o compartir sus propios datos.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Un administrador de recurso (&lt;a href="http://code.google.com/android/devel/resources-i18n.html"&gt;Resource Manager&lt;/a&gt;) que provee acceso a recursos tales como información regionalizada, gráficos y archivos de diseño.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Un administrador de notificaciones (&lt;a href="http://code.google.com/android/reference/android/app/NotificationManager.html"&gt;Notification Manager&lt;/a&gt;) que provee a las aplicaciones la capacidad para desplegar, en la barra de estado mensajes de alerta personalizados.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Un administrador de actividades (&lt;a href="http://code.google.com/android/reference/android/app/Activity.html"&gt;Activity Manager&lt;/a&gt;) que administra el ciclo de vida de las aplicaciones y proveen un mecanismo de navegación entre las aplicaciones (&lt;b&gt;&lt;i&gt;Navigation Backstack&lt;/i&gt;&lt;/b&gt; [falta link]).&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;p&gt;Para más detalles y un vistazo rápido a una aplicación, ver &lt;a href="http://celutron.blogspot.com/2007/12/manos-la-obra-tutorial.html"&gt;Desarrollo de un sencillo editor de texto&lt;/a&gt;.&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Librerías&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Libraries&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Android incluye un conjunto de librerías escritas en C/C++, las cuales son usadas por varios componentes del sistema Android. Estas capacidades son expuestas a los desarrolladores a través del &lt;b&gt;&lt;i&gt;Android Application Framework&lt;/i&gt;&lt;/b&gt; [falta link]. Las principales librerías son descritas a continuación:&lt;/p&gt;&lt;lu&gt;&lt;li&gt;&lt;p&gt;System C library: es una implementación "BSD-derived" de la "standard C system library (libc)", que ha sido mejorada para ser incrustada en dispositivos basados en Linux.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Media Libraries: estas librerías permiten la reproducción y grabación de/en los formatos de audio, video y fotografía más populares. Incluye: MPEG4, H.264, MP3, AAC, AMR, JPG, and PNG. Estas librerías están basadas en "PacketVideo's OpenCORE".&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;Surface Manager: administra el acceso los subsistemas de pantalla y utilización de gráficos 2D y 3D desde múltiples aplicaciones.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;LibWebCore: es un "web browser" que potencia tanto el "Android Browser" como las &lt;a href="http://code.google.com/android/reference/android/webkit/WebView.html"&gt;Web View&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SGL: el motor gráfico 2D subyacente al sistema.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;3D libraries: es una implementación basada en las "OpenGL ES 1.0 API"s. Estas librerías pueden usar tanto el hardware 3D de aceleración (si está disponible) o el "3D rasterizer" que es incluido en Android.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;FreeType: es el "font rasterizer" para mapas de bits y vectores.&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;SQLite: es un poderoso y liviano motor de bases de datos relacionales que está disponible para todas las aplicaciones.&lt;/p&gt;&lt;/li&gt;&lt;/lu&gt;&lt;h2&gt;&lt;a href="#"&gt;Entorno de ejecución de Android&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Android Runtime&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Android incluye un conjunto de librerías que proveen muchas de las funcionalidades disponible en las librerías del lenguaje de programación &lt;a href="http://java.sun.com/"&gt;Java&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Cada aplicación Android es ejecutada dentro de su propio proceso, dentro de su propia instancia de una &lt;a href="http://en.wikipedia.org/wiki/Dalvik_virtual_machine"&gt;Dalvik Virtual Machine&lt;/a&gt;. &lt;a href="http://code.google.com/android/reference/glossary.html"&gt;Dalvik&lt;/a&gt; ha sido diseñada de tal forma que el dispositivo puede correr múltiples &lt;a href="http://es.wikipedia.org/wiki/M%C3%A1quina_virtual"&gt;Virtual Machine&lt;/a&gt;s de manera eficiente. La &lt;a href="http://en.wikipedia.org/wiki/Dalvik_virtual_machine"&gt;Dalvik Virtual Machine&lt;/a&gt; ejecuta archivos en formato &lt;a href="http://code.google.com/android/reference/glossary.html"&gt;Dalvik Executable (.dex)&lt;/a&gt;, los cuales han sido optimizados para optener el menor "memory footprint". La &lt;a href="http://es.wikipedia.org/wiki/M%C3%A1quina_virtual"&gt;Virtual Machine&lt;/a&gt; es "register-based" y ejecuta archivos de clases compilados en un compilador Java que ha sido modificado para crear archivos en formato &lt;a href="http://code.google.com/android/reference/glossary.html"&gt;.dex&lt;/a&gt; con ayuda de la herramienta &lt;a href="http://code.google.com/android/reference/othertools.html#dx"&gt;dx&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;La &lt;a href="http://en.wikipedia.org/wiki/Dalvik_virtual_machine"&gt;Dalvik Virtual Machine&lt;/a&gt; depende del &lt;a href="http://es.wikipedia.org/wiki/Linux_%28n%C3%BAcleo%29"&gt;Linux Kernel&lt;/a&gt; para todas las subyacentes funcionalidades, tales como "threading" and "low-level memory management".&lt;/p&gt;&lt;h2&gt;&lt;a href="#"&gt;Kernel de Linux&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;[Título original: &lt;b&gt;Linux Kernel&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Android depende de Linux version 2.6 para los "core system services" tales como securidad, administración de memoria, administración de procesos, "network stack", y "driver model". El &lt;a href="http://es.wikipedia.org/wiki/Linux_%28n%C3%BAcleo%29"&gt;Linux Kernel&lt;/a&gt; también actúa como una capa de abstación entre el hardware y el resto del &lt;b&gt;&lt;i&gt;software stack&lt;/i&gt;&lt;/b&gt; [falta link].&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-3317576084520598201?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/3317576084520598201/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=3317576084520598201' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/3317576084520598201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/3317576084520598201'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/qu-es-android.html' title='¿Qué es Android?'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-7439399563452980150</id><published>2007-11-16T15:49:00.000-08:00</published><updated>2007-12-22T23:01:25.818-08:00</updated><title type='text'>Bienvenido a Android</title><content type='html'>&lt;h1&gt;&lt;a href="#"&gt;Bienvenido a Android!&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;[Título original: &lt;b&gt;Welcome to Android!&lt;/b&gt;]&lt;/p&gt;&lt;p&gt;Documento original: &lt;a href="http://code.google.com/android/documentation.html"&gt;Welcome to Android!&lt;/a&gt;&lt;/p&gt;&lt;p&gt;La plataforma &lt;a href="http://code.google.com/android/index.html"&gt;Android&lt;/a&gt; es un &lt;b&gt;&lt;i&gt;software stack&lt;/i&gt;&lt;/b&gt; [falta link] para dispositivos móviles que incluye un sistema operativo, &lt;b&gt;&lt;i&gt;middleware&lt;/i&gt;&lt;/b&gt; [falta link] y algunas aplicaciones para el usuario del dispositivo. Los desarrolladores pueden crear aplicaciones para esta plataforma usando el "&lt;a href="http://code.google.com/android/intro/installing.html"&gt;Android SDK&lt;/a&gt;". Las aplicaciones son escritas utilizando el lenguaje de programación Java y posteriormente compiladas para ser ejecutadas en &lt;a href="http://code.google.com/android/reference/glossary.html"&gt;Dalvik&lt;/a&gt;, que es una &lt;b&gt;&lt;i&gt;Virtual Machine&lt;/i&gt;&lt;/b&gt; [falta link] diseñada para correr sobre un &lt;b&gt;&lt;i&gt;Linux kernel&lt;/i&gt;&lt;/b&gt; [falta link].&lt;/p&gt;&lt;p&gt;Si tú quieres aprender cómo desarrollar aplicaciones para Android, tú estás en el lugar correcto. Este sitio web provee una variedad de documentación que te ayudará en el aprendizaje de Android y el desarrollo de aplicaciones móviles para la plataforma.&lt;/p&gt;&lt;p&gt;El "&lt;a href="http://code.google.com/android/intro/installing.html"&gt;Android SDK&lt;/a&gt;" está disponible en estos momentos en un estado de "early look". Esta versión incluye proyectos de ejemplo con código fuente, herramientas de desarrollo, un emulador y por supuesto todas las librerías que tú vas a necesitar para construir una aplicación Android.&lt;/p&gt;&lt;p&gt;Desde la siguiente página &lt;a href="http://code.google.com/android/download.html"&gt;Descarga de Android SDK&lt;/a&gt; puedes descargar el "&lt;a href="http://code.google.com/android/intro/installing.html"&gt;Android SDK&lt;/a&gt;"&lt;/p&gt;&lt;p&gt;Para aprender sobre la plataforma Android, Google recomienda leer la "&lt;a href="http://code.google.com/android/documentation.html"&gt;Documentación de Androide&lt;/a&gt;" en el siguiente orden.&lt;/p&gt;&lt;a href="http://celutron.blogspot.com/2007/11/qu-es-android.html"&gt;¿Qué es Android?&lt;/a&gt;&lt;p&gt;Un vistazo a la plataforma Android.&lt;/p&gt;&lt;a href="http://celutron.blogspot.com/2007/11/manos-la-obra-introduccin.html"&gt;Manos a la obra&lt;/a&gt;&lt;p&gt;Todo lo necesario para desarrollar tu primera aplicación: Hello World&lt;/p&gt;&lt;a href="http://celutron.blogspot.com/2007/12/desarrollando-aplicaciones-introduccin.html"&gt;Desarrollando aplicaciones Android&lt;/a&gt;&lt;p&gt;Los fundamentos de las aplicaciones Android.&lt;/p&gt;&lt;b&gt;&lt;i&gt;Caja de herramientas&lt;/i&gt;&lt;/b&gt; [falta link]&lt;p&gt;Información más exhaustiva sobre diferentes tópicos.&lt;/p&gt;&lt;b&gt;&lt;i&gt;Información de referencia.&lt;/i&gt;&lt;/b&gt; [falta link]&lt;p&gt;Todo el material de referencia de Android.&lt;/p&gt;&lt;b&gt;&lt;i&gt;Ejemplos de código.&lt;/i&gt;&lt;/b&gt; [falta link]&lt;p&gt;Código fuente de varios projectos Android.&lt;/p&gt;&lt;b&gt;&lt;i&gt;Respuesta a las preguntas más frecuentes.&lt;/i&gt;&lt;/b&gt; [falta link]&lt;p&gt;Problemas y sus soluciones.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-7439399563452980150?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/7439399563452980150/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=7439399563452980150' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7439399563452980150'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/7439399563452980150'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/introduccin-la-android-platform-es-un.html' title='Bienvenido a Android'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-5151276853310782549</id><published>2007-11-16T15:04:00.000-08:00</published><updated>2007-12-23T12:35:07.344-08:00</updated><title type='text'>Lanzamiento de Android</title><content type='html'>El 5 de noviembre, la &lt;span style="font-weight: bold;"&gt;Open Handset Alliance&lt;/span&gt; anunció el lanzamiento de Android (Androide); el cual es una plataforma completa de software para dispositivos móviles. Esta nueva plataforma incluye: un sistema operativo basado en unix, middleware y aplicaciones para el usuario final.&lt;br /&gt;&lt;br /&gt;Desde el inicio Androide fue diseñado con la idea de proporcionar completo acceso a todas las capacidades de cualquier dispositivos móvil, para que asi los desarrolladores tengan la capacidad de crear aplicaciones sofisticadas.&lt;br /&gt;&lt;br /&gt;La creación de aplicaciones para esta nueva plataforma se hace utilizando Android SDK, el cual está disponible desde el 12 de noviembre.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-5151276853310782549?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/5151276853310782549/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=5151276853310782549' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5151276853310782549'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/5151276853310782549'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/el-5-de-noviembre-la-open-handset.html' title='Lanzamiento de Android'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-1474169332135897503</id><published>2007-11-05T11:41:00.000-08:00</published><updated>2007-11-20T14:16:46.304-08:00</updated><title type='text'>Términos técnicos</title><content type='html'>La siguiente lista corresponde a los términos técnicos que he decidido no traducir para permitir que posteriormente los utilices para realizar búsquedas en Google.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;SDK tools directory&lt;/span&gt; : directorio de herramientas Android SDK.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;SDK directory&lt;/span&gt; : directorio raíz del Android SDK.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Android Debug Bridge&lt;/span&gt; (adb) :&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Android platform&lt;/span&gt; : plataforma Androide.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Activities &lt;/span&gt;:&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;core user-interface framework&lt;/span&gt; :&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;persistent dynamic data&lt;/span&gt; :&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;rich text&lt;/span&gt; :&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;core rendering&lt;/span&gt; :&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;inter-process communication&lt;/span&gt; :&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;operating system services&lt;/span&gt; :&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;command line tools&lt;/span&gt; :&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;software stack&lt;/span&gt; : es una referencia genérica a un conjunto de programas que en su conjunto constituyen un sistema completo.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;operating system&lt;/span&gt; : sistema operativo&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;middleware&lt;/span&gt; : software que realiza las funciones de conversión o transformación de un sistema a otro.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;SDK &lt;/span&gt;: (Software Development Kit) conjunto de herramientas de desarrollo de software.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Android SDK&lt;/span&gt; : conjunto de herramientas de software para desarrollar aplicaciones Android.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Java &lt;/span&gt;: lenguaje de programación creado por James Gosling.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Dalvik &lt;/span&gt;: Java virtual machine para aplicaciones Android.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;virtual machine&lt;/span&gt; : máquina virtual.&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Linux kernel&lt;/span&gt; : núcleo de Linux&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-1474169332135897503?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/1474169332135897503/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=1474169332135897503' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/1474169332135897503'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/1474169332135897503'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/05/trminos-tcnicos.html' title='Términos técnicos'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1116377334484481265.post-2852876619532585090</id><published>2007-11-01T11:43:00.000-07:00</published><updated>2007-12-25T16:55:04.844-08:00</updated><title type='text'>Referencias</title><content type='html'>A continuación se encuentran las referencias que he encontrado en Internet relacionadas con Android:&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;Android - An Open Handset Alliance Project&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/code.google.com/android"&gt;http://www.blogger.com/code.google.com/android&lt;/a&gt;&lt;br /&gt;Este es el sitio oficial de Android para desarrolladores.&lt;span style="FONT-WEIGHT: bold"&gt; &lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;Android Development Community&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.anddev.org/"&gt;http://www.anddev.org/&lt;/a&gt;&lt;br /&gt;Este es un sitio con tutoriales y además puedes encontrar soluciones a problemas.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.anddev.org/the_friend_finder_-_mapactivity_using_gps_-_part_i_-_ii-t93.html"&gt;The Friend Finder - MapActivity using GPS&lt;/a&gt; : Este es un buen ejemplo de cómo recuperar las coordenadas del celular y utilizarlas para crear un mapa interactivo.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;span style="FONT-WEIGHT: bold"&gt;DEVPHONE BLOG&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.blogger.com/devphone.com"&gt;http://www.blogger.com/devphone.com&lt;/a&gt;&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;&lt;/span&gt;Este es un blog que es actualizado con frecuencia con las últimas noticias relacionadas con Google Android y tecnologías relacionadas.&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold"&gt;The significance of Google’s Android&lt;/span&gt;&lt;br /&gt;&lt;a href="http://visionmobile.com/blog/2007/11/the-significance-of-googles-android/"&gt;http://visionmobile.com/blog/2007/11/the-significance-of-googles-android/&lt;/a&gt;&lt;br /&gt;Esta nota de blog hace un buen análisis sobre la estrategia comercial de Google con Android.&lt;span style="FONT-WEIGHT: bold"&gt;&lt;br /&gt;&lt;br /&gt;DroidDraw Tutorial&lt;/span&gt;&lt;br /&gt;&lt;a href="http://www.droiddraw.org/tutorial.html"&gt;http://www.droiddraw.org/tutorial.html&lt;/a&gt;&lt;br /&gt;Este página provee de un applet que ayuda a diseñar las pantallas de una aplicación Android.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Google Maps with My Location (beta)&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://www.google.com/gmm/mylocation.html?hl=en"&gt;http://www.google.com/gmm/mylocation.html?hl=en&lt;/a&gt;&lt;br /&gt;Este artículo describe la aplicación "My Location"&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Show me the code!&lt;/strong&gt;&lt;br /&gt;&lt;a href="http://davanum.wordpress.com/"&gt;http://davanum.wordpress.com/&lt;/a&gt;&lt;br /&gt;Este blog publica algunos ejemplo de interesantes.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1116377334484481265-2852876619532585090?l=celutron.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://celutron.blogspot.com/feeds/2852876619532585090/comments/default' title='Comentarios de la entrada'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=1116377334484481265&amp;postID=2852876619532585090' title='0 Comentarios'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/2852876619532585090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1116377334484481265/posts/default/2852876619532585090'/><link rel='alternate' type='text/html' href='http://celutron.blogspot.com/2007/11/referencias.html' title='Referencias'/><author><name>Go Diego Go</name><uri>http://www.blogger.com/profile/14037444930628526407</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://3.bp.blogspot.com/__WZr8mbWg3o/S4bxksHwS7I/AAAAAAAAAHo/uLW7saXj5qo/S220/mini-thor-01.jpg'/></author><thr:total>0</thr:total></entry></feed>
