Está en la página 1de 20

9 !

"#$% '()#%*)
+-./0%
1 | Sobre la gula ....................................................................................... 2
2 | Sobre el auLor ..................................................................................... 3
3 | ConsLrulr un lecLor de feeds slmple ................................................... 5
4 | AumenLar la funclonalldad de un lecLor de feeds ........................... 23 5
| 1raba[ando con lmgenes (cmara y galerla) .................................. 44 6 |
Crabacln y reproduccln de vldeo ..................................................55 7 |
Ceolocallzacln y uullzacln de mapas de Coogle .......................... 64 8 |
1raba[ar con el acelermeLro ...........................................................73 9 |
8eproduccln de sonldo en un clclo lnnlLo ................................... 83 10 |
Lnvlo de emall uullzando Androld ................................................... 90 11 |
1raba[ando con Als (lacebook y 1wluer) ....................................... 99 12 |
ConecLndonos con Apls de Coogle ............................................... 117 13 |
<-9,'%:>:"$ >':#-%: ................................................................... 134 14 |
CLras gulas de maesLros del web ...................................................135
Construir un lector de
feeds simple
:
captulo
; !"#$% '()#%*)
0(1+,*'" 2
Construir un lector de feeds simple
8lenvenldos al prlmer caplLulo del curso sobre Androld daremos lnlclo con el funclonamlenLo de la
arqulLecLura de esLa plaLaforma mvll y los bloques bslcos de una apllcacln.
Kernel de Linux
Ln la base Lenemos el kernel 2.6 de Llnux, Androld lo uullza por su robusLez demosLrada y por la lmple-
menLacln de funclones bslcas para cualquler slsLema operauvo, por e[emplo: segurldad, admlnlsLra-
cln de memorla y procesos, lmplemenLacln de conecuvldad de red (neLwork sLack) y varlos lnLerpreLes
(drlvers) para comunlcacln con los dlsposluvos nslcos(hardware).
Androld uullza como base el kernel de Llnux pero los dos slsLemas no son lo mlsmo, Androld no cuenLa
con un slsLema nauvo de venLanas de Llnux nl uene soporLe para gllbc (llberla esLndar de C) nl Lampoco
es poslble uullzar la mayorla de apllcaclones de Cnu de Llnux.
Adems de Lodo lo ya lmplemenLado en el kernel de Llnux, Androld agrega algunas cosas especlcas
para plaLaformas mvlles como la comunlcacln enLre procesos (lograda a Lraves del blnder), la forma
de mane[ar la memorla comparuda (ashmem) y la admlnlsLracln de energla (con wakelocks). ue las
caracLerlsucas unlcas del kernel uullzado por Androld encuenLran ms lnformacln en !"#$%&# ()$")*
+),-.$)/
1
.
Libreras y ejecucin
Sobre el kernel, Lenemos un con[unLo de llbrerlas de C y C++ uullzadas por el slsLema para varlos nes
) hup://ellnux.org/Androld_kernel_leaLures
< !"#$% '()#%*)
como el mane[o de la panLalla (surface manager), mapas de blLs y upos de leLra (lree 1ype), grcas en
2u y 3u (SCL y CpenCL), mane[o de mulumedla (Medla lramework), almacenamlenLo de daLos (SCLlLe)
y un moLor para las vlsLas web y el navegador (WebklL).
!unLo a esLas llbrerlas, enconLramos lo necesarlo para la e[ecucln de las apllcaclones a Lraves de la
mqulna vlrLual ualvlk. Cada apllcacln uullza una lnsLancla de la mqulna vlrLual e[ecuLando un archlvo
uLx (ualvlk LxecuLable) y el slsLema esL opumlzado para que se e[ecuLen muluples lnsLanclas de la
mqulna vlrLual. Se desarrolla en !ava pero no se uullza una mqulna vlrLual de Sun para su e[ecucln
nl Lampoco archlvos CLASS.
Estructura de aplicaciones
Sobre las llbrerlas enconLramos una esLrucLura que nos brlnda un conLexLo para desarrollar, esLe
framework permlLe a los desarrolladores aprovechar un slsLema de vlsLas ya consLruldo, admlnlsLrar
noucaclones y acessar daLos a Lraves de proveedores de conLenldo enLre oLras cosas.
Aplicaciones
Las apllcaclones cenLrales que lncluye el slsLema por defecLo son: Lelefono, navegador, mane[o de
conLacLos, eLc. Ln esLa capa de la arqulLecLura es donde Lraba[aremos desarrollando apllcaclones.
Bloques bsicos de una aplicacin
una vez vlsLa la arqulLecLura, empezaremos con lo fundamenLal para desarrollar una apllcacln. Los
= !"#$% '()#%*)
componenLes bslcos de una apllcacln son: activities, intents, views, services, content
providers y broadcast receivers.
Sl domlnan blen esLos Lermlnos pueden salLar dlrecLo al cdlgo.

Acnv|nes
1
: son componenLes de la lnLerfaz que corresponde a una panLalla. odemos vlsuallzarlo
como un mazo de carLas en el que Lenemos varlas carLas pero solamenLe una esL hasLa arrlba.
una apllcacln para una llsLa de cosas por hacer (remember Lhe mllk) puede Lener una acuvldad
para lngresar las cosas por hacer y oLra acuvldad para mosLrar el llsLado, en con[unLo esLas acuvl-
dades conforman la apllcacln.

0"-)"-/
2
: son mensa[es que provocan noucaclones o camblos de esLaLus, que al ser reclbldos por
acuvldades o servlclos pueden levanLar procesos. ue esLa forma se unen componenLes denLro de
la mlsma apllcacln o de dlferenLes apllcaclones.

1&)2/
3
: son los componenLes de la lnLerfaz de usuarlo, dlferenLes vlsLas pueden agruparse a
Lraves de grupos logrando una [erarqula, esLo se logra a Lraves de la dlsposlcln de los componen-
Les a Lraves de un archlvo xML.

Serv|ces
4
: son componenLes que e[ecuLan operaclones en segundo plano y no uenen una lnLerfaz
) hup://developer.androld.com/gulde/Loplcs/fundamenLals/acuvlues.hLm
. hup://developer.androld.com/gulde/Loplcs/lnLenLs/lnLenLs-lLers.hLml
3 hup://developer.androld.com/gulde/Loplcs/ul/lndex.hLml
@ hup://developer.androld.com/gulde/Loplcs/fundamenLals/servlces.hLml
> !"#$% '()#%*)
de usuarlo. or e[emplo, al escuchar muslca, hay un servlclo encargado de la reproduccln que se
e[ecuLa de fondo y la apllcacln que manlpulamos le manda mensa[es a esLe servlclo dlclendole
que se deLenga, pause o reproduzca la slgulenLe cancln.

Content rov|ders
1
: represenLan la absLraccln para almacenar y obLener daLos permanenLes y
apllcaclones dlferenLes. Ll slsLema lncluye algunos proveedores de conLenldo uules (audlo, vldeo,
eLc) y adems pueden desarrollarse nuevos.

3,"&4)/-
2
: Ll archlvo AndroldManlfesL.xml es donde se congura la apllcacln, se agregan acuvl-
dades, se aslgnan permlsos, eLc.

8roadcast kece|vers: son componenLes que responden a avlsos y anunclos de dlfusln (broad-
casL). LsLos avlsos provlenen del slsLema (baLerla ba[a, una llamada enLranLe, eLc) y de apllcaclones
(pasando avlsos de una apllcacln a oLra). Aun que no muesLran una lnLerfaz de usuarlo algunas
veces uullzan barras de progreso para mosLrar avances. LsLos se acuvan a Lraves de mensa[es asln-
crnlcos llamados lnLenLs (menclonados arrlba).
Ejemplo: Lector de feeds
La apllcacln que reallzaremos es un lecLor para el feed de MaesLros del Web, queremos que al nallzar
se vea de la slgulenLe forma:
) hup://developer.androld.com/gulde/Loplcs/provlders/conLenL-provlders.hLml
. hup://developer.androld.com/gulde/Loplcs/manlfesL/manlfesL-lnLro.hLml
:? !"#$% '()#%*)
Disposicin inicial
=##>'6>9-$ #)/5,$6,"#% )* 57#&6% 8,/)
1
que debe ser lmporLado hacla un proyecLo nuevo. Ln ml caso,
el cdlgo descargado lo Lengo en el folder /Users/ykro/Desktop/LectorFeedMDWBaseA3
Ln esLe cdlgo enconLrars algunas cosas de ayuda para el desarrollo del proyecLo. Sl qulsleran lnlclar
desde cero, con un proyecLo nuevo, lo mlnlmo que deberlan hacer para Lenerlo llsLo es:

uarle permlso a la apllcacln para que pueda accesar a lnLerneL
ara hacer esLo, vamos al archlvo AndroidManifest.xml y [usLo anLes de la euqueLa que clerra
manlfesL colocamos:
<br />
<uses-permission android:name=android.permission.INTERNET /><br />
) hups://glLhub.com/androldMuW/gula1base
:: !"#$% '()#%*)

1ener un LlnearLayouL con orlenLacln verucal en el archlvo de dlseno prlnclpal.
ara lograr esLo, en el archlvo /res/layout/main.xml "$ '"6"$>#%- 8"'"#3
<br />
<LinearLayout android:id=@+id/LL01 android:layout_width=hll_parent
android:layout_height=hll_parent android:orientation=vertical
xmlns:android=http://schemas.android.com/apk/res/android>
</LinearLayout>

1ener una forma de reconocer xML.
Ln el cdlgo de demo se provee la clase src/com/androld/mdw/demo/xMLarser.[ava. no vamos a repa-
sar el cdlgo de cmo se hace el reconoclmlenLo de xML, esLe parser uene un funclonamlenLo general
sln embargo para los nes de esLa apllcacln nos lnLeresa que devuelva una llsLa slmplemenLe enca-
denada (LlnkedLlsL de !ava) y en cada poslcln un dlcclonarlo (PashMap de !ava) porque de esa forma
vamos a almacenar los daLos.
LsLo se logra a Lraves de un meLodo llamado parse() y adlclonal a esLo, en el consLrucLor el xMLarser
debe reclblr la dlreccln del feed que reconocer.
Diseo
1raba[aremos con los slgulenLes vlews para lograr el ob[euvo.

9&"),$9,:%.-
1
: agrupa los elemenLos en un solo senudo (verucal u horlzonLal).

9&/-1&)2
2
: muesLra los elemenLos en un llsLado verucal con scroll.

;)<-1&)2
3
: una euqueLa para colocar LexLo.

8uuon
4
: un boLn para preslona.
vamos a colocar prlmero un LlnearLayouL con arreglo verucal y denLro de el dos cosas:
) hup://developer.androld.com/gulde/LuLorlals/vlews/lndex.hLml
. hup://www.maesLrosdelweb.com/edlLorlal/curso-androld-consLrulr-lecLor-de-feeds/
3 hup://developer.androld.com/reference/androld/wldgeL/1exLvlew.hLml
@ hup://developer.androld.com/reference/androld/wldgeL/8uuon.hLml
:! !"#$% '()#%*)
1 | LlnearLayouL con arreglo horlzonLal (para la euqueLa y el boLn).
2 | LlsLvlew para los elemenLos del feed.
0,"$8#- >#6B%1- /res/layout/main.xml quedarla enLonces de la slgulenLe forma:
<br />
<?xml version=1.0 encoding=utf-8?><br />
<LinearLayout android:id=@+id/LL01
android:layout_width=hll_parent android:layout_height=hll_parent
android:orientation=vertical xmlns:android=http://
schemas.android.com /apk/res/android>
<LinearLayout android:id=@+id/LL02
android:orientation=horizontal android:layout_width=wrap_content
android:layout_height=wrap_content>
<TextView android:id=@+id/tvLoadTip
android:layout_width=wrap_content
android:layout_height=wrap_content android:text=Presione
el botn para cargar datos><br />
</TextView><br />
<Button android:id=@+id/btnLoad
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=Enviar><br />
</Button><br />
</LinearLayout>
<ListView android:id=@+id/lstData
android:layout_width=wrap_content
android:layout_height=wrap_content android:padding=5dip>
</ListView>
</LinearLayout></p>
<p>
Ls lmporLanLe noLar los ldenucadores que colocamos, ya que los uullzaremos ms adelanLe.
:6 !"#$% '()#%*)
Mostrar datos siguiendo el diseo
Luego de Lermlnado el dlseno podemos enfocarnos en el cdlgo que nos permlur poblar el LlsLvlew
con los elemenLos del feed que vamos a leer.
1raba[emos ahora en el archlvo src/com/android/mdw/demo/Main.java.
lnlclalmenLe enconLramos 2 consLanLes que uullzaremos para guardar la lnformacln en un PashMap.
<br />
static hnal String DATA_TITLE = T;<br />
static hnal String DATA_LINK = L;<br />
Agregamos una esLrucLura de daLos esLuca para guardar la lnformacln del feed una vez la fulmos a
Lraer y reconoclmos.
<br />
static LinkedList<HashMap<String, String>> data;<br />
Ln una apllcacln real esLo no deberla hacerse nunca, Lodo campo esLuco (varlable de clase) #)8)=
r|a ser hna|
1
y en esLe caso no lo es porque lo aslgnaremos luego de que el parser devuelva la daLa. La
forma correcLa de reallzar esLe almacenamlenLo volul es uullzando clases de apllcacln, algo que vere-
mos en prxlmos caplLulos y sl se qulslera almacenamlenLo no volul se uene acceso a base de daLos a
Lraves de SCLlLe. Paremos Lamblen una funcln auxlllar que reclbe una llsLa de mapas, y uullzando esLa
daLa crea un adapLador para poblar al LlsLvlew del dlseno.
<br />
private void setData(LinkedList<HashMap<String, String>> data){<br />
SimpleAdapter sAdapter = new SimpleAdapter(getApplicationContext(),
data,<br />
android.R.layout.two_line_list_item,<br />
new String[] { DATA_TITLE, DATA_LINK },<br />
) hup://en.wlklpedla.org/wlkl/llnal_28!ava29
:9 !"#$% '()#%*)
new int[] { android.R.id.text1, android.R.id.text2 });<br />
ListView lv = (ListView) hndViewById(R.id.lstData);<br />
lv.setAdapter(sAdapter);<br />
}<br />
nuesLro ob[euvo nal es Lomar una vlsLa (LlsLvlew) creada en el dlseno y poblarla de daLos a Lraves de
un adapLador . La lnformacln que represenLaremos por cada la del llsLado es el uLulo del aruculo y
el llnk del mlsmo. ara nuesLro caso vamos a uullzar el adapLador slmple (SlmpleAdapLer) que reclbe 3
parmeLros.
1 | un conLexLo sobre el cual puede Lraba[ar, lo obLenemos llamando a getApplicationCon-
text()
2 | un LlsLado de mapas con la daLa a mosLrar, lo reclblmos como parmeLro en la funcln.
3 | un LayouL para cada la, en esLe caso usaremos uno de los predeLermlnados de Androld llamado
android.R.layout.two_line_list_item esLe nos permlLe Lener elemenLos con lnfor-
macln en 2 llneas.
4 | un arreglo de String con las llaves del dlcclonarlo que represenLarn los daLos obLenldos de la
llsLa especlcada anLerlormenLe.
5 | un arreglo de int con los ldenucadores de los elemenLos de cada llnea.
Con esLa conguracln, el adapLador nos dar elemenLos de 2 llneas mosLrando en la prlmera el uLulo
del aruculo y en la segunda el llnk del aruculo. LsLa conguracln resulLa muy uul porque Lodo esL
hecho, sln embargo no es personallzable, sl queremos camblar algunas cosas (fondo, color, leLra, eLc) de
cada elemenLo serla necesarlo agregar oLro layouL para cada la y sl deseamos mosLrar ms lnforma-
cln o no uullzar una llsLa de mapas enLonces serla necesarlo hacer nuesLro proplo adapLador (esLo lo
haremos en prxlmos caplLulos).
Carga de datos
La carga de daLos nos Lomar clerLo uempo, vamos a mosLrarle un avlso de que los daLos se esLn
cargando. Cueremos que el avlso se muesLre y como Larea de fondo cargue los daLos (esLo nC es un
servlclo) vamos a neceslLar de un >&*% #) )?)5.5&7"
1
que haga esLa Larea.
) hup://download.oracle.com/[avase/1.3.0/docs/apl/[ava/lang/1hread.hLml
:@ !"#$% '()#%*)
Androld nos presenLa la resLrlcclones que no podemos alLerar, los elemenLos de lnLerfaz grca en un
hllo de e[ecucln que no sea el prlnclpal por lo que es necesarlo uullzar un mane[ador para envlar un
mensa[e de un hllo a oLro cuando la carga de daLos haya Lermlnado. Agregaremos enLonces una varlable
para el dllogo de progreso es necesarla una varlable global porque lnlclamos el dllogo en una funcln
y lo oculLamos en oLra.
<br />
private ProgressDialog progressDialog;<br />
CLra para el mane[ador de mensa[es enLre hllos de e[ecucln:
<br />
private hnal Handler progressHandler = new Handler() {<br />
@SuppressWarnings(unchecked)<br />
public void handleMessage(Message msg) {<br />
if (msg.obj != null) {<br />
data = (LinkedList<HashMap<String, String>>)msg.obj;<br />
setData(data);<br />
}<br />
:; !"#$% '()#%*)
progressDialog.dismiss();<br />
}<br />
};<br />
ara el mane[ador, haremos una 5*,/) &"-)$", : ,"7"&@,
1
esLe upo de clases las vern seguldo para
agregar funclonalldades que requleren de clases pero su Larea es Lan pequena que no vale la pena darle
un nombre (y luego Lermlnar con muchos nombres que se uullzan una sola vez).
C"'8#- :" 2> 62>$" Handler hemos agregado la anoLacln @SuppressWarnings(`unchecked")
para evlLar una adverLencla por la conversln de upo (Lype casting) de ob[eLo hacla llsLa reallzada
adelanLe. Ls necesarlo lmplemenLar el meLodo handleMessage(Message msg) y es aqul donde
revlsamos sl vlene un mensa[e, lo converumos a llsLa, llamamos al meLodo setData prevlamenLe de-
nldo y cerramos el dllogo de progreso.
or ulumo, vamos a hacer una funcln auxlllar que lnlcla la carga de daLos, muesLra al usuarlo un dllogo
de que se esLn cargando los daLos y levanLa un Lhread para lograr la carga.
<br />
private void loadData() {<br />
ProgressDialog progressDialog = ProgressDialog.show(<br />
Main.this,<br />
,<br />
Por favor espere mientras se cargan los datos...,<br />
true);</p>
<p> new Thread(new Runnable(){<br />
@Override<br />
public void run() {<br />
XMLParser parser = new XMLParser(feedUrl);<br />
Message msg = progressHandler.obtainMessage();<br />
msg.obj = parser.parse();<br />
progressHandler.sendMessage(msg);<br />
}}).start();<br />
) hup://www.google.com/url?q=hup3A2l2ldownload.oracle.com2l[avase2lLuLorlal2l[ava2l[avaCC2lln
nerclasses.hLml&sa=u&snLz=1&usg=AlC[CnLblcvxlduxasA08g3Lu01_7LuPfA
:< !"#$% '()#%*)
}<br />
ara el dllogo de progreso, le envlamos 4 argumenLos:
1 | ConLexLo, dado por la apllcacln, como esLa funcln la vamos a llamar desde una clase lnLerna,
el acceso es con el campo Lhls de la clase Maln.
2 | 1lLulo, no nos lnLeresa que Lenga uLulo el avlso.
3 | Mensa[e, le pedlmos al usuarlo que espere.
4 | lndeLermlnado, no se puede cuanucar cuanLo uempo falLa o cuanLo progreso se ha logrado
enLonces el avlso ser de duracln lndeLermlnada.
Luego Lenemos un 1hread a parur de oLra clase lnLerna y annlma que es una lnsLancla de 8unnable y
denlmos el meLodo run donde se especlca lo que har el hllo de e[ecucln y llamamos al meLodo sLarL
para lnlclarlo. Ln el meLodo run lnsLanclamos un parser nuevo de xML consLrulmos un mensa[e a parur
del mane[ador y se lo envlamos con la daLa obLenlda del parser.
Llamando todo desde la funcin onCreate
1raba[emos denLro de la funcln onCreaLe la cual se llama cuando la acuvldad es creada, prlmero le
ponemos un bonlLo uLulo a la venLana.
<br />
setTitle(Lector de feeds Auala 7 Programacin);<br />
Ll slgulenLe paso es asoclarle una accln al boLn para que cargue los daLos, prlmero obLenemos el
boLn haclendo uso de la funcln ndvlew8yld con el ldenucador colocado en el dlseno para posLe-
rlormenLe colocarle las acclones a reallzar cuando se preslone a Lraves del meLodo seLCnCllckLlsLe-
ner. LsLe meLodo reclbe una lnsLancla de la clase CnCllckLlsLener, de nuevo vamos a hacer una clase
annlma y sobrecargaremos el meLodo onCllck.
<br />
Button btn = (Button) hndViewById(R.id.btnLoad);<br />
btn.setOnClickListener(new OnClickListener() {<br />
@Override<br />
public void onClick(View v) {<br />
:= !"#$% '()#%*)
}<br />
});<br />
uenLro de la funcln onClick 1>2%:>#"9-$ $% "2 ListView ya uene daLos, sl no los uene los carga-
9-$ 6-' ,'> 22>9>:> > loadData pero sl ya los uene vamos a mosLrarle un dllogo de alerLa al usua-
rlo pregunLando sl esL seguro que desea hacerlo.
<br />
ListView lv = (ListView) hndViewById(R.id.lstData);<br />
if (lv.getAdapter() != null) {<br />
AlertDialog.Builder builder = new AlertDialog.Builder(Main.this);<br />
builder.setMessage(ya ha cargado datos, Est seguro de hacerlo de
nuevo?)<br />
.setCancelable(false)<br />
.setPositiveButton(Si, new DialogInterface.OnClickListener()
{<br />
public void onClick(DialogInterface dialog, int
id) {<br />
loadData();<br />
}<br />
})<br />
.setNegativeButton(No, new DialogInterface.OnClickListener()
{<br />
public void onClick(DialogInterface dialog, int
id) {<br />
dialog.cancel();<br />
}<br />
})<br />
.create()<br />
.show();<br />
} else {<br />
loadData();<br />
}<br />
:> !"#$% '()#%*)
ara crear el dllogo de alerLa, encadenamos llamadas a parur de un consLrucLor AlertDialog.
Builder que reclbe un conLexLo y de nuevo uullzamos Main.this.
LsLas llamadas encadenadas nos permlLen:

LsLablecer un mensa[e (seLMessage)

Cbllgar al usuarlo a responder y no solo cerrar (seLCancelable)

Colocar una accln cuando la respuesLa es posluva (seLosluve8uuon)

Colocar una accln cuando la respuesLa es negauva (seLnegauve8uuon)

Crear el dllogo (creaLe)

MosLrar el dllogo (show)
Las ms compllcadas son las llamadas para colocar acclones anLe una respuesLa posluva o negauva.
Ambas requleren de un LlsLener que se dlsparara cuando el usuarlo preslone el boLn. uenLro del
meLodo onClick de oLra clase annlma ms, cuando es posluvo llamamos a loadData y cuando es
negauvo oculLamos el dllogo.
Ll cdlgo compleLo queda de esLa forma:
<br />
Button btn = (Button) hndViewById(R.id.btnLoad);<br />
btn.setOnClickListener(new OnClickListener() {<br />
@Override<br />
public void onClick(View v) {<br />
ListView lv = (ListView) hndViewById(R.id.lstData);<br />
if (lv.getAdapter() != null) {<br />
AlertDialog.Builder builder = new
AlertDialog.Builder(Main.this);<br />
builder.setMessage(ya ha cargado datos, Est seguro de hacerlo de
nuevo?)<br />
.setCancelable(false)<br />
.setPositiveButton(Si, new
DialogInterface.OnClickListener() {<br />
public void onClick(DialogInterface
!? !"#$% '()#%*)
dialog, int id) {<br />
loadData();<br />
}<br />
})<br />
.setNegativeButton(No, new
DialogInterface.OnClickListener() {<br />
public void onClick(DialogInterface
dialog, int id) {<br />
dialog.cancel();<br />
}<br />
})<br />
.create()<br />
.show();<br />
} else {<br />
loadData();<br />
}<br />
}<br />
});<br />
ara Lermlnar, queremos aprovechar que conLamos con el llnk de cada aruculo y que cuando el usuarlo
preslone algun elemenLo en nuesLra apllcacln pueda vlslLarse el aruculo vla el navegador.
<br />
ListView lv = (ListView) hndViewById(R.id.lstData);<br />
lv.setOnItemClickListener(new OnItemClickListener() {<br />
@Override<br />
public void onItemClick(AdapterView<?> av, View v, int position, long
id){<br />
HashMap<String, String> entry = data.get(position);<br />
Intent browserAction = new Intent(Intent.ACTION_VIEW,<br />
Uri.parse(entry.get(DATA_LINK)));<br />
startActivity(browserAction);<br />
}<br />
});<br />
!: !"#$% '()#%*)
LsLo lo consegulmos modlcando el evenLo de cllck sobre los lLems de la llsLa (seLCnlLemCllckLlsLener)
prlmero obLenlendo el elemenLo que ha sldo preslonado y luego con un lnLenL de !A;0BCD10EF
1
"$8"
lnLenL predenldo reallza la accln ms obvla para mosLrar daLos al usuarlo, en nuesLro caso se le env|a
." GH0
2
lo que permlLe vlsuallzarlo con el navegador.
) hup://developer.androld.com/reference/androld/conLenL/lnLenL.hLml#AC1lCn_vlLW
. hup://developer.androld.com/reference/androld/neL/url.hLml
!! !"#$% '()#%*)
Conclusin
Ln esLa gula hemos vlsLo varlas cosas:

!$I.&-)5-.$, #) !"#$%&#: conoclmos la forma en que esL consLrulda la arqulLecLura.

J*%I.)/ 8K/&5%/ #) .", ,L*&5,5&7": los elemenLos prlnclpales de una apllcacln de Androld.

3,"&4)/-: aprendlmos la forma y la ublcacln del manlfesL, archlvo para conguracln de la apll-
cacln.

L|nearLayout, 1extV|ew y 8uuon: Luvlmos un prlmer acercamlenLo a los elemenLos de la ul a
Lraves de esLos 3 conLroles, una forma de mane[ar el dlseno (layouL) y dos conLroles para la lnLer-
faz de la apllcacln.

Lventos CnC||ck: aprendlmos a mane[ar los evenLos con llsLeners y asoclar acclones para cuando
el usuarlo lnLeracLua con los elemenLos de la ul.

M&,*%6/: lnlclamos a Lraba[ar con dllogos para mosLrar avlsos al usuarlo, en esLe caso unlcamenLe
de conrmacln prevlo a la carga de daLos.

;>$),#/ : N,"#*)$/: el proceso de la carga y parslng de daLos fue reallzado con un Lhread exLra y
para la comunlcacln con el Lhread prlnclpal uullzamos un Message Pandler.

In|c|ar otras acnv|nes: aprendlmos el mecanlsmo necesarlo para lnlclar oLras acuvlues aun que no
fueran hechas por nosoLros.

También podría gustarte