<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Bitácora de Javier Cancela</title>
	<atom:link href="http://javiercancela.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://javiercancela.com</link>
	<description>Bitácora móvil: programación de dispositivos móviles</description>
	<pubDate>Fri, 06 Jun 2008 18:25:44 +0000</pubDate>
	<generator>http://wordpress.org/?v=MU</generator>
	<language>es</language>
			<item>
		<title>Artículo de Andrés en Loogic</title>
		<link>http://javiercancela.com/2008/06/06/articulo-de-andres-en-loogic/</link>
		<comments>http://javiercancela.com/2008/06/06/articulo-de-andres-en-loogic/#comments</comments>
		<pubDate>Fri, 06 Jun 2008 18:25:44 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[ipoki]]></category>

		<category><![CDATA[andrés]]></category>

		<category><![CDATA[loogic]]></category>

		<category><![CDATA[geoweb]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=243</guid>
		<description><![CDATA[Andrés ha escrito el Loogic un artículo sobre redes sociales y geolocalización: &#8220;Redes sociales y Geoweb&#8220;.
Un extracto:
En un futuro estaremos siempre conectados a Internet, en casa, en el trabajo y andando por la calle, y los servicios de Internet que utilizamos nos mandaran la información que necesitemos según el sitio en el que estemos. O [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a title="The Ipoki kitchen" href="http://blogs.ipoki.com/andres/">Andrés</a> ha escrito el Loogic un artículo sobre redes sociales y geolocalización: &#8220;<a href="http://loogic.com/redes-sociales-y-geoweb/">Redes sociales y Geoweb</a>&#8220;.</p>
<p>Un extracto:</p>
<blockquote><p>En un futuro estaremos siempre conectados a Internet, en casa, en el trabajo y andando por la calle, y los servicios de Internet que utilizamos nos mandaran la información que necesitemos según el sitio en el que estemos. O nos pondrán en contacto con la gente a la que podemos ver en ese lugar. A medida que los servicios sean mas <strong>inteligentes</strong> reaccionaran mejor a nuestras necesidades, y para eso es muy importante que sepan donde estamos. Esto también va a cambiar los usos sociales y va a crear nuevos. Se van a crear cada vez más puntos de contacto entre el mundo real y el ciberespacio.</p></blockquote>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/243/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/243/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/243/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/243/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/243/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=243&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/06/06/articulo-de-andres-en-loogic/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>
	</item>
		<item>
		<title>Programando en Android - NotePad (II)</title>
		<link>http://javiercancela.com/2008/06/02/programando-en-android-notepad-ii/</link>
		<comments>http://javiercancela.com/2008/06/02/programando-en-android-notepad-ii/#comments</comments>
		<pubDate>Mon, 02 Jun 2008 07:00:41 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[Android]]></category>

		<category><![CDATA[android notepad]]></category>

		<category><![CDATA[desarrollo móvil]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=238</guid>
		<description><![CDATA[La clase NotesList
La actividad principal de la aplicación NotePad es NotesList, como se puede ver en el manifest. La clase NotesList se define en el archivo NotesList.java, y es la responsable de la pantalla principal de la aplicación, mostrando una lista de las notas disponibles. Para ello hacemos que esta clase herede de ListActivity, un [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong>La clase NotesList</strong><br />
La actividad principal de la aplicación NotePad es NotesList, como se puede ver en el <em>manifest</em>. La clase NotesList se define en el archivo <a href="http://code.google.com/android/samples/NotePad/src/com/google/android/notepad/NotesList.html">NotesList.java</a>, y es la responsable de la pantalla principal de la aplicación, mostrando una lista de las notas disponibles. Para ello hacemos que esta clase herede de <a href="http://code.google.com/android/reference/android/app/ListActivity.html">ListActivity</a>, un tipo de actividad especial diseñada para enlazarse a un cursor y mostrar los elementos del cursor en una lista.</p>
<p>Al iniciar la aplicación se invoca esta clase a través de su método onCreate:</p>
<div>
<div style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;padding:0;">
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> @Override</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   2:</span> <span style="color:#0000ff;">protected</span> <span style="color:#0000ff;">void</span> onCreate(Bundle icicle) {</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   3:</span>     super.onCreate(icicle);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   4:</span></pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   5:</span>     setDefaultKeyMode(SHORTCUT_DEFAULT_KEYS);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   6:</span></pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   7:</span>     Intent intent = getIntent();</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   8:</span>     <span style="color:#0000ff;">if</span> (intent.getData() == <span style="color:#0000ff;">null</span>)</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   9:</span>         intent.setData(NotePad.Notes.CONTENT_URI);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  10:</span></pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  11:</span>     setupListStripes();</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  12:</span></pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  13:</span>     Uri uri = intent.getData();</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  14:</span>     mCursor = managedQuery(uri, PROJECTION, <span style="color:#0000ff;">null</span>, <span style="color:#0000ff;">null</span>);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  15:</span></pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  16:</span>     ListAdapter adapter = <span style="color:#0000ff;">new</span> SimpleCursorAdapter(<span style="color:#0000ff;">this</span>,</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  17:</span>             R.layout.noteslist_item, mCursor,</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  18:</span>             <span style="color:#0000ff;">new</span> String[] {NotePad.Notes.TITLE},</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  19:</span>             <span style="color:#0000ff;">new</span> <span style="color:#0000ff;">int</span>[] {android.R.id.text1});</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  20:</span>     setListAdapter(adapter);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  21:</span> }</pre>
</div>
</div>
<p>En la línea 5 simplemente habilitamos los atajos de teclado. Las líneas 7-9 establecen el esquema de datos sobre el que vamos a operar, que se define en la clase NotePad. Lo veremos más adelante.</p>
<p>Las líneas 13 y 14 acceden a los datos. Las referencias a los orígenes de datos son objetos de tipo <a href="http://code.google.com/android/reference/android/net/Uri.html">Uri</a>, y en nuestro caso tienen esta forma:</p>
<div>
<div style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;padding:0;">
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">static</span> final Uri CONTENT_URI =</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   2:</span>     Uri.parse(<span style="color:#006080;">"content://com.google.provider.NotePad/notes"</span>);</pre>
</div>
</div>
<p>El enlace entre este Uri y la base de datos se realiza en la clase NotePadProvider, que veremos en otra entrada. Basta decir por ahora que la línea 14 accede a la base de datos para abrir un cursor con las columnas especificadas por PROJECTION, que se define al comienzo de la clase NotesList:</p>
<div>
<div style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;padding:0;">
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">static</span> final String[] PROJECTION = <span style="color:#0000ff;">new</span> String[] {</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   2:</span>     NotePad.Notes._ID, NotePad.Notes.TITLE };</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   3:</span> <span style="color:#0000ff;">private</span> Cursor mCursor;</pre>
</div>
</div>
<p>Como decíamos al principio, la actividad NotesList hereda de ListActivity, lo que le permite mostrar datos en una lista. Para ello creamos un adaptador <a href="http://code.google.com/android/reference/android/widget/ListAdapter.html">ListAdapter</a>, como se muestra en las líneas 16-19. La clase <a href="http://code.google.com/android/reference/android/widget/SimpleCursorAdapter.html">SimpleCursorAdaptor</a> es un creador genérico de adaptadores, al que indicamos el <em>layout</em> que vamos a usar (en nuestro caso <a href="http://code.google.com/android/samples/NotePad/res/layout/noteslist_item.html">R.layout.noteslist_item</a>), el cursor que hemos definido, los nombres de las columnas a mostrar (en este caso sólo el título), y los <em>ids</em> de los controles (tienen que ser del tipo TextView) que van a mostrar cada columna. ´</p>
<p>Finalmente el método setListAdapter asigna el ListAdapter a nuestra actividad para mostrar los datos.</p>
<p>Nos queda por ver el método setupListStripes:</p>
<div>
<div style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;padding:0;">
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   1:</span> <span style="color:#0000ff;">private</span> <span style="color:#0000ff;">void</span> setupListStripes() {</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   2:</span>     Drawable[] lineBackgrounds = <span style="color:#0000ff;">new</span> Drawable[2];</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   3:</span></pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   4:</span>     lineBackgrounds[0] =</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   5:</span>         getResources().getDrawable(R.drawable.even_stripe);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   6:</span>     lineBackgrounds[1] =</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   7:</span>         getResources().getDrawable(R.drawable.odd_stripe);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   8:</span></pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">   9:</span>     View view = getViewInflate().inflate(</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  10:</span>             android.R.layout.simple_list_item_1, <span style="color:#0000ff;">null</span>, <span style="color:#0000ff;">null</span>);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  11:</span>     TextView v = (TextView)view.findViewById(android.R.id.text1);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  12:</span>     v.setText(<span style="color:#006080;">"X"</span>);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  13:</span>     v.measure(</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  14:</span>         View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.EXACTLY, 100),</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  15:</span>         View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, 0)</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  16:</span>         );</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  17:</span>     <span style="color:#0000ff;">int</span> height = v.getMeasuredHeight();</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:#f4f4f4;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  18:</span>     getListView().setStripes(lineBackgrounds, height);</pre>
<pre style="font-size:8pt;overflow:visible;width:100%;color:black;line-height:12pt;font-family:consolas, 'Courier New', courier, monospace;background-color:white;border-style:none;margin:0;padding:0;"><span style="color:#606060;">  19:</span> }</pre>
</div>
</div>
<div>Este método es el encargado de dibujar líneas de colores distintos para el fondo de la ventana. Para ello definimos dos objetos <a href="http://code.google.com/android/reference/android/graphics/drawable/Drawable.html">Drawable</a>, que no es más que una clase genérica para objetos dibujables, y a cada uno le asignamos un color (los colores se definen en el archivo <a href="http://code.google.com/android/reference/android/graphics/drawable/Drawable.html">colors.xml</a>).</div>
<div>Las líneas 10 y 11 instancian una vista estándar para mostrar elementos de una lista, y la 12 obtiene el objeto TextView correspondiente al control que previamente hemos visto que mostrará la columna título de las notas.</div>
<div>Las líneas 12-16 hacen lo siguiente: escriben una &#8216;X&#8217; en el control, luego le piden al control que decida las medidas necesarias para mostrar la información, definiendo un ancho máximo y dejando libertad al alto, para que ocupe lo que necesite. Luego obtenemos ese alto, que será el necesario para que el control muestre letras mayúsculas.</div>
<div>La línea 18 llama al método setStripes de la vista asociada a nuestra actividad, que se encarga de establecer un fondo con líneas alternas de los colores definidos al principio y la altura obtenida.</div>
<div>En la próxima entrada hablaremos del menú y de como interactuar con las notas mostradas.</div>
<p><strong>Entradas anteriores:</strong></p>
<p><a href="http://javiercancela.com/2008/05/26/programando-en-android-notepad-i/">Programando en Android - NotePad (I)</a><br />
<a href="http://javiercancela.com/2008/05/19/programando-en-android-conceptos-iniciales-ii/">Programando en Android - Conceptos iniciales (II)</a><br />
<a href="http://javiercancela.com/2008/05/12/programando-en-android-conceptos-iniciales-i/">Programando en Android - Conceptos iniciales (I)</a><br />
<a href="http://javiercancela.com/2008/05/06/programando-en-android-prologo/">Programando en Android - Prólogo</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/238/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/238/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/238/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/238/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/238/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=238&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/06/02/programando-en-android-notepad-ii/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>
	</item>
		<item>
		<title>Opiniones firmes</title>
		<link>http://javiercancela.com/2008/05/31/opiniones-firmes/</link>
		<comments>http://javiercancela.com/2008/05/31/opiniones-firmes/#comments</comments>
		<pubDate>Sat, 31 May 2008 21:30:30 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[Varios]]></category>

		<category><![CDATA[jeff atwood]]></category>

		<category><![CDATA[opiniones firmes]]></category>

		<category><![CDATA[ricardo galli]]></category>

		<category><![CDATA[velocidad de escape]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=239</guid>
		<description><![CDATA[Me encuentro ocasionalmente con ideas reveladoras. Las leo y noto como si un grupo de neuronas aletargadas se activasen de repente, haciéndome pensar en algo en lo que no había pensado antes.
La última la he leído en el artículo de Jeff Atwood &#8220;Strong Opinions, Weakly Held&#8220;, algo así como &#8220;Opiniones firmes, mantenidas débilmente&#8221;. El artículo [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Me encuentro ocasionalmente con ideas reveladoras. Las leo y noto como si un grupo de neuronas aletargadas se activasen de repente, haciéndome pensar en algo en lo que no había pensado antes.</p>
<p>La última la he leído en el artículo de Jeff Atwood &#8220;<a href="http://www.codinghorror.com/blog/archives/001124.html">Strong Opinions, Weakly Held</a>&#8220;, algo así como &#8220;Opiniones firmes, mantenidas débilmente&#8221;. El artículo es una defensa frente a otro artículo, &#8220;<a href="http://girtby.net/archives/2008/5/22/blogging-horror">Blogging Horror</a>&#8220;, que acusa a Jeff Atwood de haber perdido credibilidad emitiendo opiniones desinformadas sobre diversos temas relacionados con la programación. Esta discusión tiene una ramificación española, a través de una entrada en <a href="http://jomaweb.blogalia.com/historias/57688">VELOCIDAD DE ESCAPE</a>, que apareció en la portada de <a href="http://meneame.net/story/php-apesta-pero-no-importa-segun-jeff-atwood/">menéame</a> y fue contestada por <a href="http://gallir.wordpress.com/2008/05/31/la-diferencia-entre-opinionated-e-ignorantes-de-su-ignorancia/">Ricardo Galli</a>, entre otros.</p>
<p>El título del artículo de Atwood se refiere a una idea expresada en otro <a href="http://bobsutton.typepad.com/my_weblog/2006/07/strong_opinions.html">artículo del mismo nombre</a>, cuya idea central se resume en este párrafo:</p>
<blockquote><p>A couple years ago, I was talking the Institute&#8217;s Bob Johansen about wisdom, and he explained that &#8212; to deal with an uncertain future and still move forward – they advise people to have &#8220;strong opinions, which are weakly held.&#8221; They&#8217;ve been giving this advice for years, and I understand that it was first developed by Institute Director Paul Saffo. Bob explained that weak opinions are problematic because people aren&#8217;t inspired to develop the best arguments possible for them, or to put forth the energy required to test them. Bob explained that it was just as important, however, to not be too attached to what you believe because, otherwise, it undermines your ability to &#8220;see&#8221; and &#8220;hear&#8221; evidence that clashes with your opinions. This is what psychologists sometimes call the problem of &#8220;confirmation bias.&#8221;</p></blockquote>
<p>que traducido por mí dice:</p>
<blockquote><p><span style="color:#444444;">Hace un par de años, le estaba hablando a Bob Johansen [del Instituto de para el Futuro de Palo Alto] sobre la sabiduría, y él me explicó que - para tratar con la incertidumbre del futuro y aún así seguir avanzando - recomendaban a la gente que tuviese &#8220;opiniones firmes, que se mantuviesen de forma débil.&#8221; Llevaban dando este consejo durante años, y por lo que entiendo había sido inicialmente desarrollado por el director del Instituto Paul Saffo. Bob me explicó que las opiniones débiles eran problemáticas porque no inspiran a la gente a desarrollar las mejores ideas posibles para ellas. Bob me explicó que era igualmente importante, sin embargo, no sentirse demasiado ligado a tus ideas porque, de otra forma, socava tu habilidad para &#8220;ver&#8221; y &#8220;oír&#8221; las evidencias que choquen con tus opiniones. Es lo que los psicólogos llaman a veces el problema del &#8220;<a href="http://es.wikipedia.org/wiki/Sesgo_de_confirmaci%C3%B3n">sesgo de confirmación</a>.&#8221;</span></p></blockquote>
<p>Cuando expreso una opinión en un ambiente formal (en el trabajo, en una discusión seria&#8230;), siempre intento hacerlo dejando claro que esa opinión se aplica a un ámbito concreto, que es posible que sea errónea en casos que no he contemplado y que por lo tanto admite matices y condicionantes, y que se basa en el conocimiento necesariamente limitado que tengo sobre el asunto en cuestión. Nunca se me había ocurrido que esa forma de actuar puede estar, a veces, equivocada.</p>
<p>No sé si cambiaré mi forma de opinar, pero me lo pensaré dos veces antes de llamar dogmático a quien exprese sus ideas con demasiada firmeza.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/239/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/239/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/239/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/239/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/239/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/239/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/239/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/239/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/239/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/239/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/239/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/239/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=239&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/05/31/opiniones-firmes/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>
	</item>
		<item>
		<title>Estadísticas curiosas: fisgando móviles con BlueTooth</title>
		<link>http://javiercancela.com/2008/05/26/estadisticas-curiosas-fisgando-moviles-con-bluetooth/</link>
		<comments>http://javiercancela.com/2008/05/26/estadisticas-curiosas-fisgando-moviles-con-bluetooth/#comments</comments>
		<pubDate>Mon, 26 May 2008 18:37:09 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[Varios]]></category>

		<category><![CDATA[Bluetooth]]></category>

		<category><![CDATA[Nokia]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=232</guid>
		<description><![CDATA[Aún no me he mirado el documento (que es un zip de 58 megas), pero por lo que veo en Mi N70 y yo  contiene datos de dispositivos móviles recogidos por BlueTooth. Por ejemplo, esta gráfica que colgó el propio fernand0 en su cuenta de Picassa (y que me ha servido para darme cuenta [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Aún no me he mirado <a title="http://conference.hitb.org/hitbsecconf2008dubai/materials/D2T1%20-%20Dino%20Covotsos%20-%20Hacking%20the%20Bluetooth%20Stack%20for%20Fun%20Fame%20and%20Mayhem.zip" href="http://conference.hitb.org/hitbsecconf2008dubai/materials/D2T1%20-%20Dino%20Covotsos%20-%20Hacking%20the%20Bluetooth%20Stack%20for%20Fun%20Fame%20and%20Mayhem.zip">el documento</a> (que es un zip de 58 megas), pero por lo que veo en <a title="Mi N70 y yo" href="Mi N70 y yo">Mi N70 y yo </a> contiene datos de dispositivos móviles recogidos por BlueTooth. Por ejemplo, esta gráfica que colgó el propio fernand0 en su cuenta de Picassa (y que me ha servido para darme cuenta de que el autor de <a title="Mi N70 y yo" href="Mi N70 y yo">Mi N70 y yo</a> es el mismo de <a title="Reflexiones e irreflexiones" href="http://fernand0.blogalia.com/">Reflexiones e irreflexiones</a>, otro blog al que estoy subscrito), mostrando el número de dispositivos Nokia detectados por modelo:</p>
<p><img src="http://lh6.ggpht.com/ftricas/SDreYdZ-aNI/AAAAAAAAANg/gUpUc5f6l2g/nokiaPopularidad.png?imgmax=720" alt="" /></p>
<p>Lógicamente, como toda muestra estadística, esta gráfica está condicionada por la forma en la que se recogieron los datos, así que la principal conclusión que podemos sacar (sin haber leído el documento) es que los usuarios del 6021 se dejan con mucha frecuencia el BlueTooth activado.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/232/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/232/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/232/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/232/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/232/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=232&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/05/26/estadisticas-curiosas-fisgando-moviles-con-bluetooth/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>

		<media:content url="http://lh6.ggpht.com/ftricas/SDreYdZ-aNI/AAAAAAAAANg/gUpUc5f6l2g/nokiaPopularidad.png?imgmax=720" medium="image" />
	</item>
		<item>
		<title>Programando en Android - NotePad (I)</title>
		<link>http://javiercancela.com/2008/05/26/programando-en-android-notepad-i/</link>
		<comments>http://javiercancela.com/2008/05/26/programando-en-android-notepad-i/#comments</comments>
		<pubDate>Mon, 26 May 2008 07:00:41 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[Android]]></category>

		<category><![CDATA[android notepad]]></category>

		<category><![CDATA[AndroidManifest]]></category>

		<category><![CDATA[intent-filter]]></category>

		<guid isPermaLink="false">http://javiercancela.com/?p=231</guid>
		<description><![CDATA[La mayoría de los mortales olvidamos cualquier conocimiento abstracto en la décima parte del tiempo que nos costó adquirir dicho conocimiento (dato completamente inventado, pero en mi caso muy próximo a la realidad). Así que lo que vamos a hacer en concretar este conocimiento, y ponernos a programar.
El programa NotePad es un ejemplo que se [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>La mayoría de los mortales olvidamos cualquier conocimiento abstracto en la décima parte del tiempo que nos costó adquirir dicho conocimiento (dato completamente inventado, pero en mi caso muy próximo a la realidad). Así que lo que vamos a hacer en concretar este conocimiento, y ponernos a programar.</p>
<p>El programa <a href="http://code.google.com/android/samples/NotePad/index.html">NotePad</a> es un ejemplo que se incluye en la documentación de Google y en la SDK. Es un programa muy simple: permite crear notas, editarlas, borrarlas y modificar el título. Vamos a ver cómo funciona.</p>
<p><strong>El ejemplo NotePad. El archivo Manifest.<br />
</strong></p>
<p>Comencemos por el <a title="AndroidManifest.xml" href="http://code.google.com/android/samples/NotePad/AndroidManifest.html"><em>Manifest</em></a>, que es donde se definen los componentes de la aplicación. El manifest.xml es, como su extensión indica, un archivo xml, que desde hace unos años se convertido en un formato habitual para contener configuraciones. El elemento raíz se llama manifest y contiene el namespace de la aplicación. Dentro se define el elemento aplicación:</p>
<blockquote><p><code>&lt;application android:icon="@drawable/app_notes" android:label="@string/app_name"&gt;</code></p></blockquote>
<p>Aquí asociamos un nombre y un icono a la aplicación. La &#8216;@&#8217; nos indica una referencia a un recurso. En general tiene este formato: <code>@[package:]type/name</code>, donde el paquete es opcional y sólo se indica cuando no pertenece a nuestra aplicación, el tipo corresponde a uno de los definidos en la carpeta <code>res</code>, y el nombre indica el identificador del recurso.  En nuestro caso, el icono se encuentra bajo la carpeta <code>drawable</code>, y la <code>app_name </code>se define en el archivo <code>strings.xml </code>de la carpeta <code>values</code>.</p>
<p>Dentro del elemento application lo primero que aparece es un provider, que nos dará acceso a la base de datos y que veremos más adelante. Tras él podemos ver definidas tres <em>Activities</em>: <code>NotesList</code>, <code>NoteEditor </code>y <code>TitleEditor</code>. Corresponderán a cada una de las ventanas: la que muestra las notas, la que las edita y la que modifica el título. Por ejemplo, este el elemento <code>TitleEditor</code>:</p>
<blockquote><p><code>&lt;activity android:name="TitleEditor" android:label="@string/title_edit_title" android:theme="@android:style/Theme.Dialog"&gt;</code></p></blockquote>
<p>Además de indicar el nombre de la actividad, y la etiqueta que aparecerá en la ventana asociada, también especificamos que vamos a utilizar un tema concreto para esta actividad. Los temas nos permiten cambiar el <em>look&amp;feel</em> de las aplicaciones con temas predefinidos o creados por nosotros. En este caso podemos ver como el recurso correspondiente al tema se referencia a través del paquete <code>android</code>, ya que está definido en el sistema, no en nuestra aplicación.</p>
<p>Dentro de cada <code>activity</code> hay definidos <code>intent-filters</code>, que permiten concretar el ámbito en el que se van a ejecutar, como ya vimos <a title="Programando en Android - Conceptos iniciales (II)" href="http://javiercancela.com/2008/05/19/programando-en-android-conceptos-iniciales-ii/">anteriormente</a>. Por ejemplo, en NotesList encontramos:</p>
<blockquote><p><code>&lt;intent-filter&gt;<br />
&lt;action android:name=&#8221;android.intent.action.MAIN&#8221; /&gt;<br />
&lt;category android:name=&#8221;android.intent.category.LAUNCHER&#8221; /&gt;<br />
&lt;/intent-filter&gt;</code>;</p></blockquote>
<p>que indica que esta es la actividad principal de la aplicación, y que aparecerá en el menú de aplicaciones del sistema. El filtro</p>
<blockquote><p><code>&lt;intent-filter&gt;<br />
&lt;action android:name=&#8221;android.intent.action.VIEW&#8221; /&gt;<br />
&lt;action android:name=&#8221;android.intent.action.EDIT&#8221; /&gt;<br />
&lt;action android:name=&#8221;android.intent.action.PICK&#8221; /&gt;<br />
&lt;category android:name=&#8221;android.intent.category.DEFAULT&#8221; /&gt;<br />
&lt;data android:mimeType=&#8221;vnd.android.cursor.dir/vnd.google.note&#8221; /&gt;<br />
&lt;/intent-filter&gt;</code></p></blockquote>
<p>nos indica que la actividad está disponible para ver, editar o seleccionar elementos del tipo <code>vnd.android.cursor.dir/vnd.google.note</code>, que es el tipo que definiremos más adelante para las notas. Finalmente, el filtro</p>
<blockquote><p>&lt;intent-filter&gt;<br />
&lt;action android:name=&#8221;android.intent.action.GET_CONTENT&#8221; /&gt;<br />
&lt;category android:name=&#8221;android.intent.category.DEFAULT&#8221; /&gt;<br />
&lt;data android:mimeType=&#8221;vnd.android.cursor.item/vnd.google.note&#8221; /&gt;<br />
&lt;/intent-filter&gt;</p></blockquote>
<p>permite al usuario seleccionar el tipo de dato <code>vnd.android.cursor.dir/vnd.google.note</code>. A diferencia de la acción <code>android.intent.action.PICK</code>, donde se selecciona un elemento de un conjunto de datos, aquí se selecciona un tipo de dato para que el usuario haga algo con él.</p>
<p>Todo esto se verá más claro al examinar el código de las actividades.</p>
<p><strong>Entradas anteriores:</strong><br />
<a href="http://javiercancela.com/2008/05/19/programando-en-android-conceptos-iniciales-ii/">Programando en Android - Conceptos iniciales (II)</a><br />
<a href="http://javiercancela.com/2008/05/12/programando-en-android-conceptos-iniciales-i/">Programando en Android - Conceptos iniciales (I)</a><br />
<a href="http://javiercancela.com/2008/05/06/programando-en-android-prologo/">Programando en Android - Prólogo</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/231/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/231/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/231/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/231/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/231/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=231&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/05/26/programando-en-android-notepad-i/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>
	</item>
		<item>
		<title>El informe Opera sobre la web móvil: reflexiones</title>
		<link>http://javiercancela.com/2008/05/22/el-informe-opera-sobre-la-web-movil-reflexiones/</link>
		<comments>http://javiercancela.com/2008/05/22/el-informe-opera-sobre-la-web-movil-reflexiones/#comments</comments>
		<pubDate>Thu, 22 May 2008 19:43:56 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[Web móvil]]></category>

		<category><![CDATA[Estado de la web móvil]]></category>

		<category><![CDATA[opera mini]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=226</guid>
		<description><![CDATA[Opera ha publicado estos días un pequeño informe llamado &#8220;Estado de la web móvil&#8221; (en inglés aquí), que analiza tendencias en la navegación por Internet a través de dispositivos móviles usando datos anónimos enviados por su navegador Opera Mini durante los tres primeros meses del 2008.
Este tipo de informes contienen sesgos imprevisibles que nos obligan [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>Opera ha publicado estos días un pequeño informe llamado &#8220;Estado de la web móvil&#8221; (en inglés <a title="First Quarter, 2008" href="http://www.opera.com/mobile_report/">aquí</a>), que analiza tendencias en la navegación por Internet a través de dispositivos móviles usando datos anónimos enviados por su navegador Opera Mini durante los tres primeros meses del 2008.</p>
<p>Este tipo de informes contienen sesgos imprevisibles que nos obligan a sacar conclusiones con mucho cuidado. El sesgo más evidente es que nos habla de usuarios de Opera Mini, lo que excluye a dueños de móviles iPhone, y minimiza el impacto de las BlackBerry, entre otros dispositivos (aunque existe Opera Mini para BlackBerry, creo que aún no es compatible con la tarifa plana del servicio BIS).</p>
<p>Dicho esto, algunas ideas que me sugiere el informe:</p>
<ul>
<li>La lista de los diez países que más navegan es llamativa: encabezada por Rusia, con Indonesia en segundo lugar, e incluyendo a Sudáfrica y Polonia junto a Estados Unidos o Gran Bretaña. Esta mezcla de países ricos y pobres reafirma una tendencia conocida: en los países menos desarrollados la falta de infraestructuras para acceder a Internet por cable o ADSL incentiva el acceso a Internet a través del móvil.</li>
<li>Si observamos las gráficas que muestran, desde Enero del 2006, la evolución en número de usuarios, número de páginas y megas transferidos por mes, observamos un crecimiento aparentemente exponencial. Esta información está distorsionada por el hecho de que Opera Mini apareció en el mercado precisamente a principios del 2006, pero parece deducirse un incremento drástico en el acceso móvil a Internet en los últimos meses.</li>
</ul>
<p style="text-align:center;"><a href="http://javiercancela.files.wordpress.com/2008/05/users_cumulative.jpg"><img class="alignnone size-thumbnail wp-image-228" src="http://javiercancela.files.wordpress.com/2008/05/users_cumulative.jpg?w=103&h=96" alt="" width="103" height="96" /></a><a href="http://javiercancela.files.wordpress.com/2008/05/views_monthly.jpg"><img class="alignnone size-thumbnail wp-image-229" src="http://javiercancela.files.wordpress.com/2008/05/views_monthly.jpg?w=86&h=96" alt="" width="86" height="96" /></a><a href="http://javiercancela.files.wordpress.com/2008/05/data_monthly.jpg"><img class="alignnone size-thumbnail wp-image-227" src="http://javiercancela.files.wordpress.com/2008/05/data_monthly.jpg?w=98&h=96" alt="" width="98" height="96" /></a></p>
<ul>
<li>Si comparamos los diez sitios más visitados en Estados Unidos y Reino Unido con el top Alexa para estos países, vemos que coinciden en gran medida. Dos cosas me llaman un poco la atención: el sitio www.mocospace.com, que está en el top móvil de ambos países pero no aparece en los 100 primeros del ranking Alexa para ninguno de ellos; y la ausencia de youtube en la lista completa de países que ofrece Opera, aunque esto último puede que sea debido a que la página no funcione bien en Opera Mini.</li>
</ul>
<p>El informe contiene una conclusión un tanto capciosa: el triunfo de la &#8220;web completa&#8221; sobre la web wap o específica para móviles, basandose en que esta última sólo supone una cuarta parte de los datos obtenidos. Pero son datos obtenidos a través de un navegador que soporta razonablemente bien las páginas más habituales. ¿A qué tipo de páginas navegan los que no usan Opera Mini? Y sobre todo, ¿a cuántas páginas dejan de navegar, por ser difíciles o imposibles de usar, los usuarios de la web móvil? Puede que la conclusión del informe sea correcta, pero es pronto para afirmarlo.</p>
<p><strong>Vía</strong>: <a title="Estado de la web móvil de Opera" href="http://www.ojomoviles.com/noticias/estado-de-la-web-movil-de-opera/">Estado de la web móvil de Opera</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/226/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/226/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/226/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/226/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/226/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/226/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/226/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/226/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=226&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/05/22/el-informe-opera-sobre-la-web-movil-reflexiones/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>

		<media:content url="http://javiercancela.files.wordpress.com/2008/05/users_cumulative.jpg?w=103" medium="image" />

		<media:content url="http://javiercancela.files.wordpress.com/2008/05/views_monthly.jpg?w=86" medium="image" />

		<media:content url="http://javiercancela.files.wordpress.com/2008/05/data_monthly.jpg?w=98" medium="image" />
	</item>
		<item>
		<title>Programando en Android - Conceptos iniciales (II)</title>
		<link>http://javiercancela.com/2008/05/19/programando-en-android-conceptos-iniciales-ii/</link>
		<comments>http://javiercancela.com/2008/05/19/programando-en-android-conceptos-iniciales-ii/#comments</comments>
		<pubDate>Mon, 19 May 2008 07:00:12 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[Uncategorized]]></category>

		<category><![CDATA[Android]]></category>

		<category><![CDATA[desarrollo móvil]]></category>

		<category><![CDATA[Intent]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=222</guid>
		<description><![CDATA[Intents
Si las Activities son básicamente pantallas, las &#8220;intenciones&#8221; o Intents son la manera de invocar estas Activities. La definición breve de la documentación es: &#8220;Un intent es la descripción abstracta de una operación que se va a llevar a cabo&#8221;. O dicho de otro modo, un Intent es una clase que permite especificar una Activity [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><strong><em>Intents</em></strong></p>
<p>Si las <em>Activities</em> son básicamente pantallas, las &#8220;intenciones&#8221; o <a title="Intent" href="http://code.google.com/android/reference/android/content/Intent.html"><em>Intents</em></a> son la manera de invocar estas <em>Activities</em>. La definición breve de la documentación es: &#8220;Un intent es la descripción abstracta de una operación que se va a llevar a cabo&#8221;. O dicho de otro modo, un <em>Intent</em> es una clase que permite especificar una <em>Activity</em> a ejecutar, llamando a uno de los métodos de la clase <em>Activity</em> con ese <em>Intent</em> de parámetro. Parece fácil, pero he de confesar que en la documentación de Android el asunto me pareció un poco confuso, sobre todo por la cantidad de información que puede ir asociada a estas clases.</p>
<p><strong>Dos formas de llamar a una <em>Activity</em></strong></p>
<p>Explicitamente o implicitamente. La forma explícita es simple de entender: creamos un Intent indicando el nombre de la clase correspondiente a la actividad y el paquete, llamamos a startActivity (o startSubActivity si queremos que nos notifiquen cuándo finaliza dicha actividad) y listo. El sistema busca la clase y crea la instancia, pasándo los datos que podamos haber añadido al <em>Intent </em>en el objeto <em>Bundle </em>del método <em>onCreate </em>de la nueva instancia.</p>
<blockquote><p><code>// ClaseActividad1 es la clase de la actividad</code><br />
//<code>que queremos iniciar. El parámetro this indica </code><br />
//<code>el Context actual, para saber en qué </code><br />
// <code>package buscar esta clase<br />
Intent i = new Intent(this, ClaseActividad1.class);<br />
// Esta información se recuperará en el objeto Bundle de onCreate<br />
i.putExtra(&#8221;NombreParametro&#8221;, valorParametro);<br />
startActivity(i);</code></p></blockquote>
<p>La invocación implícita de una actividad se realiza también a través de la clase <em>Intent</em>. Es implícita porque no se indica el nombre de la clase correspondiente a la actividad a invocar, sino que se establecen una serie de criterios, y se deja que el sistema elija una actividad que cumpla esos criterios.</p>
<p><strong>Intenciones y criterios</strong></p>
<p>A un <em>Intent</em> podemos asociarle una acción, unos datos y una categoría. Y aquí está el verdadero <em>quid</em> de esta clase.  Las actividades pueden declarar el tipo de acciones que pueden llevar a cabo y los tipos de datos que pueden gestionar. Las acciones son cadenas de texto estándar que describen lo que que la actividad puede hacer. Por ejemplo, <span>android.intent.action.VIEW es una acción que indica que la actividad puede mostrar datos al usuario. Esta acción viene predefinida en la clase Intent, pero es posible definir nuevas acciones para nuestras actividades. La misma actividad puede declarar que el tipo de datos del que se ocupa es, por ejemplo, </span>&#8220;vnd.android.cursor.dir/person&#8221;. También puede declarar una categoría, que básicamente indica si la actividad va a ser lanzada desde el lanzador de aplicaciones, desde el menú de otra aplicación o directamente desde otra actividad. En el AndroidManifest.xml quedaría algo así:</p>
<blockquote><p><code>&lt;intent-filter&gt;<br />
&lt;action android:name=&#8221;<span>android.intent.action.VIEW</span>&#8221; /&gt;<br />
&lt;category android:name=&#8221;android.intent.category.DEFAULT&#8221; /&gt;<br />
&lt;data android:mimeType=&#8221;vnd.android.cursor.dir/person&#8221; /&gt;<br />
&lt;/intent-filter&gt;</code></p></blockquote>
<p>Así, para llamar implícitamente a una actividad a través de un <em>intent</em>, en vez de asignar el nombre de la clase le asignamos una de las acciones que esta puede llevar a cabo, con el tipo de datos adecuado. Las reglas exactas se indican en la documentación de la clase <a title="IntentFilter" href="http://code.google.com/android/reference/android/content/IntentFilter.html">IntentFilter</a>.</p>
<p><strong>Conclusiones</strong></p>
<p><em>Activities</em> e <em>Intents</em> son los dos ejes sobre los que gira la arquitectura de las aplicaciones Android. Existen muchos más conceptos importantes, por supuesto, pero a partir de aquí lo mejor es verlo funcionando todo en una aplicación ejemplo. Pero eso será en la próxima entrada.</p>
<p><strong>Entradas anteriores:</strong><br />
<a href="http://javiercancela.com/2008/05/12/programando-en-android-conceptos-iniciales-i/">Programando en Android - Conceptos iniciales (I)</a><br />
<a href="http://javiercancela.com/2008/05/06/programando-en-android-prologo/">Programando en Android - Prólogo</a></p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/222/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/222/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/222/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/222/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/222/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=222&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/05/19/programando-en-android-conceptos-iniciales-ii/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>
	</item>
		<item>
		<title>LiMo Platform: la plataforma Linux Mobile</title>
		<link>http://javiercancela.com/2008/05/17/limo-platform-la-plataforma-linux-mobile/</link>
		<comments>http://javiercancela.com/2008/05/17/limo-platform-la-plataforma-linux-mobile/#comments</comments>
		<pubDate>Sat, 17 May 2008 18:32:47 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[Linux Mobile]]></category>

		<category><![CDATA[LiMo]]></category>

		<category><![CDATA[LiMo Foundation]]></category>

		<category><![CDATA[LiMo Platform]]></category>

		<category><![CDATA[sistemas operativos móviles]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=223</guid>
		<description><![CDATA[La fundación LiMo fue fundada a principios del 2007 por Motorola, NEC, NTT DoCoMo, Orange, Panasonic, Samsung y Vodafone con el propósito de crear un sistema operativo abierto basado en Linux y disponible para cualquier hardware. Desde entonces han sacado varias notas de prensa anunciando la incorporación de nuevas en presas a la fundación así [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>La <a title="LiMo foundation" href="http://www.limofoundation.org/">fundación LiMo</a> fue fundada a principios del 2007 por Motorola, NEC, NTT DoCoMo, Orange, Panasonic, Samsung y Vodafone con el propósito de crear un sistema operativo abierto basado en Linux y disponible para cualquier hardware. Desde entonces han sacado varias notas de prensa anunciando la incorporación de nuevas en presas a la fundación así como sus previsiones de lanzamiento de los primeros dispositivos LiMo.</p>
<p>El último <a title="Verizon se une a Mobile Linux (LiMo)" href="http://www.theinquirer.es/2008/05/16/verizon_se_une_a_mobile_linux_limo.html">anuncio</a> que han hecho ha sido la incorporación del operador norteamericano Verizon al consorcio. Como quiera que Android ya lleva unos meses en el mercado, las <a title="Android vs LiMo" href="http://www.xatakamovil.com/2008/05/16-android-vs-limo">comparaciones</a> entre ambos sistemas basados en Linux no se han hecho esperar.</p>
<p>Como no había prestado mucha atención a LiMo hasta ahora, he aprovechado esta noticia para averiguar un poco más sobre esta plataforma, empezando por los móviles LiMo actualmente en el mercado. La página de la fundación tiene un <a title="LiMo Handsets" href="http://www.limofoundation.org/solutions/index.php">listado </a>de los dispositivos que están actualmente en el mercado, sobre todo Motorola y NTT DoCoMo. Me sorprendió encontrar en la lista algún dispositivo conocido, como el <a title="Motorola Z6w" href="http://www.motorola.com/motoinfo/product/detailsPf.jsp?globalObjectId=232">Motorola Z6w</a>. ¿El Z6w es un móvil LiMo? Pues en realidad no, al menos no del todo. El sistema del Z6w, según la hoja de especificaciones, se denomina &#8220;MOTOMAGX™ &#8211;Motorola&#8217;s Linux™-Java operating system&#8221;. ¿Por qué entonces aparece en la lista de dispositivos LiMo?</p>
<p>Por lo que he podido entender de lo que he leído la situación de la plataforma LiMo es la siguiente: los miembros de la fundación están desarrollando un sistema operativo basado en una arquitectura como la que se muestra en este esquema, sacado de <a title="Verizon picks Linux—but not Android—for mobile platform" href="http://arstechnica.com/news.ars/post/20080515-verizon-picks-linuxbut-not-androidfor-mobile-platform.html?rel">ars technica</a>:</p>
<p><a href="http://javiercancela.files.wordpress.com/2008/05/limo_platform.png"><img class="alignnone size-full wp-image-224" src="http://javiercancela.files.wordpress.com/2008/05/limo_platform.png?w=500&h=324" alt="" width="500" height="324" /></a></p>
<p>Cada uno de estos componentes está siendo probado, desarrollado o estudiado por los miembros de la fundación. Por ejemplo, los marcados en gris forman parte de una <em>release</em> inicial llamada R1, <a title="Engadget      * Engadget Español  Buscar      * RSS Feed     * Contacto     * ¡Env�anos información!  Listo el R1 de la plataforma Linux para móviles LiMo" href="http://es.engadget.com/2008/03/31/listo-el-r1-de-la-plataforma-linux-para-moviles-limo/">liberada este marzo</a>. La siguiente fase del sistema, marcada como R2, se encuentra en desarrollo, y quedan varios componentes pendientes para futuras fases.</p>
<p>En teoría, la R2 será liberada este año, y también en teoría este año estará disponible una SDK para los desarrolladores. Mientras tanto, se han publicado las interfaces de las APIs de la <em>release</em> 1 <a title="Technical Documents Whitepapers" href="http://www.limofoundation.org/technical-documents.html">aquí</a>, que incluye GTK+ para la interfaz de usuario. Todo ello en C y C++.</p>
<p>Los primeros dispositivos LiMo están anunciados para finales de este año. Así que, ¿qué hay de los móviles que aparecen en la página de la fundación LiMo, como el Motorola Z6w? Pues son dispositivos que incorporan algunos de los componentes que aparecen en el gráfico: están basados en Linux, y sirven de banco de pruebas para la futura especificación de la plataforma.</p>
<p>Así que todavía es pronto para cualquier tipo de comparaciones. LiMo sólo tiene en el mercado varios dispositivos con parte de los componentes del sistema, mientras que Android tiene el sistema completo pero sin dispositivos físicos. Dentro de unos meses volveremos a hablar del asunto.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/223/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/223/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/223/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/223/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/223/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=223&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/05/17/limo-platform-la-plataforma-linux-mobile/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>

		<media:content url="http://javiercancela.files.wordpress.com/2008/05/limo_platform.png" medium="image" />
	</item>
		<item>
		<title>Alberto triunfando en la Where2.0, o cómo USA is different</title>
		<link>http://javiercancela.com/2008/05/15/alberto-triunfando-en-la-where20-o-como-usa-is-different/</link>
		<comments>http://javiercancela.com/2008/05/15/alberto-triunfando-en-la-where20-o-como-usa-is-different/#comments</comments>
		<pubDate>Thu, 15 May 2008 20:07:47 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[ipoki]]></category>

		<category><![CDATA[Where2.0]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=220</guid>
		<description><![CDATA[Alberto no se va a volver de vacío de la Where2.0 gracias a Frank Taylor, de Google Earth Blog. Este blogger especialista en GPS, gráficos 3D, y simuladores espaciales (trabajó en la NASA, tope cool&#8230;) sorteó un ratón 3D entre la gente que le había dado su tarjeta, y Alberto resultó el ganador.
Más allá de [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p><a href="http://javiercancela.files.wordpress.com/2008/05/alberto.jpg"><img class="alignright size-medium wp-image-221" src="http://javiercancela.files.wordpress.com/2008/05/alberto.jpg?w=257&h=300" alt="" width="257" height="300" /></a>Alberto no se va a volver de vacío de la <a title="Presentación de Ipoki en la Where2.0 Conference" href="http://blogs.ipoki.com/es/">Where2.0</a> gracias a Frank Taylor, de <a title="Winner of Google Earth Blog SpaceNavigator Giveaway" href="http://www.gearthblog.com/blog/archives/2008/05/winner_of_google_earth_blog_spacena.html">Google Earth Blog</a>. Este blogger especialista en GPS, gráficos 3D, y simuladores espaciales (trabajó en la NASA, tope <em>cool</em>&#8230;) sorteó un <a title="Space Navigator for Notebooks Reviewed" href="http://www.gearthblog.com/blog/archives/2008/04/space_navigator_for_notebooks_revie.html">ratón 3D</a> entre la gente que le había dado su tarjeta, y Alberto resultó el ganador.</p>
<p>Más allá de la anéctoda, es interesante comprobar las diferencias, digamos formales, que existen en este tipo de eventos entre España y Estados Unidos. La actitud abierta e informal que en este tipo de congresos muestran los asistentes, incluso aquellos que ostentan la condición de gurús o tienen altos cargos directivos, contrasta con el estereotipo de ponente de congresos español, que enfundado en su traje acude a dar su charla, disfrutar de la comida con los organizadores y los cargos políticos del sector, y si acaso conseguir un par de entradas para que los técnicos aplaudan en su intervención y paseen por los stands.</p>
<p>Es una descripción un tanto caricaturesca, y por tanto exagerada, pero este tipo de eventos son una oportunidad fantástica para conocer a gente que tiene los mismos intereses que tú e intercambiar ideas y experiencias, y en España es demasiado habitual que la principal motivación para organizar congresos sea dejarse ver y aparecer en la prensa.</p>
<p>En fin. Tras este desahogo después de un duro día de trabajo (creo que empiezo a comprender por qué a alguna gente le gusta tanto bloguear), les deseo suerte a Alberto y Diego en su conquista de las américas.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/220/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/220/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/220/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/220/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/220/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=220&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/05/15/alberto-triunfando-en-la-where20-o-como-usa-is-different/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>

		<media:content url="http://javiercancela.files.wordpress.com/2008/05/alberto.jpg?w=257" medium="image" />
	</item>
		<item>
		<title>Programando en Android - Conceptos iniciales (I)</title>
		<link>http://javiercancela.com/2008/05/12/programando-en-android-conceptos-iniciales-i/</link>
		<comments>http://javiercancela.com/2008/05/12/programando-en-android-conceptos-iniciales-i/#comments</comments>
		<pubDate>Mon, 12 May 2008 07:00:19 +0000</pubDate>
		<dc:creator>Javier Cancela</dc:creator>
		
		<category><![CDATA[Android]]></category>

		<category><![CDATA[Activity]]></category>

		<category><![CDATA[AndroidManifest]]></category>

		<guid isPermaLink="false">http://javiercancela.wordpress.com/?p=211</guid>
		<description><![CDATA[El primer paso para relacionar conceptos es conocer los conceptos. Y en Android existen una serie de conceptos que suponen la piedra y el mortero de cualquier aplicación.
El archivo AndroidManifest.xml
Este archivo está presente en todas las aplicaciones Android. Su contenido especifica los componentes de la aplicación, así como la configuración global de la misma. Su [...]]]></description>
			<content:encoded><![CDATA[<div class='snap_preview'><br /><p>El primer paso para <a title="Programando en Android - Prólogo" href="http://javiercancela.com/2008/05/06/programando-en-android-prologo/">relacionar conceptos</a> es conocer los conceptos. Y en Android existen una serie de conceptos que suponen la piedra y el mortero de cualquier aplicación.</p>
<p><strong>El archivo <code>AndroidManifest.xml</code></strong></p>
<p>Este archivo está presente en todas las aplicaciones Android. Su contenido especifica los componentes de la aplicación, así como la configuración global de la misma. Su descripción se muestra en <a title="The AndroidManifest.xml File" href="http://code.google.com/android/devel/bblocks-manifest.html">esta página de la documentación</a>.</p>
<p>En una aplicación habitual, dentro de este archivo habrá un elemento <a title="&lt;application&gt;" href="http://code.google.com/android/reference/android/R.styleable.html#AndroidManifestApplication"><code>&lt;application&gt;</code></a>, dentro del cuál habrá uno o varios elementos <code><a title="&lt;activity&gt;" href="http://code.google.com/android/reference/android/R.styleable.html#AndroidManifestActivity">&lt;activity&gt;</a></code>. Cada uno de estos elementos supone una interacción con el usuario (generalmente una ventana), y se corresponde con una clase que hereda de la clase <a title="Activity" href="http://code.google.com/android/reference/android/app/Activity.html"><code>Activity</code></a>.</p>
<p><strong>La clase </strong><em><strong>Activity</strong></em></p>
<p>Según la documentación de Google, una <em>Activity</em> es una cosa única con un objetivo determinado que el usuario puede hacer. Esta es una definición abstracta. Podemos concretar más la definición diciendo que una <em>Activity</em> (es decir, una clase de nuestra aplicación que hereda de la clase <code>Activity</code>) se presenta al usuario como una ventana. Esta clase crea una ventana que muestra una interfaz de usuario, la cual está definida a su vez en una instancia de otra clase, la clase <a title="View" href="http://code.google.com/android/reference/android/view/View.html"><code>View</code></a>.</p>
<p>Cuando se ejecuta una aplicación Android lo primero que se muestra al usuario es la ventana definida por la actividad que esté marcada en el <code>AndroidManifest.xml</code> como principal. Las actividades se gestionan como una pila, así que desde una actividad se puede llamar a otra, y cuando esta finaliza se retorna a la actividad inicial.</p>
<p>Una actividad puede estar ejecutándose, en pausa o detenida. Simplificando, está en ejecución cuando es visible e interacciona con el usuario, está en pausa cuando es visible pero otra ventana, transparente o que no ocupe toda la pantalla, tiene el foco, y está detenida cuando no es visible. En todos estos casos la clase mantiene su información.</p>
<p>En la documentación encontramos un gráfico que ilustra el ciclo de vida de una actividad:</p>
<p><a href="http://javiercancela.files.wordpress.com/2008/05/activity_lifecycle.png"><img class="alignnone size-full wp-image-216" src="http://javiercancela.files.wordpress.com/2008/05/activity_lifecycle.png?w=500&h=686" alt="" width="500" height="686" /></a></p>
<p>Aunque no es necesario entender de momento todos los detalles de este gráfico, en él se ven los estados por los que puede pasar una actividad (los óvalos coloreados) y los eventos que se disparan en dichos estados (los rectángulos grises):</p>
<ul>
<li>Cuando se crea una actividad, se invoca el evento <code>onCreate()</code>. Este evento sólo se invoca la primera vez que se llama a una actividad, o bien cuando se llama después de que el sistema haya tenido que eliminarla por falta de recursos (más sobre esto en próximos artículos).</li>
<li><code>onStart()</code> es el evento invocado cuando cada vez que la actividad se muestra al usuario. Es decir, la primera vez que se muestra, y las veces que en las que vuelve a aparecer tras haber estado oculta. En este último caso, se invoca <code>onStop()</code> al desaparecer y <code>onRestart()</code> inmediatamente antes de reaparecer.</li>
<li><code>onFreeze()</code> y <code>onPause()</code> son llamadas secuencialmente cuando otra actividad va a pasar en encargarse de la interacción con el usuario. Tras <code>onPause()</code> la actividad permanece en un estado de espera en el que puede ocurrir que la aplicación sea destruida, por lo que estos eventos se usan para consolidar la información que no queremos que se pierda. Si la actividad no se destruye volverá al primer plano con el evento <code>onResume()</code>.</li>
</ul>
<p>La idea importante con la que quedarse es que una actividad que esté pausada o detenida (tras <code>onPause()</code> u <code>onStop()</code>) puede ser destruida por el sistema si previo aviso, por lo que deberemos encargarnos de guardar antes la información necesaria (durante <code>onFreeze()</code> y <code>onPause()</code>). Los detalles lo veremos en una próxima entrada.</p>
<img alt="" border="0" src="http://feeds.wordpress.com/1.0/categories/javiercancela.wordpress.com/211/" /> <img alt="" border="0" src="http://feeds.wordpress.com/1.0/tags/javiercancela.wordpress.com/211/" /> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/javiercancela.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/javiercancela.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/javiercancela.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/javiercancela.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/javiercancela.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/javiercancela.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/javiercancela.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/javiercancela.wordpress.com/211/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/javiercancela.wordpress.com/211/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/javiercancela.wordpress.com/211/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=javiercancela.com&blog=2480144&post=211&subd=javiercancela&ref=&feed=1" /></div>]]></content:encoded>
			<wfw:commentRss>http://javiercancela.com/2008/05/12/programando-en-android-conceptos-iniciales-i/feed/</wfw:commentRss>
	
		<media:content url="http://a.wordpress.com/avatar/javiercancela-128.jpg" medium="image">
			<media:title type="html">Javier Cancela</media:title>
		</media:content>

		<media:content url="http://javiercancela.files.wordpress.com/2008/05/activity_lifecycle.png" medium="image" />
	</item>
	</channel>
</rss>