Sunteți pe pagina 1din 401

The Busy Coder's Guide to Android Development

by Mark L. Murphy

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

The Busy Coder's Guide to Android Development by Mark L. Murphy Copyright 2008 CommonsWare, LLC. All Rights Reserve . !rinte in the "nite #tates o$ Ameri%a. CommonsWare books may be pur%hase in printe &bulk' or igital $orm $or e u%ational or business use. (or more in$ormation, %onta%t direct@commonsware.com. !rinting )istory* #ep 2008* +ersion ,.2 -#./* 01820208,31802020 relate tra e ress are

4he CommonsWare name an logo, 5.usy Co er6s 7ui e8, an tra emarks o$ CommonsWare, LLC.

All other tra emarks re$eren%e in this book are tra emarks o$ their respe%tive $irms. 4he publisher an author&s' assume no responsibility $or errors or omissions or $or amages resulting $rom the use o$ the in$ormation %ontaine herein.

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Table of Contents

Welcome to the Warescription!..................................................................................xiii Preface..........................................................................................................................xv Wel%ome to the .ook9...........................................................................................................:v !rere;uisites..........................................................................................................................:v Wares%ription.......................................................................................................................:vi .ook .ug .ounty.................................................................................................................:vii #our%e Co e Li%ense..........................................................................................................:viii Creative Commons an the (our2to2(ree &<2(' 7uarantee............................................:viii A%kno=le gements............................................................................................................:viii The Bi Picture................................................................................................................! What An roi s Are Ma e >$.................................................................................................? A%tivities...........................................................................................................................? Content !rovi ers...........................................................................................................< -ntents..............................................................................................................................< #ervi%es.............................................................................................................................< #tu$$ At @our Aisposal.............................................................................................................B #torage..............................................................................................................................B /et=ork............................................................................................................................B Multime ia.......................................................................................................................B 7!#...................................................................................................................................B !hone #ervi%es.................................................................................................................3 Pro"ect #tructure............................................................................................................$ Root Contents..........................................................................................................................1
iii
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

4he #=eat >$$ @our .ro=.......................................................................................................8 An /o=, 4he Rest o$ the #tory.............................................................................................8 What @ou 7et >ut >$ -t.........................................................................................................0 %nside the &anifest........................................................................................................!! -n 4he .eginning, 4here Was the Root, An -t Was 7oo .................................................,, !ermissions, -nstrumentations, an Appli%ations &>h, My9'.............................................,2 @our Appli%ation Aoes #omething, RightC..........................................................................,? Creatin a #'eleton Application...................................................................................!$ .egin at the .eginning...........................................................................................................,1 4he A%tivity............................................................................................................................,8 Aisse%ting the A%tivity...........................................................................................................,0 .uil ing an Running the A%tivity.......................................................................................2, (sin )&*+Based *ayouts............................................................................................,What -s an DML2.ase LayoutC...........................................................................................2B Why "se DML2.ase LayoutsC............................................................................................23 >E, #o What Aoes -t Look LikeC..........................................................................................21 What6s With the F #ignsC....................................................................................................28 An We Atta%h 4hese to the Gava...)o=C...........................................................................28 4he Rest o$ the #tory.............................................................................................................20 .mployin Basic Wid ets..............................................................................................// Assigning Labels....................................................................................................................?? .utton, .utton, Who6s 7ot the .uttonC..............................................................................?< (leeting -mages......................................................................................................................?B (iel s o$ 7reen. >r >ther Colors.........................................................................................?3 Gust Another .o: to Che%k...................................................................................................?0 4urn the Ra io "p................................................................................................................<2 -t6s Huite a +ie=....................................................................................................................<< "se$ul !roperties...........................................................................................................<< "se$ul Metho s.............................................................................................................<< Wor'in 0ith Containers.............................................................................................1$ 4hinking Linearly..................................................................................................................<8 Con%epts an !roperties...............................................................................................<8 I:ample...........................................................................................................................B,

iv
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

All 4hings Are Relative.........................................................................................................B3 Con%epts an !roperties...............................................................................................B3 I:ample..........................................................................................................................B0 4abula Rasa............................................................................................................................32 Con%epts an !roperties...............................................................................................32 I:ample..........................................................................................................................3B #%roll=ork..............................................................................................................................33 (sin #election Wid ets...............................................................................................$! A apting to the Cir%umstan%es............................................................................................1, "sing ArrayA apter.......................................................................................................12 >ther Eey A apters.......................................................................................................1? Lists o$ /aughty an /i%e....................................................................................................1< #pin Control...........................................................................................................................13 7ri @our Lions &>r #omething Like 4hat...'.....................................................................80 (iel s* /o= With ?BJ Less 4yping9....................................................................................8< 7alleries, 7ive >r 4ake 4he Art...........................................................................................88 Gettin 2ancy With *ists..............................................................................................34 7etting 4o (irst .ase............................................................................................................80 A Aynami% !resentation.......................................................................................................02 A #i ebar About -n$lation.............................................................................................0< An /o=, .a%k 4o >ur #tory.......................................................................................0< .etter. #tronger. (aster.........................................................................................................0B "sing %onvert+ie=........................................................................................................03 "sing the )ol er !attern.............................................................................................08 Making a List.........................................................................................................................,0, ...An Che%king -t 4=i%e.....................................................................................................,01 .mployin 2ancy Wid ets and Containers..................................................................!!!i%k an Choose....................................................................................................................,,B 4ime Eeeps (lo=ing Like a River........................................................................................,20 Making !rogress....................................................................................................................,2, !utting -t >n My 4ab...........................................................................................................,22 4he !ie%es.....................................................................................................................,2? 4he - iosyn%rasies........................................................................................................,2?

v
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Wiring -t 4ogether.......................................................................................................,2B >ther Containers o$ /ote....................................................................................................,28 Applyin &enus...........................................................................................................!,4 (lavors o$ Menu....................................................................................................................,20 Menus o$ >ptions................................................................................................................,?0 Menus in Conte:t.................................................................................................................,?2 4aking a !eek........................................................................................................................,?? .m5eddin the We56it Bro0ser.................................................................................!1! A .ro=ser, Writ #mall..........................................................................................................,<, Loa ing -t "p........................................................................................................................,<? /avigating the Waters.........................................................................................................,<B Intertaining the Client........................................................................................................,<3 #ettings, !re$eren%es, an >ptions &>h, My9'...................................................................,<8 #ho0in Pop+(p &essa es..........................................................................................!-! Raising 4oasts........................................................................................................................,B, Alert9 Alert9...........................................................................................................................,B2 Che%king 4hem >ut.............................................................................................................,B? Dealin 0ith Threads..................................................................................................!-$ 7etting 4hrough the )an lers............................................................................................,B1 Messages.......................................................................................................................,B8 Runnables......................................................................................................................,3, Running -n !la%e...................................................................................................................,3, Where, >h Where )as My "- 4hrea 7oneC....................................................................,32 An /o=, 4he Caveats........................................................................................................,32 7andlin Activity *ifecycle .vents.............................................................................!8#%hroe inger6s A%tivity........................................................................................................,3B Li$e, Aeath, an @our A%tivity............................................................................................,33 onCreate&' an onAestroy&'........................................................................................,33 on#tart&', onRestart&', an on#top&'..........................................................................,31 on!ause&' an onResume&'.........................................................................................,31 4he 7ra%e o$ #tate................................................................................................................,38 (sin Preferences........................................................................................................!$/ 7etting What @ou Want......................................................................................................,1?

vi
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

#tating @our !re$eren%e.......................................................................................................,1< An /o=, a Wor (rom >ur (rame=ork..........................................................................,1B Letting "sers )ave 4heir #ay..............................................................................................,13 A ing a Wee .it >6 #tru%ture............................................................................................,8, 4he Ein >$ !op2"ps @ou Like..........................................................................................,8< Accessin 2iles.............................................................................................................!34 @ou An 4he )orse @ou Ro e -n >n.................................................................................,80 Rea in6 6n Writin6.................................................................................................................,0? Wor'in 0ith 9esources.............................................................................................!4$ 4he Resour%e Lineup...........................................................................................................,01 #tring 4heory.......................................................................................................................,08 !lain #trings.................................................................................................................,08 #tring (ormats..............................................................................................................,00 #tyle 4e:t....................................................................................................................,00 #tyle (ormats.............................................................................................................200 7ot the !i%tureC...................................................................................................................20< DML* 4he Resour%e Way....................................................................................................201 Mis%ellaneous +alues..........................................................................................................200 Aimensions...................................................................................................................2,0 Colors............................................................................................................................2,0 Arrays.............................................................................................................................2,, Ai$$erent #trokes $or Ai$$erent (olks..................................................................................2,2 &ana in and Accessin *ocal Data5ases..................................................................,!$ A Hui%k #HLite !rimer........................................................................................................2,8 #tart at the .eginning..........................................................................................................2,0 #etting the 4able.................................................................................................................220 Makin6 Aata..........................................................................................................................22, What 7oes Aroun , Comes Aroun ..................................................................................222 Ra= Hueries.................................................................................................................222 Regular Hueries...........................................................................................................22? .uil ing =ith .uil ers.................................................................................................22< "sing Cursors...............................................................................................................22B Making @our >=n Cursors.........................................................................................223

vii
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Aata, Aata, Ivery=here......................................................................................................223 *evera in :ava *i5raries............................................................................................,,4 4he >uter Limits.................................................................................................................220 Ants an Gars........................................................................................................................2?0 (ollo=ing the #%ript.............................................................................................................2?, Communicatin via the %nternet................................................................................,/$ RI#4 an Rela:ation...........................................................................................................2?1 )44! >perations via Apa%he )ttpComponents......................................................2?8 !arsing Responses.......................................................................................................2<0 #tu$$ 4o Consi er.........................................................................................................2<2 Creatin %ntent 2ilters................................................................................................,1$ What6s @our -ntentC............................................................................................................2<8 !ie%es o$ -ntents..........................................................................................................2<8 -ntent Routing.............................................................................................................2<0 #tating @our -ntent&ions'....................................................................................................2B0 /arro= Re%eivers.................................................................................................................2B2 4he !ause Caveat.................................................................................................................2B? *aunchin Activities and #u5+Activities.....................................................................,-!eers an #ubs.....................................................................................................................2B3 #tart 6Im "p.........................................................................................................................2B3 Make an -ntent.............................................................................................................2B1 Make the Call...............................................................................................................2B1 2indin Availa5le Actions via %ntrospection..............................................................,8/ !i%k 6Im...............................................................................................................................23< Woul @ou Like to #ee the MenuC....................................................................................238 Asking Aroun .....................................................................................................................210 (sin a Content Provider............................................................................................,$/ !ie%es o$ Me.........................................................................................................................21? 7etting a )an le.................................................................................................................21< Makin6 Hueries.....................................................................................................................21B A apting to the Cir%umstan%es..........................................................................................211 Aoing -t .y )an .................................................................................................................218 !osition........................................................................................................................210

viii
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

7etting !roperties.......................................................................................................210 7ive an 4ake......................................................................................................................210 .e=are o$ the .L>.9............................................................................................................28, Buildin a Content Provider.......................................................................................,3/ (irst, #ome Aisse%tion.........................................................................................................28? /e:t, #ome 4yping..............................................................................................................28< #tep K,* Create a !rovi er Class..........................................................................................28B onCreate&'....................................................................................................................28B ;uery&'..........................................................................................................................283 insert&'..........................................................................................................................288 up ate&'........................................................................................................................280 elete&'.........................................................................................................................200 get4ype&'.......................................................................................................................20, #tep K2* #upply a "ri...........................................................................................................202 #tep K?* Ae%lare the !roperties..........................................................................................202 #tep K<* "p ate the Mani$est.............................................................................................20? /oti$y2>n2Change #upport................................................................................................20< 9e;uestin and 9e;uirin Permissions.....................................................................,4$ Mother, May -C....................................................................................................................208 )alt9 Who 7oes 4hereC......................................................................................................200 In$or%ing !ermissions via the Mani$est....................................................................?00 In$or%ing !ermissions Ilse=here...............................................................................?0, May - #ee @our Ao%umentsC...............................................................................................?02 Creatin a #ervice......................................................................................................../</ #ervi%e =ith Class................................................................................................................?0< When -!C Atta%ks9..............................................................................................................?03 Write the A-AL............................................................................................................?03 -mplement the -nter$a%e.............................................................................................?08 Mani$est Aestiny.................................................................................................................?00 Lobbing >ne >ver the (en%e.............................................................................................?00 Where6s the RemoteC An the Rest o$ the Co eC...............................................................?,, %nvo'in a #ervice......................................................................................................../!/ .oun $or #u%%ess................................................................................................................?,<

ix
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Re;uest $or #ervi%e...............................................................................................................?,3 !rometheus "nboun .........................................................................................................?,3 Manual 4ransmission..........................................................................................................?,3 Cat%hing the Lob..................................................................................................................?,1 Alertin (sers =ia >otifications................................................................................../,! 4ypes o$ !estering................................................................................................................?2, )ar =are /oti$i%ations...............................................................................................?22 -%ons..............................................................................................................................?22 #eeing !estering in A%tion..................................................................................................?2? Accessin *ocation+Based #ervices............................................................................./,4 Lo%ation !rovi ers* 4hey Eno= Where @ou6re )i ing....................................................??0 (in ing @oursel$...................................................................................................................??0 >n the Move........................................................................................................................??2 Are We 4here @etC Are We 4here @etC Are We 4here @etC.............................................??? 4esting...4esting...................................................................................................................??B (ee Me9 #ee More9......................................................................................................??B Making a Mo%kery o$ the #ituation............................................................................??1 Changing Weather !atterns........................................................................................??8 &appin 0ith &ap=ie0 and &apActivity.................................................................../1! 4he .are .ones.....................................................................................................................?<, I:er%ising @our Control......................................................................................................?<? Loom.............................................................................................................................?<< Center...........................................................................................................................?<B Rugge 4errain....................................................................................................................?<3 Layers "pon Layers.............................................................................................................?<3 >verlay Classes............................................................................................................?<1 Ara=ing the -temiMe >verlay....................................................................................?<1 )an ling #%reen 4aps.................................................................................................?<0 7andlin Telephone Calls.........................................................................................../-! Report 4o 4he Manager......................................................................................................?B2 @ou Make the Call9..............................................................................................................?B2 #earchin 0ith #earch&ana er.................................................................................../-$ )unting #eason....................................................................................................................?B1

x
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

#ear%h @oursel$....................................................................................................................?B0 Cra$t the #ear%h A%tivity.............................................................................................?30 "p ate the Mani$est....................................................................................................?3< #ear%hing $or Meaning -n Ran omness.............................................................................?3B

xi
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Welcome to the Warescription!

We hope you enNoy this ebook an its up ates O subs%ribe to the Wares%ription ne=sletter on the Wares%ription site to learn =hen ne= e itions o$ this book, or other books, are available. All e itions o$ CommonsWare titles, print an ebook, $ollo= a so$t=are2 style numbering system. MaNor releases &,.0, 2.0, et%.' are available in both print an ebookP minor releases &0.,, 0.0, et%.' are available in ebook $orm $or Wares%ription subs%ribers only. Releases en ing in .0 are Qrelease %an i atesQ $or the ne:t maNor release, la%king perhaps an in e: but other=ise being %omplete. Ia%h Wares%ription ebook is li%ense $or the e:%lusive use o$ its subs%riber an is tagge =ith the subs%ribers name. We ask that you not istribute these books. -$ you =ork $or a $irm an =ish to have several employees have a%%ess, enterprise Wares%riptions are available. Gust %onta%t us at enterpriseF%ommons=are.%om. Also, bear in min that eventually this e ition o$ this title =ill be release un er a Creative Commons li%ense O more on this in the pre$a%e. Remember that the CommonsWare Web site has errata an resour%es &e.g., sour%e %o e' $or ea%h o$ our titles. Gust visit the Web page $or the book you are intereste in an $ollo= the links. #ome notes $or Ein le users*

xiii
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ou may =ish to rop your $ont siMe to level 2 $or easier rea ing #our%e %o e listings are in%orporate as graphi%s so as to retain the monospa%e $ont, though this means the sour%e %o e listings o not honor %hanges in Ein le $ont siMe

xiv
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Preface

Welcome to the Book!


4hanks9 4hanks $or your interest in eveloping appli%ations $or An roi 9 -n%reasingly, people =ill a%%ess -nternet2base servi%es using so2%alle Qnon2tra itionalQ means, su%h as mobile evi%es. 4he more =e o in that spa%e no=, the more that people =ill help invest in that spa%e to make it easier to buil more po=er$ul mobile appli%ations in the $uture. An roi is ne= O at the time o$ this =riting, there are no shipping An roi 2po=ere evi%es O but it likely =ill rapi ly gro= in importan%e ue to the siMe an s%ope o$ the >pen )an set Allian%e. An , most o$ all, thanks $or your interest in this book9 - sin%erely hope you $in it use$ul an at least o%%asionally entertaining.

Prerequisites
-$ you are intereste in programming $or An roi , you =ill nee at least basi% un erstan ing o$ ho= to program in Gava. An roi programming is one using Gava synta:, plus a %lass library that resembles a subset o$ the Gava #I library &plus An roi 2spe%i$i% e:tensions'. -$ you have not programme in Gava be$ore, you probably shoul ;ui%k learn ho= that =orks be$ore attempting to ive into programming $or An roi .

xv
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

4he book oes not %over in any etail ho= to o=nloa or install the An roi evelopment tools, either the I%lipse -AI $lavor or the stan alone $lavor. 4he An roi Web site %overs this ;uite ni%ely. 4he material in the book shoul be relevant =hether you use the -AI or not. @ou shoul o=nloa , install, an test out the An roi evelopment tools $rom the An roi Web site be$ore trying any o$ the e:amples liste in this book. #ome %hapters may re$eren%e material in previous %hapters, though usually =ith a link ba%k to the pre%e ing se%tion o$ relevan%e.

Warescription
4his book =ill be publishe both in print an in igital &ebook' $orm. 4he ebook versions o$ all CommonsWare titles are available via an annual subs%ription O the Wares%ription. 4he Wares%ription entitles you, $or the uration o$ your subs%ription, to ebook $orms o$ all CommonsWare titles, not Nust the one you are rea ing. !resently, CommonsWare o$$ers !A( an Ein leP other ebook $ormats =ill be a e base on interest an the openness o$ the $ormat. Ia%h subs%riber gets personaliMe e itions o$ all e itions o$ ea%h title* both those mirroring printe e itions an in2bet=een up ates that are only available in ebook $orm. 4hat =ay, your ebooks are never out o$ ate $or long, an you %an take a vantage o$ ne= material as it is ma e available instea o$ having to =ait $or a =hole ne= print e ition. (or e:ample, =hen ne= releases o$ the An roi #AE are ma e available, this book =ill be ;ui%kly up ate to be a%%urate =ith %hanges in the A!-s. (rom time to time, subs%ribers =ill also re%eive a%%ess to subs%riber2only online material, both short arti%les an not2yet2publishe ne= titles. Also, i$ you o=n a print %opy o$ a CommonsWare book, an it is in goo %lean %on ition =ith no marks or sti%kers, you %an e:%hange that %opy $or a is%ount o$$ the Wares%ription pri%e. -$ you are intereste in a Wares%ription, visit the Wares%ription se%tion o$ the CommonsWare Web site.
xvi
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Book Bug Bounty


(in a problem in one o$ our booksC Let us kno=9 .e the $irst to report a uni;ue %on%rete problem, an =e6ll give you a %oupon $or a si:2month Wares%ription as a bounty $or helping us eliver a better pro u%t. @ou %an use that %oupon to get a ne= Wares%ription, rene= an e:isting Wares%ription, or give the %oupon to a $rien , %olleague, or some ran om person you meet on the sub=ay. .y Q%on%reteQ problem, =e mean things like*

4ypographi%al errors #ample appli%ations that o not =ork as a vertise , in the environment es%ribe in the book (a%tual errors that %annot be open to interpretation

.y Quni;ueQ, =e mean ones not yet reporte . Ia%h book has an errata page on the CommonsWare Web siteP most kno=n problems =ill be liste there. We appre%iate hearing about Qso$terQ issues as =ell, su%h as*

!la%es =here you think =e are in error, but =here =e $eel our interpretation is reasonable !la%es =here you think =e %oul a upon the e:isting material sample appli%ations, or e:pan

#amples that o not =ork ue to Qshi$ting san sQ o$ the un erlying environment &e.g., %hange A!-s =ith ne= releases o$ an #AE'

)o=ever, those Qso$terQ issues o not ;uali$y $or the $ormal bounty program. Huestions about the bug bounty, or problems you =ish to report $or bounty %onsi eration, shoul be sent to bountyF%ommons=are.%om.

xvii
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Source Code icense


4he sour%e %o e samples sho=n in this book are available $or o=nloa $rom the CommonsWare Web site. All o$ the An roi proNe%ts are li%ense un er the Apa%he 2.0 Li%ense, in %ase you have the esire to reuse any o$ it.

Creative Commons and the !our"to"!ree #$%!& 'uarantee


Ia%h CommonsWare book e ition =ill be available $or use un er the Creative Commons Attribution2/on%ommer%ial2#hare Alike ?.0 li%ense as o$ the $ourth anniversary o$ its publi%ation ate, or =hen <,000 %opies o$ the e ition have been sol , =hi%hever %omes $irst. 4hat means that, on%e $our years have elapse &perhaps sooner9', you %an use this prose $or non2 %ommer%ial purposes. 4hat is our (our2to2(ree 7uarantee to our rea ers an the broa er %ommunity. (or the purposes o$ this guarantee, ne= Wares%riptions an rene=als =ill be %ounte as sales o$ this e ition, starting $rom the time the e ition is publishe . 4his e ition o$ this book =ill be available un er the a$orementione Creative Commons li%ense on :uly !? ,<!,. >$ %ourse, =at%h the CommonsWare Web site, as this e ition might be reli%ense sooner base on sales. (or more etails on the Creative Commons Attribution2/on%ommer%ial2 #hare Alike ?.0 li%ense, visit the Creative Commons Web site. /ote that $uture e itions o$ this book =ill be%ome $ree on later ates, ea%h $our years $rom the publi%ation o$ that e ition or base on sales o$ that spe%i$i% e ition. Releasing one e ition un er the Creative Commons li%ense oes not automati%ally release all e itions un er that li%ense.

(ckno)ledgments
- =oul like to thank the An roi team, not only $or putting out a goo pro u%t, but $or invaluable assistan%e on the An roi 7oogle 7roups. -n parti%ular, - =oul like to thank Romain 7uy an ha%kbo .
xviii
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

-%ons use in the sample %o e =ere provi e by the /uvola i%on set.

xix
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

PART I Core Concepts

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 1

The Big Picture

An roi evi%es, by an large, =ill be mobile phones. While the An roi te%hnology is being is%usse $or use in other areas &e.g., %ar ashboar Q!CsQ', $or the most part, you %an think o$ An roi as being use on phones. (or evelopers, this has bene$its an ra=ba%ks.

>n the plus si e, %ir%a 2008, An roi 2style smartphones are se:y. >$$ering -nternet servi%es over mobile evi%es ates ba%k to the mi 2,0006s an the )an hel Aevi%e Markup Language &)AML'. )o=ever, only in re%ent years have phones %apable o$ -nternet a%%ess taken o$$. /o=, thanks to tren s like te:t messaging an to pro u%ts like Apple6s i!hone, phones that %an serve as -nternet a%%ess evi%es are rapi ly gaining popularity. #o, =orking on An roi appli%ations gives you e:perien%e =ith an interesting te%hnology &An roi ' in a $ast2moving market segment &-nternet2enable phones', =hi%h is al=ays a goo thing. 4he problem %omes =hen you a%tually have to program the arn things. Anyone =ith e:perien%e in programming $or !AAs or phones has $elt the pain o$ phones simply being small in all sorts o$ imensions*

#%reens are small &you =on6t get %omments like, Qis that a 2<2in%h LCA in your po%ket, or...CQ' Eeyboar s, i$ they e:ist, are small
*

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

The Big Picture

!ointing evi%es, i$ they e:ist, are annoying &as anyone =ho has lost their stylus =ill tell you' or ine:a%t &large $ingers an Qmulti2tou%hQ LCAs are not a goo mi:' C!" spee an memory are tight %ompare to esktops an servers you may be use to @ou %an have any programming language an evelopment $rame=ork you =ant, so long as it =as =hat the evi%e manu$a%turer %hose an burne into the phone6s sili%on An so on

Moreover, appli%ations running on a phone have to eal =ith the $a%t that they6re on a phone. !eople =ith mobile phones ten to get very irritate =hen those phones on6t =ork, =hi%h is =hy the Q%an you hear me no=CQ a %ampaign $rom +eriMon Wireless has been popular $or the past $e= years. #imilarly, those same people =ill get irritate at you i$ your program QbreaksQ their phone*

...by tying up the C!" su%h that %alls %an6t be re%eive ...by not =orking properly =ith the rest o$ the phone6s >#, su%h that your appli%ation oesn6t ;uietly $a e to the ba%kgroun =hen a %all %omes in or nee s to be pla%e ...by %rashing the phone6s operating system, su%h as by leaking memory like a sieve

)en%e, eveloping programs $or a phone is a i$$erent e:perien%e than eveloping esktop appli%ations, Web sites, or ba%k2en server pro%esses. @ou =in up =ith i$$erent2looking tools, i$$erent2behaving $rame=orks, an Q i$$erent than you6re use toQ limitations on =hat you %an o =ith your program. What An roi tries to o is meet you hal$=ay*

@ou get a %ommonly2use programming language &Gava' =ith some %ommonly use libraries &e.g., some Apa%he Commons A!-s', =ith support $or tools you may be use to &I%lipse'
%

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

The Big Picture

@ou get a $airly rigi an un%ommon $rame=ork in =hi%h your programs nee to run so they %an be Qgoo %itiMensQ on the phone an not inter$ere =ith other programs or the operation o$ the phone itsel$

As you might e:pe%t, mu%h o$ this book eals =ith that $rame=ork an ho= you =rite programs that =ork =ithin its %on$ines an take a vantage o$ its %apabilities.

What (ndroids (re +ade ,f


When you =rite a esktop appli%ation, you are Qmaster o$ your o=n omainQ. @ou laun%h your main =in o= an any %hil =in o=s O like ialog bo:es O that are nee e . (rom your stan point, you are your o=n =orl , leveraging $eatures supporte by the operating system, but largely ignorant o$ any other program that may be running on the %omputer at the same time. -$ you o intera%t =ith other programs, it is typi%ally through an A!-, su%h as using GA.C &or $rame=orks atop it' to %ommuni%ate =ith My#HL or another atabase. An roi has similar %on%epts, but pa%kage make phones more %rash2resistant. i$$erently, an stru%ture to

Activities
4he buil ing blo%k o$ the user inter$a%e is the activity. @ou %an think o$ an a%tivity as being the An roi analogue $or the =in o= or ialog in a esktop appli%ation. While it is possible $or a%tivities to not have a user inter$a%e, most likely your Qhea lessQ %o e =ill be pa%kage in the $orm o$ %ontent provi ers or servi%es, es%ribe belo=.

Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

The Big Picture

Content Providers
Content provi ers provi e a level o$ abstra%tion $or any ata store on the evi%e that is a%%essible by multiple appli%ations. 4he An roi evelopment mo el en%ourages you to make your o=n ata available to other appli%ations, as =ell as your o=n O buil ing a %ontent provi er lets you o that, =hile maintaining %omplete %ontrol over ho= your ata gets a%%esse .

Intents
-ntents are system messages, running aroun the insi e o$ the evi%e, noti$ying appli%ations o$ various events, $rom har =are state %hanges &e.g., an #A %ar =as inserte ', to in%oming ata &e.g., an #M# message arrive ', to appli%ation events &e.g., your a%tivity =as laun%he $rom the evi%e6s main menu'. /ot only %an you respon to intents, but you %an %reate your o=n, to laun%h other a%tivities, or to let you kno= =hen spe%i$i% situations arise &e.g., raise su%h2an 2so intent =hen the user gets =ithin ,00 meters o$ this2an 2su%h lo%ation'.

Services
A%tivities, %ontent provi ers, an intent re%eivers are all short2live an %an be shut o=n at any time. #ervi%es, on the other han , are esigne to keep running, i$ nee e , in epen ent o$ any a%tivity. @ou might use a servi%e $or %he%king $or up ates to an R## $ee , or to play ba%k musi% even i$ the %ontrolling a%tivity is no longer operating.

$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

The Big Picture

Stuff (t .our /isposal


Stor !e
@ou %an pa%kage ata $iles =ith your appli%ation, $or things that o not %hange, su%h as i%ons or help $iles. @ou also %an %arve out a small bit o$ spa%e on the evi%e itsel$, $or atabases or $iles %ontaining user2entere or retrieve ata nee e by your appli%ation. An , i$ the user supplies bulk storage, like an #A %ar , you %an rea an =rite $iles on there as nee e .

"et#or$
An roi evi%es =ill generally be -nternet2rea y, through one %ommuni%ations me ium or another. @ou %an take a vantage o$ the -nternet a%%ess at any level you =ish, $rom ra= Gava so%kets all the =ay up to a built2in WebEit2base Web bro=ser =i get you %an embe in your appli%ation.

%ultimedi
An roi evi%es have the ability to play ba%k an re%or au io an vi eo. While the spe%i$i%s may vary $rom evi%e to evi%e, you %an ;uery the evi%e to learn its %apabilities an then take a vantage o$ the multime ia %apabilities as you see $it, =hether that is to play ba%k musi%, take pi%tures =ith the %amera, or use the mi%rophone $or au io note2taking.

GPS
An roi evi%es =ill $re;uently have a%%ess to lo%ation provi ers, su%h as 7!#, that %an tell your appli%ations =here the evi%e is on the $a%e o$ the Iarth. -n turn, you %an isplay maps or other=ise take a vantage o$ the lo%ation ata, su%h as tra%king a evi%e6s movements i$ the evi%e has been stolen.

0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

The Big Picture

Phone Services
An , o$ %ourse, An roi evi%es are typi%ally phones, allo=ing your so$t=are to initiate %alls, sen an re%eive #M# messages, an everything else you e:pe%t $rom a mo ern bit o$ telephony te%hnology.

1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &

Pro2ect Structure

4he An roi buil system is organiMe aroun a spe%i$i% ire%tory tree stru%ture $or your An roi proNe%t, mu%h like any other Gava proNe%t. 4he spe%i$i%s, though, are $airly uni;ue to An roi an =hat it all oes to prepare the a%tual appli%ation that =ill run on the evi%e or emulator. )ere6s a ;ui%k primer on the proNe%t stru%ture, to help you make sense o$ it all, parti%ularly $or the sample %o e re$eren%e in this book.

3oot Contents
When you %reate a ne= An roi proNe%t &e.g., via activitycreator', you get $ive key items in the proNe%t6s root ire%tory*
AndroidManifest.xml,

=hi%h is an DML $ile es%ribing the appli%ation being built an =hat %omponents O a%tivities, servi%es, et%. O are being supplie by that appli%ation =hi%h is an Ant s%ript $or %ompiling the appli%ation an installing it on the evi%e
bin/, =hi%h hol libs/, build.xml,

s the appli%ation on%e it is %ompile

=hi%h hol s any thir 2party Gava GARs your appli%ation re;uires
src/, =hi%h hol res/,

s the Gava sour%e %o e $or the appli%ation

=hi%h hol s Qresour%esQ, su%h as i%ons, 7"- layouts, an the like, that get pa%kage =ith the %ompile Gava in the appli%ation
4

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Pro2ect Structure

=hi%h hol other stati% $iles you =ish pa%kage =ith the appli%ation $or eployment onto the evi%e

assets/,

The S)eat ,ff .our Bro)


When you %reate the proNe%t &e.g., via activitycreator', you supplie the $ully2;uali$ie %lass name o$ the QmainQ a%tivity $or the appli%ation &e.g., com.commonsware.android.SomeDemo'. @ou =ill then $in that your proNe%t6s src/ tree alrea y has the namespa%e ire%tory tree in pla%e, plus a stub Activity sub%lass representing your main a%tivity &e.g., src/com/commonsware/ android/SomeDemo.java'. @ou are =el%ome to mo i$y this $ile an a others to the src/ tree as nee e to implement your appli%ation. 4he $irst time you %ompile the proNe%t &e.g., via ant', out in the QmainQ a%tivity6s namespa%e ire%tory, the An roi buil %hain =ill %reate R.java. 4his %ontains a number o$ %onstants tie to the various resour%es you pla%e out in the res/ ire%tory tree. @ou shoul not mo i$y R.java yoursel$, letting the An roi tools han le it $or you. @ou =ill see throughout many o$ the samples =here =e re$eren%e things in R.java &e.g., re$erring to a layout6s i enti$ier via R.layout.main'.

(nd 5o)6 The 3est of the Story


@ou =ill also $in that your proNe%t has a res/ ire%tory tree. 4his hol s Qresour%esQ O stati% $iles that are pa%kage along =ith your appli%ation, either in their original $orm or, o%%asionally, in a prepro%esse $orm. #ome o$ the sub ire%tories you =ill $in or %reate un er res/ in%lu e*
res/drawable/ res/layout/

$or images &!/7, G!I7, et%.'

$or DML2base "- layout spe%i$i%ations

res/raw/ $or general2purpose $iles &e.g,. a C#+ $ile o$ a%%ount in$ormation' res/values/

$or strings, imensions, an the like

res/xml/ $or other general2purpose DML $iles you =ish to ship

7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Pro2ect Structure

We =ill %over all o$ these, an more, in later %hapters o$ this book.

What .ou 'et ,ut ,f 8t


bin/

When you %ompile your proNe%t &via ant or the -AI', the results go into the ire%tory un er your proNe%t root. #pe%i$i%ally*
bin/classes/

hol s the %ompile Gava %lasses hol s the e:e%utable %reate $rom those %ompile your appli%ation6s resour%es, pa%kage is the name o$ your appli%ation' as a

bin/classes.dex

Gava %lasses
bin/yourapp.ap_ hol s L-! $ile &=here yourapp

bin/yourapp-debug.ap or bin/yourapp-unsigned.ap is the a%tual An roi appli%ation &=here yourapp is the name o$ your appli%ation'

4he .ap $ile is a L-! ar%hive %ontaining the .dex $ile, the %ompile e ition o$ your resour%es &resources.arsc', any un2%ompile resour%es &su%h as =hat you put in res/raw/' an the AndroidManifest.xml $ile. -t is also igitally signe , =ith the -debug portion o$ the $ilename in i%ating it has been signe using a ebug key that =orks =ith the emulator, or -unsigned in i%ating that you built your appli%ation $or release &ant!release', but the A!E still nee s to be signe using jarsigner an an o$$i%ial key.

9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER '

8nside the +anifest

4he $oun ation $or any An roi appli%ation is the mani$est $ile* AndroidManifest.xml in the root o$ your proNe%t. )ere is =here you e%lare =hat all is insi e your appli%ation O the a%tivities, the servi%es, an so on. @ou also in i%ate ho= these pie%es atta%h themselves to the overall An roi systemP $or e:ample, you in i%ate =hi%h a%tivity &or a%tivities' shoul appear on the evi%e6s main menu &a.k.a., laun%her'. When you %reate your appli%ation, you =ill get a starter mani$est generate $or you. (or a simple appli%ation, o$$ering a single a%tivity an nothing else, the auto2generate mani$est =ill probably =ork out $ine, or perhaps re;uire a $e= minor mo i$i%ations. >n the other en o$ the spe%trum, the mani$est $ile $or the An roi A!- emo suite is over ,,000 lines long. @our pro u%tion An roi appli%ations =ill probably $all some=here in the mi le. Most o$ the interesting bits o$ the mani$est =ill be es%ribe in greater etail in the %hapters on their asso%iate An roi $eatures. (or e:ample, the service element =ill be es%ribe in greater etail in the %hapter on %reating servi%es. (or no=, =e Nust nee to un erstan =hat the role o$ the mani$est is an its general overall %onstru%tion.

8n The Beginning6 There Was the 3oot6 (nd 8t Was 'ood


4he root o$ all mani$est $iles is, not surprisingly, a manifest element*
**
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

8nside the +anifest

"manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!pac age$%com.commonsware.android.searc&%' ... "/manifest'

/ote the namespa%e e%laration. Curiously, the generate mani$ests only apply it on the attributes, not the elements &e.g., it6s manifest, not android#manifest'. )o=ever, that pattern =orks, so unless An roi %hanges, sti%k =ith their pattern. 4he biggest pie%e o$ in$ormation you nee to supply on the manifest! element is the pac age attribute &also %uriously not2namespa%e '. )ere, you %an provi e the name o$ the Gava pa%kage that =ill be %onsi ere the QbaseQ o$ your appli%ation. 4hen, every=here else in the mani$est $ile that nee s a %lass name, you %an Nust substitute a lea ing ot as shorthan $or the pa%kage. (or e:ample, i$ you nee e to re$er to com.commonsware.android.Snic lefrit( in this mani$est sho=n above, you %oul Nust use .Snic lefrit(, sin%e com.commonsware.android is e$ine as the appli%ation6s pa%kage.

Permissions6 8nstrumentations6 and (pplica" tions #,h6 +y!&


"n erneath the manifest element, you =ill $in *

elements, to in i%ate =hat permissions your appli%ation =ill nee in or er to $un%tion properly O see the %hapter on permissions $or more etails
uses-permission permission

elements, to e%lare permissions that a%tivities or servi%es might re;uire other appli%ations hol in or er to use your appli%ation6s ata or logi% O again, more etails are $orth%oming in the %hapter on permissions

elements, to in i%ate %o e that shoul be invoke on key system events, su%h as starting up a%tivities, $or the purposes o$ logging or monitoring
instrumentation uses-library

elements, to hook in optional An roi su%h as mapping servi%es


*%

%omponents,

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

8nside the +anifest

an application element, e$ining the guts o$ the appli%ation that the mani$est es%ribes

"manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!pac age$%com.commonsware.android%' !!"uses-permission !!!!android#name$%android.permission.A))*SS_+,)A-.,/%!/' !!"uses-permission !!!!android#name$%android.permission.A))*SS_01S%!/'! !!"uses-permission !!!!android#name$%android.permission.A))*SS_ASS.S-*D_01S%!/'! !!"uses-permission !!!!android#name$%android.permission.A))*SS_)*++_.D%!/'! !!"application' ... !!"/application' "/manifest'

-n the pre%e ing e:ample, the mani$est has uses-permission elements to in i%ate some evi%e %apabilities the appli%ation =ill nee O in this %ase, permissions to allo= the appli%ation to etermine its %urrent lo%ation. An , there is the application element, =hose %ontents =ill es%ribe the a%tivities, servi%es, an =hatnot that make up the bulk o$ the appli%ation itsel$.

.our (pplication /oes Something6 3ight:


4he real meat o$ the mani$est $ile are the %hil ren o$ the application! element. .y e$ault, =hen you %reate a ne= An roi proNe%t, you get a single activity! element*
"manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!pac age$%com.commonsware.android.s eleton%' !!!!"application' !!!!!!!!"activity!android#name$%./ow%!android#label$%/ow%' !!!!!!!!!!!!"intent-filter' !!!!!!!!!!!!!!!!"action!android#name$%android.intent.action.MA./%!/' !!!!!!!!!!!!!!!!"category!android#name$%android.intent.category.+A2/)3*R%!/' !!!!!!!!!!!!"/intent-filter' !!!!!!!!"/activity' !!!!"/application' "/manifest'

*Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

8nside the +anifest

4his element supplies android#name $or the %lass implementing the a%tivity, android#label $or the isplay name o$ the a%tivity, an &$re;uently' an intent-filter %hil element es%ribing un er =hat %on itions this a%tivity =ill be isplaye . 4he sto%k activity element sets up your a%tivity to appear in the laun%her, so users %an %hoose to run it. As =e6ll see later in this book, you %an have several a%tivities in one proNe%t, i$ you so %hoose. @ou may also have one or more receiver elements, in i%ating non2a%tivities that shoul be triggere un er %ertain %on itions, su%h as =hen an #M# message %omes in. 4hese are %alle intent re%eivers an are es%ribe mi 2 =ay through the book. @ou may have one or more provider elements, in i%ating %ontent provi ers O %omponents that supply ata to your a%tivities an , =ith your permission, other a%tivities in other appli%ations on the evi%e. 4hese =rap up atabases or other ata stores into a single A!- that any appli%ation %an use. Later, =e6ll see ho= to %reate %ontent provi ers an ho= to use %ontent provi ers that you or others %reate. (inally, you may have one or more service elements, es%ribing servi%es O long2running pie%es o$ %o e that %an operate in epen ent o$ any a%tivity. 4he ;uintessential e:ample is the M!? player, =here you =ant the musi% to keep playing even i$ the user pops open other a%tivities an the M!? player6s user inter$a%e is Qmispla%e Q. 4=o %hapters late in the book %over ho= to %reate an use servi%es.

*$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

PART II Activities

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER (

Creating a Skeleton (pplication

Ivery programming language or environment book starts o$$ =ith the ever2 popular Q)ello, Worl 9Q emonstration* Nust enough o$ a program to prove you %an buil things, not so mu%h that you %annot un erstan =hat is going on. )o=ever, the typi%al Q)ello, Worl 9Q program has no intera%tivity &e.g., Nust umps the =or s to a %onsole', an so is really boring. 4his %hapter emonstrates a simple proNe%t, but one using A van%e !ush2 .utton 4e%hnologyR an the %urrent time, to sho= you ho= a simple An roi a%tivity =orks.

Begin at the Beginning


4o =ork =ith anything in An roi , you nee a proNe%t. With or inary Gava, i$ you =ante , you %oul Nust =rite a program as a single $ile, %ompile it =ith javac, an run it =ith java, =ithout any other support stru%tures. An roi is more %omple:, but to help keep it manageable, 7oogle has supplie tools to help %reate the proNe%t. -$ you are using an An roi 2enable -AI, su%h as I%lipse =ith the An roi plugin, you %an %reate a proNe%t insi e o$ the -AI &e.g., sele%t 2ile @ >e0 @ Pro"ect, then %hoose Android @ Android Pro"ect'. -$ you are using tools that are not An roi 2enable , you %an use the activitycreator s%ript, $oun in the tools/ ire%tory in your #AE installation. Gust pass activitycreator the pa%kage name o$ the a%tivity you
*4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Skeleton (pplication

=ant to %reate an a --out s=it%h in i%ating =here the proNe%t $iles shoul be generate . (or e:ample*
activitycreator!--out!/pat&/to/my/project/dir!4 com.commonsware.android./ow

@ou =ill =in up =ith a han $ul o$ pre2generate $iles, as es%ribe in a previous %hapter. (or the purposes o$ the samples sho=n in this book, you %an o=nloa their proNe%t ire%tories in a L-! $ile on the CommonsWare Web site. 4hese proNe%ts are rea y $or useP you o not nee to run activitycreator on those unpa%ke samples.

The (ctivity
@our proNe%t6s src/ ire%tory %ontains the stan ar Gava2style tree o$ ire%tories base upon the Gava pa%kage you %hose =hen you %reate the proNe%t &e.g., com.commonsware.android results in src/com/commonsware/android/'. -nsi e the innermost ire%tory you shoul $in a pre2generate sour%e $ile name /ow.java, =hi%h =here your $irst a%tivity =ill go. >pen /ow.java in your e itor an paste in the $ollo=ing %o e*
pac age!com.commonsware.android.s eleton5 import!android.app.Activity5 import!android.os.6undle5 import!android.view.7iew5 import!android.widget.6utton5 import!java.util.Date5 public!class!/ow!extends!Activity!implements!7iew.,n)lic +istener!8 !!6utton!btn5 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!btn!$!new!Button:t&is;5 !!!!btn.setOnClickListener:t&is;5

*7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Skeleton (pplication

!!!!updateTime:;5 !!!!setContentView:btn;5 !!< !!public!void!onClick:7iew!view;!8 !!!!updateTime:;5 !!< !!private!void!updateTime:;!8 !!!!btn.setText:new!Date:;.toString:;;5 !!< <

>r, i$ you o=nloa the sour%e $iles o$$ the Web site, you %an Nust use the /ow! proNe%t ire%tly.

/issecting the (ctivity


Let6s e:amine this pie%e by pie%e*
pac age!com.commonsware.android.s eleton5 import!android.app.Activity5 import!android.os.6undle5 import!android.view.7iew5 import!android.widget.6utton5 import!java.util.Date5

4he pa%kage e%laration nee s to be the same as the one you use =hen %reating the proNe%t. An , like any other Gava proNe%t, you nee to import any %lasses you re$eren%e. Most o$ the An roi 2spe%i$i% %lasses are in the android! pa%kage. Remember that not every Gava #I %lass is available to An roi programs9 +isit the An roi %lass re$eren%e to see =hat is an is not available.
public!class!/ow!extends!Activity!implements!7iew.,n)lic +istener!8 !!6utton!btn5

A%tivities are publi% %lasses, inheriting $rom the android.Activity base %lass. -n this %ase, the a%tivity hol s a button &btn'. #in%e, $or simpli%ity, =e =ant

*9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Skeleton (pplication

to trap all button %li%ks Nust =ithin the a%tivity itsel$, =e also have the a%tivity %lass implement ,n)lic +istener.
9,verride public!void!onCreate:6undle!icicle;!8 !!super.onCreate:icicle;5 !!btn!$!new!Button:t&is;5 !!btn.setOnClickListener:t&is;5 !!updateTime:;5 !!setContentView:btn;5 <

4he on)reate:; metho is invoke =hen the a%tivity is starte . 4he $irst thing you shoul o is %hain up=ar to the super%lass, so the sto%k An roi a%tivity initialiMation %an be one. -n our implementation, =e then %reate the button instan%e &new! 6utton:t&is;', tell it to sen all button %li%ks to the a%tivity instan%e itsel$ &via set,n)lic +istener:;', %all a private update-ime:; metho &see belo=', an then set the a%tivity6s %ontent vie= to be the button itsel$ &via set)ontent7iew:;'. We =ill is%uss that magi%al 6undle ! icicle in a later %hapter. (or the moment, %onsi er it an opa;ue han le that all a%tivities re%eive upon %reation.
public!void!onClick:7iew!view;!8 !!updateTime:;5 <

-n #=ing, a =6utton %li%k raises an Action*vent, =hi%h is passe to the Action+istener %on$igure $or the button. -n An roi , a button %li%k %auses on)lic :; to be invoke in the ,n)lic +istener instan%e %on$igure $or the button. 4he listener is provi e the vie= that triggere the %li%k &in this %ase, the button'. All =e o here is %all that private update-ime:; metho *
private!void!updateTime:;!8 !!btn.setText:new!Date:;.toString:;;5 <

%;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Skeleton (pplication

When =e open the a%tivity &on)reate:;' or =hen the button is %li%ke &on)lic :;', =e up ate the button6s label to be the %urrent time via set-ext:;, =hi%h $un%tions mu%h the same as the =6utton e;uivalent.

Building and 3unning the (ctivity


4o buil the a%tivity, either use your -AI6s built2in An roi pa%kaging tool, or run ant in the base ire%tory o$ your proNe%t. 4hen, to run the a%tivity*

Laun%h the emulator &e.g., run tools/emulator $rom your An roi #AE installation'

!igure *< The (ndroid home screen

-nstall

the

pa%kage

&e.g.,

/pat&/to/t&is/example/bin//ow.ap

run $rom

tools/adb ! install!

your

An roi

#AE

installation'

+ie= the list o$ installe appli%ations in the emulator an $in the Q/o=Q appli%ation

%*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Skeleton (pplication

!igure %< The (ndroid application =launcher=

>pen that appli%ation

@ou shoul see an a%tivity s%reen akin to*

!igure -< The 5o) demonstration activity

%%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Skeleton (pplication

Cli%king the button O in other =or s, pretty mu%h any=here on the phone6s s%reen O =ill up ate the time sho=n in the button6s label. /ote that the label is %entere horiMontally an verti%ally, as those are the e$ault styles applie to button %aptions. We %an %ontrol that $ormatting, =hi%h =ill be %overe in a later %hapter. A$ter you are one gaMing at the a=esomeness o$ A van%e !ush2.utton 4e%hnologyR, you %an %li%k the ba%k button on the emulator to return to the laun%her.

%Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER )

>sing ?+ "Based ayouts

While it is te%hni%ally possible to %reate an atta%h =i gets to our a%tivity purely through Gava %o e, the =ay =e i in the pre%e ing %hapter, the more %ommon approa%h is to use an DML2base layout $ile. Aynami% instantiation o$ =i gets is reserve $or more %ompli%ate s%enarios, =here the =i gets are not kno=n at %ompile2time &e.g., populating a %olumn o$ ra io buttons base on ata retrieve o$$ the -nternet'. With that in min , it6s time to break out the DML an learn out to lay out An roi a%tivity vie=s that =ay.

What 8s an ?+ "Based ayout:


As the name suggests, an DML2base layout is a spe%i$i%ation o$ =i gets6 relationships to ea%h other O an to %ontainers O en%o e in DML $ormat. #pe%i$i%ally, An roi %onsi ers DML2base layouts to be resour%es, an as su%h layout $iles are store in the res/layout ire%tory insi e your An roi proNe%t. Ia%h DML $ile %ontains a tree o$ elements spe%i$ying a layout o$ =i gets an %ontainers that make up one 7iew. 4he attributes o$ the DML elements are properties, es%ribing ho= a =i get shoul look or ho= a %ontainer shoul behave. (or e:ample, i$ a 6utton element has an attribute value o$ android#textStyle!$!%bold%, that means that the te:t appearing on the $a%e o$ the button shoul be ren ere in a bol $a%e $ont style.
%0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing ?+ "Based ayouts

An roi 6s #AE ships =ith a tool &aapt' =hi%h uses the layouts. 4his tool shoul be automati%ally invoke by your An roi tool %hain &e.g., I%lipse, Ant6s build.xml'. >$ parti%ular importan%e to you as a eveloper is that aapt! generates the R.java sour%e $ile =ithin your proNe%t, allo=ing you to a%%ess layouts an =i gets =ithin those layouts ire%tly $rom your Gava %o e, as =ill be emonstrate .

Why >se ?+ "Based ayouts:


Most everything you o using DML layout $iles %an be a%hieve through Gava %o e. (or e:ample, you %oul use set-ypeface:; to have a button ren er its te:t in bol , instea o$ using a property in an DML layout. #in%e DML layouts are yet another $ile $or you to keep tra%k o$, =e nee goo reasons $or using su%h $iles. !erhaps the biggest reason is to assist in the %reation o$ tools $or vie= e$inition, su%h as a 7"- buil er in an -AI like I%lipse or a e i%ate An roi 7"- esigner like Aroi Ara=. #u%h 7"- buil ers %oul , in prin%iple, generate Gava %o e instea o$ DML. 4he %hallenge is re2rea ing the e$inition in to support e its O that is $ar simpler i$ the ata is in a stru%ture $ormat like DML than in a programming language. Moreover, keeping the generate bits separate out $rom han 2=ritten %o e makes it less likely that somebo y6s %ustom2%ra$te sour%e =ill get %lobbere by a%%i ent =hen the generate bits get re2generate . DML $orms a ni%e mi le groun bet=een something that is easy $or tool2=riters to use an easy $or programmers to =ork =ith by han as nee e . Also, DML as a 7"- e$inition $ormat is be%oming more %ommonpla%e. Mi%roso$t6s DAML, A obe6s (le:, an MoMilla6s D"L all take a similar approa%h to that o$ An roi * put layout etails in an DML $ile an put programming smarts in sour%e $iles &e.g., Gavas%ript $or D"L'. Many less2 =ell2kno=n 7"- $rame=orks, su%h as LE, also use DML $or vie= e$inition. While Q$ollo=ing the her Q is not ne%essarily the best poli%y, it oes have the a vantage o$ helping to ease the transition into An roi $rom any other DML2%entere vie= es%ription language.

%1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing ?+ "Based ayouts

,@6 So What /oes 8t ook ike:


)ere is the 6utton $rom the previous %hapter6s sample appli%ation, %onverte into an DML layout $ile*
">xml!version$%?.@%!encoding$%utf-A%>' "6utton!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!android#id$%9Bid/button% !!!!android#text$%% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%fill_parent%/'

4he %lass name o$ the =i get O 6utton O $orms the name o$ the DML element. #in%e 6utton is an An roi 2supplie =i get, =e %an Nust use the bare %lass name. -$ you %reate your o=n =i gets as sub%lasses o$ android.view.7iew, you =oul nee to provi e a $ull pa%kage e%laration as =ell &e.g., com.commonsware.android.MyCidget'. 4he root element nee s to e%lare the An roi DML namespa%e*
xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android%

All other elements =ill be %hil ren o$ the root an namespa%e e%laration.

=ill inherit that

.e%ause =e =ant to re$eren%e this button $rom our Gava %o e, =e nee to give it an i enti$ier via the android#id attribute. We =ill %over this %on%ept in greater etail . 4he remaining attributes are properties o$ this 6utton instan%e*
android#text in i%ates the initial te:t to be isplaye on the button $a%e &in this %ase, an empty string'

an android#layout_&eig&t tell An roi to have the button6s =i th an height $ill the QparentQ, in this %ase the entire s%reen O these attributes =ill be %overe in greater etail in a later %hapter
android#layout_widt&

%4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing ?+ "Based ayouts

#in%e this single =i get is the only %ontent in our a%tivity6s vie=, =e only nee this single element. Comple: vie=s =ill re;uire a =hole tree o$ elements, representing the =i gets an %ontainers that %ontrol their positioning. All the remaining %hapters o$ this book =ill use the DML layout $orm =henever pra%ti%al, so there are oMens o$ other e:amples o$ more %omple: layouts $or you to peruse.

WhatAs With the B Signs:


Many =i gets an %ontainers only nee to appear in the DML layout $ile an o not nee to be re$eren%e in your Gava %o e. (or e:ample, a stati% label &-ext7iew' $re;uently only nee s to be in the layout $ile to in i%ate =here it shoul appear. 4hese sorts o$ elements in the DML $ile o not nee to have the android#id attribute to give them a name. Anything you do =ant to use in your Gava sour%e, though, nee s an android#id. 4he %onvention is to use 9Bid/... as the id value, =here the ... represents your lo%ally2uni;ue name $or the =i get in ;uestion. -n the DML layout e:ample in the pre%e ing se%tion, 9Bid/button is the i enti$ier $or the 6utton! =i get. An roi provi es a $e= spe%ial android#id values, o$ the $orm 9android#id/... O =e =ill see some o$ these in various %hapters o$ this book.

(nd We (ttach These to the Cava<<<Do):


7iven that you have painstakingly set up the =i gets an %ontainers $or your vie= in an DML layout $ile name main.xml store in res/layout, all you nee is one statement in your a%tivity6s on)reate:; %allba%k to use that layout*
setContentView:R.layout.main;5

%7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing ?+ "Based ayouts

4his is the same set)ontent7iew:; =e use earlier, passing it an instan%e o$ a 7iew sub%lass &in that %ase, a 6utton'. 4he An roi 2built 7iew, %onstru%te $rom our layout, is a%%esse $rom that %o e2generate R %lass. All o$ the layouts are a%%essible un er R.layout, keye by the base name o$ the layout $ile O main.xml results in R.layout.main. 4o a%%ess our i enti$ie =i gets, use find7iew6y.d:;, passing it the numeri% i enti$ier o$ the =i get in ;uestion. 4hat numeri% i enti$ier =as generate by An roi in the R %lass as R.id.somet&ing &=here somet&ing is the spe%i$i% =i get you are seeking'. 4hose =i gets are simply sub%lasses o$ 7iew, Nust like the 6utton instan%e =e %reate in the previous %hapter.

The 3est of the Story


-n the original /ow emo, the button6s $a%e =oul sho= the %urrent time, =hi%h =oul re$le%t =hen the button =as last pushe &or =hen the a%tivity =as $irst sho=n, i$ the button ha not yet been pushe '. Most o$ that logi% still =orks, even in this revise emo & /owRedux'. )o=ever, rather than instantiating the 6utton in our a%tivity6s on)reate:; %allba%k, =e %an re$eren%e the one $rom the DML layout*
pac age!com.commonsware.android.layouts5 import!android.app.Activity5 import!android.os.6undle5 import!android.view.7iew5 import!android.widget.6utton5 import!java.util.Date5 public!class!/owRedux!extends!Activity !!implements!7iew.,n)lic +istener!8 !!6utton!btn5 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!! !!!!setContentView:R.layout.main;5 !!!!btn$:6utton;findViewById:R.id.button;5 !!!!btn.setOnClickListener:t&is;5 !!!!updateTime:;5

%9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing ?+ "Based ayouts

!!< !!public!void!onClick:7iew!view;!8 !!!!updateTime:;5 !!< !!private!void!updateTime:;!8 !!!!btn.setText:new!Date:;.toString:;;5 !!< <

4he $irst i$$eren%e is that rather than setting the %ontent vie= to be a vie= =e %reate in Gava %o e, =e set it to re$eren%e the DML layout &set)ontent7iew:R.layout.main;'. 4he R.java sour%e $ile =ill be up ate =hen =e rebuil this proNe%t to in%lu e a re$eren%e to our layout $ile &store as main.xml in our proNe%t6s res/layout ire%tory'. 4he other i$$eren%e is that =e nee to get our han s on our 6utton instan%e, $or =hi%h =e use the find7iew6y.d:; %all. #in%e =e i enti$ie our button as 9Bid/button, =e %an re$eren%e the button6s i enti$ier as R.id.button. /o=, =ith the 6utton instan%e in han , =e %an set the %allba%k an set the label as nee e . 4he results look the same as =ith the original /ow emo*

-;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing ?+ "Based ayouts

!igure $< The 5o)3edux sample activity

-*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER *

Employing Basic Widgets

Ivery 7"- toolkit has some basi% =i gets* $iel s, labels, buttons, et%. An roi 6s toolkit is no i$$erent in s%ope, an the basi% =i gets =ill provi e a goo intro u%tion as to ho= =i gets =ork in An roi a%tivities.

(ssigning abels
4he simplest =i get is the label, re$erre to in An roi as a -ext7iew. Like in most 7"- toolkits, labels are bits o$ te:t not e itable ire%tly by users. 4ypi%ally, they are use to i enti$y a Na%ent =i gets &e.g., a Q/ame*Q label be$ore a $iel =here one $ills in a name'. -n Gava, you %an %reate a label by %reating a -ext7iew instan%e. More %ommonly, though, you =ill %reate labels in DML layout $iles by a ing a -ext7iew element to the layout, =ith an android#text property to set the value o$ the label itsel$. -$ you nee to s=ap labels base on %ertain %riteria, su%h as internationaliMation, you may =ish to use a resour%e re$eren%e in the DML instea , as =ill be es%ribe later in this book.
-ext7iew

has numerous other properties o$ relevan%e $or labels, su%h as* to set the type$a%e to use $or the label &e.g., be ma e bol

android#typeface monospace'

android#textStyle to in i%ate that the type$a%e shoul &bold', itali% &italic', or bol an itali% &bold_italic'
--

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

android#text)olor to set the $ormat &e.g., DEE@@@@ $or re '

%olor o$ the label6s te:t, in R7. he:

(or e:ample, in the +abel proNe%t, you =ill $in the $ollo=ing layout $ile*
">xml!version$%?.@%!encoding$%utf-A%>' "-ext7iew!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent%! !!android#layout_&eig&t$%wrap_content%! !!android#text$%Fou!were!expecting!somet&ing!profound>% !!/'

Gust that layout alone, =ith the stub Gava sour%e provi e proNe%t buil er &e.g., activity)reator', gives you*

by An roi 6s

!igure 0< The abel/emo sample application

Button6 Button6 WhoAs 'ot the Button:


We6ve alrea y seen the use o$ the 6utton =i get in the previous t=o %hapters. As it turns out, 6utton is a sub%lass o$ -ext7iew, so everything is%usse in the pre%e ing se%tion in terms o$ $ormatting the $a%e o$ the button still hol s.
-$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

!leeting 8mages
An roi has t=o =i gets to help you embe images in your a%tivities* an .mage6utton. As the names suggest, they are image2base analogues to -ext7iew an 6utton, respe%tively.
.mage7iew

Ia%h =i get takes an android#src attribute &in an DML layout' to spe%i$y =hat pi%ture to use. 4hese usually re$eren%e a ra=able resour%e, es%ribe in greater etail in the %hapter on resour%es. @ou %an also set the image %ontent base on a 2ri $rom a %ontent provi er via set.mage2R.:;.
.mage6utton,

a sub%lass o$ .mage7iew, mi:es in the stan ar 6utton behaviors, $or respon ing to %li%ks an =hatnot. (or e:ample, take a peek at the main.xml layout $rom the .mage7iew sample proNe%t*
">xml!version$%?.@%!encoding$%utf-A%>' ".mage7iew!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!android#id$%9Bid/icon% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent% !!!!android#adjust7iew6ounds$%true% !!!!android#src$%9drawable/molecule% !!!!/'

4he result, Nust using the %o e2generate a%tivity, is simply the image*

-0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

!igure 1< The 8mageFie)/emo sample application

!ields of 'reen< ,r ,ther Colors<


Along =ith buttons an labels, $iel s are the thir Qan%horQ o$ most 7"toolkits. -n An roi , they are implemente via the *dit7iew =i get, =hi%h is a sub%lass o$ the -ext7iew use $or labels. Along =ith the stan ar -ext7iew properties &e.g., android#textStyle', *dit7iew has many others that =ill be use$ul $or you in %onstru%ting $iel s, in%lu ing*
android#auto-ext,

to %ontrol i$ the $iel spelling assistan%e


android#capitali(e,

shoul

provi e automati%

to %ontrol i$ the $iel shoul automati%ally %apitaliMe the $irst letter o$ entere te:t &e.g., $irst name, %ity'
android#digits, to %on$igure the $iel

to a%%ept only %ertain igits

android#single+ine, to %ontrol i$ the $iel is $or single2line input or multiple2line input &e.g., oes SInterT move you to the ne:t =i get or a a ne=lineC'

-1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

.eyon those, you %an %on$igure $iel s to use spe%ialiMe input metho s, su%h as android#numeric $or numeri%2only input, android#password $or shrou e pass=or input, an android#p&one/umber $or entering in phone numbers. -$ you =ant to %reate your o=n input metho s%heme &e.g., postal %o es, #o%ial #e%urity numbers', you nee to %reate your o=n implementation o$ the .nputMet&od inter$a%e, then %on$igure the $iel to use it via android#inputMet&od. (or e:ample, $rom the Eield proNe%t, here is an DML layout $ile sho=ing an *dit7iew*
">xml!version$%?.@%!encoding$%utf-A%>' "*dit-ext!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#id$%9Bid/field% !!android#layout_widt&$%fill_parent%! !!android#layout_&eig&t$%fill_parent% !!android#single+ine$%false% !!/'

/ote that android#single+ine is $alse, so users =ill be able to enter in several lines o$ te:t. (or this proNe%t, the EieldDemo.java $ile populates the input $iel =ith some prose*
pac age!com.commonsware.android.basic5 import!android.app.Activity5 import!android.os.6undle5 import!android.widget.*dit-ext5 public!class!EieldDemo!extends!Activity!8 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!! !!!!*dit-ext!fld$:*dit-ext;findViewById:R.id.field;5 !!!!fld.setText:%+icensed!under!t&e!Apac&e!+icenseG!7ersion!H.@!%!B !!!!!!!!!!!!%:t&e!4%+icense4%;5!you!may!not!use!t&is!file!%!B !!!!!!!!!!!!%except!in!compliance!wit&!t&e!+icense.!Fou!may!%!B !!!!!!!!!!!!%obtain!a!copy!of!t&e!+icense!at!%!B !!!!!!!!!!!!%&ttp#//www.apac&e.org/licenses/+.)*/S*-H.@%;5 !!< <

-4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

4he result, on%e built an installe into the emulator, is*

!igure 4< The !ield/emo sample application

>AT.* An roi 6s emulator only allo=s one appli%ation in the laun%her per uni;ue Gava pa%kage. #in%e all the emos in this %hapter share the com.commonsware.android.basic pa%kage, i$ you have the LabelAemo appli%ation installe , you =ill not see the (iel Aemo appli%ation in the laun%her. 4o remove the LabelAemo appli%ation O or any appli%ation O use adb !s&ell !%rm !/data/app/...%, =here ... is the name o$ the appli%ation6s A!E $ile &e.g., +abelDemo.ap '. 4hen, reinstall the $ormerly2hi en appli%ation, an it =ill sho= up in the laun%her. Another $lavor o$ $iel is one that o$$ers auto2%ompletion, to help users supply a value =ithout typing in the =hole te:t. 4hat is provi e in An roi as the Auto)omplete-ext7iew =i get, is%usse in greater etail later in this book.

-7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

Cust (nother Box to Check


4he %lassi% %he%kbo: has t=o states* %he%ke an un%he%ke . Cli%king the %he%kbo: toggles bet=een those states to in i%ate a %hoi%e &e.g., QA rush elivery to my or erQ'. -n An roi , there is a )&ec 6ox =i get to meet this nee . -t has -ext7iew as an an%estor, so you %an use -ext7iew properties like android#text)olor to $ormat the =i get. Within Gava, you %an invoke*
is)&ec ed:; to set)&ec ed:;

etermine i$ the %he%kbo: has been %he%ke or un%he%ke

state

to $or%e the %he%kbo: into a %he%ke

toggle:; to toggle the %he%kbo: as i$

the user %he%ke it

Also, you %an register a listener obNe%t &in this %ase, an instan%e o$ ,n)&ec ed)&ange+istener' to be noti$ie =hen the state o$ the %he%kbo: %hanges. (or e:ample, $rom the )&ec 6ox proNe%t, here is a simple %he%kbo: layout*
">xml!version$%?.@%!encoding$%utf-A%>' ")&ec 6ox!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!android#id$%9Bid/c&ec % !!!!android#layout_widt&$%wrap_content% !!!!android#layout_&eig&t$%wrap_content% !!!!android#text$%-&is!c&ec box!is#!unc&ec ed%!/'

4he %orrespon ing )&ec 6oxDemo.java retrieves an %on$igures the behavior o$ the %he%kbo:*
public!class!)&ec 6oxDemo!extends!Activity !!implements!)ompound6utton.,n)&ec ed)&ange+istener!8 !!)&ec 6ox!cb5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 -9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

!!!!setContentView:R.layout.main;5 !!!! !!!!cb$:)&ec 6ox;findViewById:R.id.c&ec ;5 !!!!cb.setOnCheckedChangeListener:t&is;5 !!< !! !!public!void!onCheckedChanged:)ompound6utton!button7iewG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!boolean!is)&ec ed;!8 !!!!if!:is)&ec ed;!8 !!!!!!cb.setText:%-&is!c&ec box!is#!c&ec ed%;5 !!!!< !!!!else!8 !!!!!!cb.setText:%-&is!c&ec box!is#!unc&ec ed%;5 !!!!< !!< <

/ote that the a%tivity serves as its o=n listener $or %he%kbo: state %hanges sin%e it implements the ,n)&ec ed)&ange+istener inter$a%e &via cb.set,n)&ec ed)&ange+istener:t&is;'. 4he %allba%k $or the listener is on)&ec ed)&anged:;, =hi%h re%eives the %he%kbo: =hose state has %hange an =hat the ne= state is. -n this %ase, =e up ate the te:t o$ the %he%kbo: to re$le%t =hat the a%tual bo: %ontains. 4he resultC Cli%king the %he%kbo: imme iately up ates its te:t, as sho=n belo=*

$;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

!igure 7< The CheckBox/emo sample application6 )ith the checkbox unchecked

!igure 9< The same application6 no) )ith the checkbox checked

$*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

Turn the 3adio >p


As =ith other implementations o$ ra io buttons in other toolkits, An roi 6s ra io buttons are t=o2state, like %he%kbo:es, but %an be groupe su%h that only one ra io button in the group %an be %he%ke at any time. Like )&ec 6ox, Radio6utton inherits $rom )ompound6utton, =hi%h in turn inherits $rom -ext7iew. )en%e, all the stan ar -ext7iew properties $or $ont $a%e, style, %olor, et%. are available $or %ontrolling the look o$ ra io buttons. #imilarly, you %an %all is)&ec ed:; on a Radio6utton to see i$ it is sele%te , toggle:; to sele%t it, an so on, like you %an =ith a )&ec 6ox. Most times, you =ill =ant to put your Radio6utton =i gets insi e o$ a 4he Radio0roup in i%ates a set o$ ra io buttons =hose state is tie , meaning only one button out o$ the group %an be sele%te at any time. -$ you assign an android#id to your Radio0roup in your DML layout, you %an a%%ess the group $rom your Gava %o e an invoke*
Radio0roup. c&ec :; to %he%k a group.c&ec :R.id.rb?;' clear)&ec :;

spe%i$i% ra io button via its -A &e.g.,

to %lear all ra io buttons, so none in the group are -A o$ the %urrently2%he%ke '

%he%ke
get)&ec edRadio6utton.d:; to get the ra io button &or -? i$ none are %he%ke

(or e:ample, $rom the Radio6utton sample appli%ation, here is an DML layout sho=ing a Radio0roup =rapping a set o$ Radio6utton =i gets*
">xml!version$%?.@%!encoding$%utf-A%>' "Radio0roup !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!!!"Radio6utton!android#id$%9Bid/radio?% !!!!!!android#layout_widt&$%wrap_content% !!!!!!android#layout_&eig&t$%wrap_content% !!!!!!android#text$%Roc %!/'

$%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

!!!!"Radio6utton!android#id$%9Bid/radioH% !!!!!!android#layout_widt&$%wrap_content% !!!!!!android#layout_&eig&t$%wrap_content% !!!!!!android#text$%Scissors%!/' !!!!"Radio6utton!android#id$%9Bid/radioI% !!!!!!android#layout_widt&$%wrap_content% !!!!!!android#layout_&eig&t$%wrap_content% !!!!!!android#text$%1aper%!/' "/Radio0roup'

"sing the sto%k An roi 2generate Gava $or the proNe%t an this layout, you get*

!igure *;< The 3adioButton/emo sample application

/ote that the ra io button group is initially set to be %ompletely un%he%ke at the outset. 4o preset one o$ the ra io buttons to be %he%ke , use either set)&ec ed:; on the Radio6utton or c&ec :; on the Radio0roup $rom =ithin your on)reate:; %allba%k in your a%tivity.

$Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

8tAs Guite a Fie)


All =i gets, in%lu ing the ones sho=n above, e:ten 7iew, an as su%h give all =i gets an array o$ use$ul properties an metho s beyon those alrea y es%ribe .

+se,ul Properties
#ome o$ the properties on 7iew most likely to be use in%lu e*

Controls the $o%us se;uen%e*


android#nextEocusDown android#nextEocus+eft android#nextEocusRig&t android#nextEocus2p

android#visibility,

=hi%h %ontrols =hether the =i get is initially R7. %olor value $or the =i get

visible
android#bac ground, =hi%h typi%ally provi es an &e.g., D@@EE@@ $or green' to serve as the ba%kgroun

+se,ul %ethods
@ou %an toggle =hether or not a =i get is enable via set*nabled:; an see i$ it is enable via is*nabled:;. >ne %ommon use pattern $or this is to isable some =i gets base on a )&ec 6ox or Radio6utton sele%tion. @ou %an give a =i get $o%us via reJuestEocus:; an see i$ it is $o%use via isEocused:;. @ou might use this in %on%ert =ith isabling =i gets as mentione above, to ensure the proper =i get has the $o%us on%e your isabling operation is %omplete. 4o help navigate the tree o$ =i gets an a%tivity6s overall vie=, you %an use* %ontainers that make up an

$$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing Basic Widgets

get1arent:; to $in

the parent =i get or %ontainer a %hil =i get =ith a %ertain -A

find7iew6y.d:; to $in getRoot7iew:;

to get the root o$ the tree &e.g., =hat you provi e to the a%tivity via set)ontent7iew:;'

$0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER -

Working )ith Containers

Containers pour a %olle%tion o$ =i gets &an possibly %hil %ontainers' into spe%i$i% layouts you like. -$ you =ant a $orm =ith labels on the le$t an $iel s on the right, you =ill nee a %ontainer. -$ you =ant >E an Can%el buttons to be beneath the rest o$ the $orm, ne:t to one another, an $lush to right si e o$ the s%reen, you =ill nee a %ontainer. Gust $rom a pure DML perspe%tive, i$ you have multiple =i gets &beyon Radio6utton =i gets in a Radio0roup', you =ill nee a %ontainer Nust to have a root element to pla%e the =i gets insi e. Most 7"- toolkits have some notion o$ layout management, $re;uently organiMe into %ontainers. -n GavaU#=ing, $or e:ample, you have layout managers like 6ox+ayout an %ontainers that use them &e.g., 6ox'. #ome toolkits sti%k stri%tly to the bo: mo el, su%h as D"L an (le:, $iguring that any esire layout %an be a%hieve through the right %ombination o$ neste bo:es. An roi , through +inear+ayout, also o$$ers a Qbo:Q mo el, but in a ition supports a range o$ %ontainers provi ing i$$erent layout rules. -n this %hapter, =e =ill look at three %ommonly2use %ontainers* +inear+ayout &the bo: mo el', Relative+ayout &a rule2base mo el', an -able+ayout &the gri mo el', along =ith Scroll7iew, a %ontainer esigne to assist =ith implementing s%rolling %ontainers. -n the ne:t %hapter, =e =ill e:amine some more esoteri% %ontainers.

$4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

Thinking inearly
As note above, +inear+ayout is a bo: mo el O =i gets or %hil %ontainers are line up in a %olumn or ro=, one a$ter the ne:t. 4his =orks similar to Elow+ayout in GavaU#=ing, vbox an &box in (le: an D"L, et%. (le: an D"L use the bo: as their primary unit o$ layout. -$ you =ant, you %an use +inear+ayout in mu%h the same =ay, es%he=ing some o$ the other %ontainers. 7etting the visual representation you =ant is mostly a matter o$ i enti$ying =here bo:es shoul nest an =hat properties those bo:es shoul have, su%h as alignment vis a vis other bo:es.

Concepts nd Properties
4o %on$igure a +inear+ayout, you have $ive main areas o$ %ontrol besi es the %ontainer6s %ontents* the orientation, the $ill mo el, the =eight, the gravity, an the pa ing.

Orientation
>rientation in i%ates =hether the +inear+ayout represents a ro= or a %olumn. Gust a the android#orientation property to your +inear+ayout! element in your DML layout, setting the value to be &ori(ontal $or a ro= or vertical $or a %olumn. 4he orientation %an be mo i$ie at runtime by invoking set,rientation:; on the +inear+ayout, supplying it either 3,R.K,/-A+ or 7*R-.)A+.

Fill Model
Let6s imagine a ro= o$ =i gets, su%h as a pair o$ ra io buttons. 4hese =i gets have a QnaturalQ siMe base on their te:t. 4heir %ombine siMes probably o not e:a%tly mat%h the =i th o$ the An roi evi%e6s s%reen O parti%ularly sin%e s%reens %ome in various siMes. We then have the issue o$ =hat to o =ith the remaining spa%e.
$7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

All =i gets insi e a +inear+ayout must supply android#layout_widt& an android#layout_&eig&t properties to help a ress this issue. 4hese properties6 values have three $lavors*

@ou %an provi e a spe%i$i% imension, su%h as ?HLpx to in i%ate the =i get shoul take up e:a%tly ,2B pi:els @ou %an provi e wrap_content, =hi%h means the =i get shoul $ill up its natural spa%e, unless that is too big, in =hi%h %ase An roi %an use =or 2=rap as nee e to make it $it @ou %an provi e fill_parent, =hi%h means the =i get shoul $ill up all available spa%e in its en%losing %ontainer, a$ter all other =i gets are taken %are o$

4he latter t=o $lavors are the most %ommon, as they are in epen ent o$ s%reen siMe, allo=ing An roi to a Nust your vie= to $it the available spa%e.

Weight
.ut, =hat happens i$ =e have t=o =i gets that shoul split the available $ree spa%eC (or e:ample, suppose =e have t=o multi2line $iel s in a %olumn, an =e =ant them to take up the remaining spa%e in the %olumn a$ter all other =i gets have been allo%ate their spa%e. 4o make this =ork, in a ition to setting android#layout_widt& &$or ro=s' or &$or %olumns' to fill_parent, you must also set 4his property in i%ates =hat proportion o$ the $ree spa%e shoul go to that =i get. -$ you set android#layout_weig&t to be the same value $or a pair o$ =i gets &e.g., ?', the $ree spa%e =ill be split evenly bet=een them. -$ you set it to be ? $or one =i get an H $or another =i get, the se%on =i get =ill use up t=i%e the $ree spa%e that the $irst =i get oes. An so on.
android#layout_&eig&t android#layout_weig&t.

$9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

Gravity
.y e$ault, everything is le$t2 an top2aligne . #o, i$ you %reate a ro= o$ =i gets via a horiMontal +inear+ayout, the ro= =ill start $lush on the le$t si e o$ the s%reen. -$ that is not =hat you =ant, you nee to spe%i$y a gravity. "sing android#layout_gravity on a =i get &or %alling set0ravity:; at runtime on the =i get6s Gava obNe%t', you %an tell the =i get an its %ontainer ho= to align it vis a vis the s%reen. (or a %olumn o$ =i gets, %ommon gravity values are left, center_&ori(ontal, an rig&t $or le$t2aligne , %entere , an right2aligne =i gets respe%tively. (or a ro= o$ =i gets, the e$ault is $or them to be aligne so their te:ts are aligne on the baseline &the invisible line that letters seem to Qsit onQ', though you may =ish to spe%i$y a gravity o$ center_vertical to %enter the =i gets along the ro=6s verti%al mi point.

Padding
.y e$ault, =i gets are tightly pa%ke ne:t to ea%h other. -$ you =ant to in%rease the =hitespa%e bet=een =i gets, you =ill =ant to use the android#padding property &or by %alling set1adding:; at runtime on the =i get6s Gava obNe%t'. 4he pa ing spe%i$ies ho= mu%h spa%e there is bet=een the boun aries o$ the =i get6s Q%ellQ an the a%tual =i get %ontents. !a ing is analogous to the margins on a =or pro%essing o%ument O the page siMe might be 8.BQ:,,Q, but ,Q margins =oul leave the a%tual te:t to resi e =ithin a 3.BQ:0Q area.

0;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

!igure **< The relationship bet)een a )idget6 its cell6 and the padding values

4he android#padding property allo=s you to set the same pa ing on all $our si es o$ the =i get, =ith the =i get6s %ontents itsel$ %entere =ithin that pa e 2out area. -$ you =ant the pa ing to i$$er on i$$erent si es, use android#padding+eft, android#paddingRig&t, android#padding-op, an android#padding6ottom. 4he value o$ the pa pa ing. ing is a imension, su%h as Lpx $or B pi:els6 =orth o$

E. mple
Let6s look at an e:ample &+inear' that sho=s +inear+ayout properties set both in the DML layout $ile an at runtime. )ere is the layout*
0*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"Radio0roup!android#id$%9Bid/orientation% !!!!android#orientation$%&ori(ontal% !!!!android#layout_widt&$%wrap_content% !!!!android#layout_&eig&t$%wrap_content% !!!!android#padding$%Lpx%' !!!!"Radio6utton !!!!!!android#id$%9Bid/&ori(ontal% !!!!!!android#text$%&ori(ontal%!/' !!!!"Radio6utton !!!!!!android#id$%9Bid/vertical% !!!!!!android#text$%vertical%!/' !!"/Radio0roup' !!"Radio0roup!android#id$%9Bid/gravity% !!!!android#orientation$%vertical% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!android#padding$%Lpx%' !!!!"Radio6utton !!!!!!android#id$%9Bid/left% !!!!!!android#text$%left%!/' !!!!"Radio6utton !!!!!!android#id$%9Bid/center% !!!!!!android#text$%center%!/' !!!!"Radio6utton !!!!!!android#id$%9Bid/rig&t% !!!!!!android#text$%rig&t%!/' !!"/Radio0roup' "/+inear+ayout'

/ote that =e have a +inear+ayout =rapping t=o Radio0roup sets. Radio0roup is a sub%lass o$ +inear+ayout, so our e:ample emonstrates neste bo:es as i$ they =ere all +inear+ayout %ontainers. 4he top Radio0roup sets up a ro= &android#orientation!$! %&ori(ontal%' o$ Radio6utton =i gets. 4he Radio0roup has Lpx o$ pa ing on all si es, separating it $rom the other Radio0roup. 4he =i th an height are both set to wrap_content, so the ra io buttons =ill only take up the spa%e that they nee . 4he bottom Radio0roup is a %olumn &android#orientation!$!%vertical%' o$ three Radio6utton =i gets. Again, =e have Lpx o$ pa ing on all si es an a QnaturalQ height &android#layout_&eig&t ! $ ! %wrap_content%'. )o=ever, =e
0%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

have set android#layout_widt& to be fill_parent, meaning the %olumn o$ ra io buttons Q%laimsQ the entire =i th o$ the s%reen. 4o a Nust these settings at runtime base on user input, =e nee some Gava %o e*
pac age!com.commonsware.android.containers5 import!android.app.Activity5 import!android.os.6undle5 import!android.text.-extCatc&er5 import!android.widget.+inear+ayout5 import!android.widget.Radio0roup5 import!android.widget.*dit-ext5 public!class!+inear+ayoutDemo!extends!Activity !!implements!Radio0roup.,n)&ec ed)&ange+istener!8 !!Radio0roup!orientation5 !!Radio0roup!gravity5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!! !!!!orientation$:Radio0roup;findViewById:R.id.orientation;5 !!!!orientation.setOnCheckedChangeListener:t&is;5 !!!!gravity$:Radio0roup;findViewById:R.id.gravity;5 !!!!gravity.setOnCheckedChangeListener:t&is;5 !!< !! !!public!void!onCheckedChanged:Radio0roup!groupG!int!c&ec ed.d;!8 !!!!if!:group$$orientation;!8 !!!!!!if!:c&ec ed.d$$R.id.&ori(ontal;!8 !!!!!!!!orientation.setOrientation:+inear+ayout.3,R.K,/-A+;5 !!!!!!< !!!!!!else!8 !!!!!!!!orientation.setOrientation:+inear+ayout.7*R-.)A+;5 !!!!!!< !!!!< !!!!else!if!:group$$gravity;!8 !!!!!!if!:c&ec ed.d$$R.id.left;!8 !!!!!!!!gravity.setGra ity:@x@I;5!!!!//!left !!!!!!< !!!!!!else!if!:c&ec ed.d$$R.id.center;!8 !!!!!!!!gravity.setGra ity:@x@?;5!!!!//!center_&ori(ontal !!!!!!< !!!!!!else!if!:c&ec ed.d$$R.id.rig&t;!8 !!!!!!!!gravity.setGra ity:@x@L;5!!!!//!rig&t !!!!!!< !!!!<

0Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

!!< <

-n on)reate:;, =e look up our t=o Radio0roup %ontainers an register a listener on ea%h, so =e are noti$ie =hen the ra io buttons %hange state &set,n)&ec ed)&ange+istener:t&is;'. #in%e the a%tivity implements ,n)&ec ed)&ange+istener, the a%tivity itsel$ is the listener. -n on)&ec ed)&anged:; &the %allba%k $or the listener', =e see =hi%h Radio0roup ha a state %hange. -$ it =as the orientation group, =e a Nust the orientation base on the user6s sele%tion. -$ it =as the gravity group, =e a Nust the gravity base on the user6s sele%tion. )ere is the result =hen it is $irst laun%he insi e the emulator*

!igure *%< The inear ayout/emo sample application6 as initially launched

-$ =e toggle on the Qverti%alQ ra io button, the top Radio0roup a Nusts to mat%h*

0$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

!igure *-< The same application6 )ith the vertical radio button selected

-$ =e toggle the Q%enterQ or QrightQ ra io buttons, the bottom Radio0roup! a Nusts to mat%h*

!igure *$< The same application6 )ith the vertical and center radio buttons selected 00
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

!igure *0< The same application6 )ith the vertical and right radio buttons selected

(ll Things (re 3elative


as the name suggests, lays out =i gets base upon their relationship to other =i gets in the %ontainer an the parent %ontainer. @ou %an pla%e Wi get D belo= an to the le$t o$ Wi get @, or have Wi get L6s bottom e ge align =ith the bottom o$ the %ontainer, an so on. 4his is reminis%ent o$ Games Illiot6s RelativeLayout $or use =ith GavaU#=ing.
Relative+ayout,

Concepts nd Properties
4o make all this =ork, =e nee =ays to re$eren%e other =i gets =ithin an DML layout $ile, plus =ays to in i%ate the relative positions o$ those =i gets.

01
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

Positions Relative to Container


4he easiest relations to set up are tying a =i get6s position to that o$ its %ontainer*
android#layout_align1arent-op

says the =i get6s top shoul

align

=ith the top o$ the %ontainer


android#layout_align1arent6ottom says the =i get6s bottom shoul align =ith the bottom o$ the %ontainer

says the =i get6s le$t si e shoul align =ith the le$t si e o$ the %ontainer
android#layout_align1arent+eft

says the =i get6s right si e shoul align =ith the right si e o$ the %ontainer
android#layout_align1arentRig&t android#layout_center3ori(ontal

says the =i get positione horiMontally at the %enter o$ the %ontainer


android#layout_center7ertical android#layout_center.n1arent

shoul

be

says the =i get shoul be positione verti%ally at the %enter o$ the %ontainer says the =i get shoul be positione both horiMontally an verti%ally at the %enter o$ the %ontainer

All o$ these properties take a simple boolean value &true or false'. /ote that the pa ing o$ the =i get is taken into a%%ount =hen per$orming these various alignments. 4he alignments are base on the =i get6s overall %ell &%ombination o$ its natural spa%e plus the pa ing'.

Relative Notation in Properties


4he remaining properties o$ relevan%e to Relative+ayout take as a value the i entity o$ a =i get in the %ontainer. 4o o this* ,. !ut i enti$iers &android#id attributes' on all elements that you =ill nee to a ress, o$ the $orm 9Bid/...

04
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

2. Re$eren%e other =i gets using the same i enti$ier value =ithout the plus sign &9id/...' (or e:ample, i$ Wi get A is i enti$ie as 9Bid/widget_a, Wi get . %an re$er to Wi get A in one o$ its o=n properties via the i enti$ier 9id/widget_a.

Positions Relative to Other Widgets


4here are $our properties that %ontrol position o$ a =i get vis a vis other =i gets*

in i%ates that the =i get shoul above the =i get re$eren%e in the property
android#layout_above android#layout_below

be pla%e be pla%e

in i%ates that the =i get shoul belo= the =i get re$eren%e in the property
android#layout_to+eft,f

in i%ates that the =i get shoul be pla%e to the le$t o$ the =i get re$eren%e in the property in i%ates that the =i get shoul be pla%e to the right o$ the =i get re$eren%e in the property
android#layout_toRig&t,f

.eyon those $our, there are $ive a itional properties that %an %ontrol one =i get6s alignment relative to another*

in i%ates that the =i get6s top shoul aligne =ith the top o$ the =i get re$eren%e in the property
android#layout_align-op

be

android#layout_align6ottom in i%ates that the =i get6s bottom shoul be aligne =ith the bottom o$ the =i get re$eren%e in the property

in i%ates that the =i get6s le$t shoul be aligne =ith the le$t o$ the =i get re$eren%e in the property
android#layout_align+eft android#layout_alignRig&t

in i%ates that the =i get6s right shoul be aligne =ith the right o$ the =i get re$eren%e in the property
android#layout_align6aseline

in i%ates that the baselines o$ the t=o

=i gets shoul be aligne

07
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

4he last one is use$ul $or aligning labels an $iel s so that the te:t appears QnaturalQ. #in%e $iel s have a bo: aroun them an labels o not, android#layout_align-op =oul align the top o$ the $iel 6s bo: =ith the top o$ the label, =hi%h =ill %ause the te:t o$ the label to be higher on2s%reen than the te:t entere into the $iel . #o, i$ =e =ant Wi get . to be positione to the right o$ Wi get A, in the DML element $or Wi get ., =e nee to in%lu e android#layout_toRig&t! $! %9id/widget_a% &assuming 9id/widget_a is the i entity o$ Wi get A'.

Order of Evaluation
What makes this even more %ompli%ate is the or er o$ evaluation. An roi makes a single pass through your DML layout an %omputes the siMe an position o$ ea%h =i get in se;uen%e. 4his has a $e= rami$i%ations*

@ou %annot re$eren%e a =i get that has not been e$ine in the $ile yet @ou %are$ul that any uses o$ fill_parent in android#layout_widt& or android#layout_&eig&t o not Qeat upQ all the spa%e be$ore subse;uent =i gets have been e$ine must be

E. mple
With all that in min , let6s e:amine a typi%al Q$ormQ =ith a $iel , a label, plus a pair o$ buttons labele Q>EQ an QCan%elQ. )ere is the DML layout, pulle $rom the Relative sample proNe%t*
">xml!version$%?.@%!encoding$%utf-A%>' "Relative+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%wrap_content% !!android#padding$%Lpx%' !!"-ext7iew!android#id$%9Bid/label% !!!!android#layout_widt&$%wrap_content% !!!!android#layout_&eig&t$%wrap_content% !!!!android#text$%2R+#%

09
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

!!!!android#padding-op$%?Lpx%/' !!"*dit-ext !!!!android#id$%9Bid/entry% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!android#layout_toRig&t,f$%9id/label% !!!!android#layout_align6aseline$%9id/label%/' !!"6utton !!!!android#id$%9Bid/o % !!!!android#layout_widt&$%wrap_content% !!!!android#layout_&eig&t$%wrap_content% !!!!android#layout_below$%9id/entry% !!!!android#layout_alignRig&t$%9id/entry% !!!!android#text$%,M%!/' !!"6utton !!!!android#layout_widt&$%wrap_content% !!!!android#layout_&eig&t$%wrap_content% !!!!android#layout_to+eft,f$%9id/o % !!!!android#layout_align-op$%9id/o % !!!!android#text$%)ancel%!/' "/Relative+ayout'

(irst, =e open up the Relative+ayout. -n this %ase, =e =ant to use the $ull =i th o$ the s%reen &android#layout_widt&!$!%fill_parent%', only as mu%h height as =e nee &android#layout_&eig&t!$!%wrap_content%', an have a B2 pi:el pa bet=een the boun aries o$ the %ontainer an its %ontents &android#padding!$!%Lpx%'. /e:t, =e e$ine the label, =hi%h is $airly basi%, e:%ept $or its o=n ,32pi:el pa ing &android#padding!$!%?Npx%'. More on that in a moment. A$ter that, =e a in the $iel . We =ant the $iel to be to the right o$ the label, have their te:ts aligne along the baseline, an $or the $iel to take up the rest o$ this Qro=Q in the layout. 4hose are han le by three properties*
android#layout_toRig&t!$!%9id/label% android#layout_align6aseline!$!%9id/label% android#layout_align6aseline!$!%9id/label%

-$ =e =ere to skip the ,32pi:el pa ing on the label, =e =oul $in that the top o$ the $iel is %lippe o$$. 4hat6s be%ause o$ the ,32pi:el pa ing on the %ontainer itsel$. 4he android#layout_align6aseline ! $ ! %9id/label% simply aligns the baselines o$ the label an $iel . 4he label, by e$ault, has its top
1;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

aligne =ith the top o$ the parent. .ut the label is shorter than the $iel be%ause o$ the $iel 6s bo:. #in%e the $iel is epen ent on the label6s position, an the label6s position is alrea y e$ine &be%ause it appeare $irst in the DML', the $iel =in s up being too high an has the top o$ its bo: %lippe o$$ by the %ontainer6s pa ing. @ou may $in yoursel$ running into these sorts o$ problems as you try to get your Relative+ayout to behave the =ay you =ant it to. 4he solution to this %onun rum, use in the DML layout sho=n above, is to give the label ,3 pi:els6 =orth o$ pa ing on the top. 4his pushes the label o=n $ar enough that the $iel =ill not get %lippe . )ere are some QsolutionsQ that o not =ork*

@ou %annot use android#layout_align1arent-op on the $iel , be%ause you %annot have t=o properties that both attempt to set the verti%al position o$ the $iel . -n this %ase, android#layout_align1arent-op! %on$li%ts =ith the later android#layout_align6aseline!$!%9id/label%! property, an the last one in =ins. #o, you either have the top aligne properly or the baselines aligne properly, but not both. @ou %annot e$ine the $iel $irst, then put the label to the le$t o$ the $iel , be%ause you %annot Q$or=ar re$eren%eQ labele =i gets O you must e$ine the =i get be$ore you %an re$eren%e it by its -A.

7oing ba%k to the e:ample, the >E button is set to be belo= the $iel &android#layout_below!$!%9id/entry%' an have its right si e align =ith the right si e o$ the $iel &android#layout_alignRig&t ! $ ! %9id/entry%'. 4he Can%el button is set to be to the le$t o$ the >E button &android#layout_to+eft! $ ! %9id/o %' an have its top aligne =ith the >E button &android#layout_align-op!$!%9id/o %'. With no %hanges to the auto2generate Gava %o e, the emulator gives us*

1*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

!igure *1< The 3elative ayout/emo sample application

Tabula 3asa
-$ you like )4ML tables, sprea sheet gri s, an the like, you =ill like An roi 6s -able+ayout O it allo=s you to position your =i gets in a gri to your spe%i$i%ations. @ou %ontrol the number o$ ro=s an %olumns, =hi%h %olumns might shrink or stret%h to a%%ommo ate their %ontents, an so on.
-able+ayout

=orks in %onNun%tion =ith -ableRow. -able+ayout %ontrols the overall behavior o$ the %ontainer, =ith the =i gets themselves poure into one or more -ableRow %ontainers, one per ro= in the gri .

Concepts nd Properties
(or all this to =ork, =e nee to $igure out ho= =i gets =ork =ith ro=s an %olumns, plus ho= to han le =i gets that live outsi e o$ ro=s.

1%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

Putting Cells in Rows


Ro=s are e%lare by you, the eveloper, by putting =i gets as %hil ren o$ a -ableRow insi e the overall -able+ayout. @ou, there$ore, %ontrol ire%tly ho= many ro=s appear in the table. 4he number o$ %olumns are etermine number o$ %olumns in an in ire%t $ashion. by An roi P you %ontrol the

(irst, there =ill be at least one %olumn per =i get in your longest ro=. #o i$ you have three ro=s, one =ith t=o =i gets, one =ith three =i gets, an one =ith $our =i gets, there =ill be at least $our %olumns. )o=ever, a =i get %an take up more than one %olumn by in%lu ing the android#layout_span property, in i%ating the number o$ %olumns the =i get spans. 4his is akin to the colspan attribute one $in s in table %ells in )4ML*
"-ableRow' !!"-ext7iew!android#text$%2R+#%!/' !!"*dit-ext !!!!android#id$%9Bid/entry% !!!!android#layout_span$%I%/' "/-ableRow'

-n the above DML layout $ragment, the $iel spans three %olumns. >r inarily, =i gets are put into the $irst available %olumn. -n the above $ragment, the label =oul go in the $irst %olumn &%olumn @, as %olumns are %ounte starting $rom @', an the $iel =oul go into a spanne set o$ three %olumns &%olumns ? through I'. )o=ever, you %an put a =i get into a i$$erent %olumn via the android#layout_column property, spe%i$ying the @2 base %olumn the =i get belongs to*
"-ableRow' !!"6utton !!!!android#id$%9Bid/cancel% !!!!android#layout_column$%H% !!!!android#text$%)ancel%!/' !!"6utton!android#id$%9Bid/o %!android#text$%,M%!/' "/-ableRow'

1Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

-n the pre%e ing DML layout $ragment, the Can%el button goes in the thir %olumn &%olumn H'. 4he >E button then goes into the ne:t available %olumn, =hi%h is the $ourth %olumn.

Non-Row Children of Ta le!ayout


/ormally, -able+ayout %ontains only -ableRow elements as imme iate %hil ren. )o=ever, it is possible to put other =i gets in bet=een ro=s. (or those =i gets, -able+ayout behaves a bit like +inear+ayout =ith verti%al orientation. 4he =i gets automati%ally have their =i th set to fill_parent, so they =ill $ill the same spa%e that the longest ro= oes. >ne pattern $or this is to use a plain 7iew as a pi:el2high blue bar a%ross the =i th o$ the table'. ivi er &e.g., "7iew! as a t=o2

android#layout_&eig&t!$!%Hpx%!android#bac ground!$!%D@@@@EE%!/'

"tret#h$ "hrin%$ and Collapse


.y e$ault, ea%h %olumn =ill be siMe a%%or ing to the QnaturalQ siMe o$ the =i est =i get in that %olumn &taking spanne %olumns into a%%ount'. #ometimes, though, that oes not =ork out very =ell, an you nee more %ontrol over %olumn behavior. @ou %an pla%e an android#stretc&)olumns property on the -able+ayout. 4he value shoul be a single %olumn number &again, @2base ' or a %omma2 elimite list o$ %olumn numbers. 4hose %olumns =ill be stret%he to take up any available spa%e yet on the ro=. 4his helps i$ your %ontent is narro=er than the available spa%e. Conversely, you %an pla%e a android#s&rin )olumns property on the -able+ayout. Again, this shoul be a single %olumn number or a %omma2 elimite list o$ %olumn numbers. 4he %olumns liste in this property =ill try to =or 2=rap their %ontents to re u%e the e$$e%tive =i th o$ the %olumn O by e$ault, =i gets are not =or 2=rappe . 4his helps i$ you have %olumns =ith potentially =or y %ontent that might %ause some %olumns to be pushe o$$ the right si e o$ the s%reen.
1$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

@ou %an also leverage an android#collapse)olumns property on the -able+ayout, again =ith a %olumn number or %omma2 elimite list o$ %olumn numbers. 4hese %olumns =ill start out Q%ollapse Q, meaning they =ill be part o$ the table in$ormation but =ill be invisible. !rogrammati%ally, you %an %ollapse an un2%ollapse %olumns by %alling set)olumn)ollapsed:;! on the -able+ayout. @ou might use this to allo= users to %ontrol =hi%h %olumns are o$ importan%e to them an shoul be sho=n versus =hi%h ones are less important an %an be hi en. @ou also %ontrol stret%hing an shrinking set)olumnStretc&able:; an set)olumnS&rin able:;. %an at runtime via

E. mple
-able+ayout

4he DML layout $ragments sho=n above, =hen %ombine , give us a ren ition o$ the Q$ormQ =e %reate $or Relative+ayout, =ith the a ition o$ a ivi er line bet=een the labelU$iel an the t=o buttons &$oun in the -able emo'*
">xml!version$%?.@%!encoding$%utf-A%>' "-able+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!android#stretc&)olumns$%?%' !!"-ableRow' !!!!"-ext7iew !!!!!!!!android#text$%2R+#%!/' !!!!"*dit-ext!android#id$%9Bid/entry% !!!!!!android#layout_span$%I%/' !!"/-ableRow' !!"7iew !!!!android#layout_&eig&t$%Hpx% !!!!android#bac ground$%D@@@@EE%!/' !!"-ableRow' !!!!"6utton!android#id$%9Bid/cancel% !!!!!!android#layout_column$%H% !!!!!!android#text$%)ancel%!/' !!!!"6utton!android#id$%9Bid/o % !!!!!!android#text$%,M%!/' !!"/-ableRow' "/-able+ayout'

10
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

When %ompile against the generate Gava %o e an run on the emulator, =e get*

!igure *4< The Table ayout/emo sample application

Scroll)ork
!hone s%reens ten to be small, =hi%h re;uires evelopers to use some tri%ks to present a lot o$ in$ormation in the limite available spa%e. >ne tri%k $or oing this is to use s%rolling, so only part o$ the in$ormation is visible at one time, the rest available via s%rolling up or o=n. is a %ontainer that provi es s%rolling $or its %ontents. @ou %an take a layout that might be too big $or some s%reens, =rap it in a Scroll7iew, an still use your e:isting layout logi%. -t Nust so happens that the user %an only see part o$ your layout at one time, the rest available via s%rolling.
Scroll7iew

(or e:ample, here is a Scroll7iew use in an DML layout $ile &$rom the Scroll! emo'*

11
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

">xml!version$%?.@%!encoding$%utf-A%>' "Scroll7iew !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%wrap_content%' !!"-able+ayout !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%fill_parent% !!!!android#stretc&)olumns$%@%' !!!!"-ableRow' !!!!!!"7iew !!!!!!!!android#layout_&eig&t$%A@px% !!!!!!!!android#bac ground$%D@@@@@@%/' !!!!!!"-ext7iew!android#text$%D@@@@@@% !!!!!!!!android#padding+eft$%Opx% !!!!!!!!android#layout_gravity$%center_vertical%!/' !!!!"/-ableRow' !!!!"-ableRow' !!!!!!"7iew !!!!!!!!android#layout_&eig&t$%A@px% !!!!!!!!android#bac ground$%DOO@@@@%!/' !!!!!!"-ext7iew!android#text$%DOO@@@@% !!!!!!!!android#padding+eft$%Opx% !!!!!!!!android#layout_gravity$%center_vertical%!/' !!!!"/-ableRow' !!!!"-ableRow' !!!!!!"7iew !!!!!!!!android#layout_&eig&t$%A@px% !!!!!!!!android#bac ground$%DAAOO@@%!/' !!!!!!"-ext7iew!android#text$%DAAOO@@% !!!!!!!!android#padding+eft$%Opx% !!!!!!!!android#layout_gravity$%center_vertical%!/' !!!!"/-ableRow' !!!!"-ableRow' !!!!!!"7iew !!!!!!!!android#layout_&eig&t$%A@px% !!!!!!!!android#bac ground$%DaaAAOO%!/' !!!!!!"-ext7iew!android#text$%DaaAAOO% !!!!!!!!android#padding+eft$%Opx% !!!!!!!!android#layout_gravity$%center_vertical%!/' !!!!"/-ableRow' !!!!"-ableRow' !!!!!!"7iew !!!!!!!!android#layout_&eig&t$%A@px% !!!!!!!!android#bac ground$%DffaaAA%!/' !!!!!!"-ext7iew!android#text$%DffaaAA% !!!!!!!!android#padding+eft$%Opx% !!!!!!!!android#layout_gravity$%center_vertical%!/' !!!!"/-ableRow' !!!!"-ableRow' !!!!!!"7iew !!!!!!!!android#layout_&eig&t$%A@px% !!!!!!!!android#bac ground$%Dffffaa%!/' !!!!!!"-ext7iew!android#text$%Dffffaa% !!!!!!!!android#padding+eft$%Opx% 14
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

!!!!!!!!android#layout_gravity$%center_vertical%!/' !!!!"/-ableRow' !!!!"-ableRow' !!!!!!"7iew !!!!!!!!android#layout_&eig&t$%A@px% !!!!!!!!android#bac ground$%Dffffff%!/' !!!!!!"-ext7iew!android#text$%Dffffff% !!!!!!!!android#padding+eft$%Opx% !!!!!!!!android#layout_gravity$%center_vertical%!/' !!!!"/-ableRow' !!"/-able+ayout' "/Scroll7iew'

Without the Scroll7iew, the table =oul take up at least B30 pi:els &1 ro=s at 80 pi:els ea%h, base on the 7iew e%larations'. 4here may be some evi%es =ith s%reens %apable o$ sho=ing that mu%h in$ormation, but many =ill be smaller. 4he Scroll7iew lets us keep the table as2is, but only present part o$ it at a time. >n the sto%k An roi emulator, =hen the a%tivity is $irst vie=e , you see*

!igure *7< The ScrollFie)/emo sample application

/oti%e ho= only $ive ro=s an part o$ the si:th are visible. .y pressing the upU o=n buttons on the ire%tional pa , you %an s%roll up an o=n to see
17
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith Containers

the remaining ro=s. Also note ho= the right si e o$ the %ontent gets %lippe by the s%rollbar O be sure to put some pa ing on that si e or other=ise ensure your o=n %ontent oes not get %lippe in that $ashion.

19
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER /

>sing Selection Widgets

.a%k in the %hapter on basi% =i gets, you sa= ho= $iel s %oul have %onstraints pla%e upon them to limit possible input, su%h as numeri%2only or phone2number2only. 4hese sorts o$ %onstraints help users Qget it rightQ =hen entering in$ormation, parti%ularly on a mobile evi%e =ith %rampe keyboar s. >$ %ourse, the ultimate in %onstraine input is to sele%t a %hoi%e $rom a set o$ items, su%h as the ra io buttons seen earlier. Classi% "- toolkits have listbo:es, %ombobo:es, rop2 o=n lists, an the like $or that very purpose. An roi has many o$ the same sorts o$ =i gets, plus others o$ parti%ular interest $or mobile evi%es &e.g., the 0allery $or e:amining save photos'. Moreover, An roi o$$ers a $le:ible $rame=ork $or etermining =hat %hoi%es are available in these =i gets. #pe%i$i%ally, An roi o$$ers a $rame=ork o$ ata a apters that provi e a %ommon inter$a%e to sele%tion lists ranging $rom stati% arrays to atabase %ontents. #ele%tion vie=s O =i gets $or presenting lists o$ %hoi%es O are han e an a apter to supply the a%tual %hoi%es.

(dapting to the Circumstances


-n the abstra%t, a apters provi e a %ommon inter$a%e to multiple isparate A!-s. More spe%i$i%ally, in An roi 6s %ase, a apters provi e a %ommon inter$a%e to the ata mo el behin a sele%tion2style =i get, su%h as a listbo:.
4*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

4his use o$ Gava inter$a%es is $airly %ommon &e.g., GavaU#=ing6s mo el a apters $or =-able', an Gava is $ar $rom the only environment o$$ering this sort o$ abstra%tion &e.g., (le:6s DML ata2bin ing $rame=ork a%%epts DML inline as stati% ata or retrieve $rom the -nternet'. An roi 6s a apters are responsible $or provi ing the roster o$ ata $or a sele%tion =i get plus %onverting in ivi ual elements o$ ata into spe%i$i% vie=s to be isplaye insi e the sele%tion =i get. 4he latter $a%et o$ the a apter system may soun a little o , but in reality it is not that i$$erent $rom other 7"- toolkits6 =ays o$ overri ing e$ault isplay behavior. (or e:ample, in GavaU#=ing, i$ you =ant a =+ist2ba%ke listbo: to a%tually be a %he%klist &=here in ivi ual ro=s are a %he%kbo: plus label, an %li%ks a Nust the state o$ the %he%kbo:', you inevitably =in up %alling set)ellRenderer:;! to supply your o=n +ist)ellRenderer, =hi%h in turn %onverts strings $or the list into =)&ec 6ox2plus2=+abel %omposite =i gets.

+sin! Arr yAd pter


4he easiest a apter to use is ArrayAdapter O all you nee to o is =rap one o$ these aroun a Gava array or java.util.+ist instan%e, an you have a $ully2 $un%tioning a apter*
StringPQ!items$8%t&is%G!%is%G!%a%G !!!!!!!!!!!!!!!!%really%G!%silly%G!%list%<5 new!ArrayAdapter"String':t&isG !!android.R.layout.simple_list_item_?G!items;5

4he ArrayAdapter %onstru%tor takes three parameters*


4he )ontext to use &typi%ally this =ill be your a%tivity instan%e' 4he resour%e -A o$ a vie= to use &su%h as a built2in system resour%e -A, as sho=n above' 4he a%tual array or list o$ items to sho=

.y e$ault, the ArrayAdapter =ill invoke toString:; on the obNe%ts in the list an =rap ea%h o$ those strings in the vie= esignate by the supplie resour%e. android.R.layout.simple_list_item_? simply turns those strings
4%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

into -ext7iew obNe%ts. 4hose -ext7iew =i gets, in turn, =ill be sho=n the list or spinner or =hatever =i get uses this ArrayAdapter. @ou %an sub%lass ArrayAdapter an vie=s* overri e get7iew:; to Qroll your o=nQ

public!7iew!getView:int!positionG!7iew!convert7iewG !!!!!!!!!!!!!!!!!!!!!7iew0roup!parent;!8 !!if!:convert7iew$$null;!8 !!!!convert7iew$new!TextView:t&is;5 !!< !!convert7iew.setText:!uildString"or:position;;5 !!return:convert7iew;5 <

)ere, get7iew:; re%eives three parameters*


4he in e: o$ the item in the array to sho= in the vie= An e:isting vie= to up ate =ith the ata $or this position &i$ one alrea y e:iste , su%h as $rom s%rolling O i$ null, you nee to instantiate your o=n' 4he =i get that =ill %ontain this vie=, i$ nee e $or instantiating the vie=

-n the e:ample sho=n above, the a apter still returns a -ext7iew, but uses a i$$erent behavior $or etermining the string that goes in the vie=. A later %hapter =ill %over $an%ier +ist7iews.

0ther 1ey Ad pters


)ere are some other a apters in An roi that you =ill likely use, some o$ =hi%h =ill be %overe in greater etail later in this book*

%onverts a )ursor, typi%ally $rom a %ontent provi er, into something that %an be isplaye in a sele%tion vie=
)ursorAdapter SimpleAdapter %onverts

ata $oun in DML resour%es

4Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

ActivityAdapter

an Activity.conAdapter provi e you =ith the names or i%ons o$ a%tivities that %an be invoke upon a parti%ular intent

ists of 5aughty and 5ice


4he %lassi% listbo: =i get in An roi is kno=n as +ist7iew. -n%lu e one o$ these in your layout, invoke setAdapter:; to supply your ata an %hil vie=s, an atta%h a listener via set,n.temSelected+istener:; to $in out =hen the sele%tion has %hange . With that, you have a $ully2$un%tioning listbo:. )o=ever, i$ your a%tivity is ominate by a single list, you might =ell %onsi er %reating your a%tivity as a sub%lass o$ +istActivity, rather than the regular Activity base %lass. -$ your main vie= is Nust the list, you o not even nee to supply a layout O +istActivity =ill %onstru%t a $ull2s%reen list $or you. -$ you o =ant to %ustomiMe the layout, you %an, so long as you i enti$y your +ist7iew as 9android#id/list, so +istActivity kno=s =hi%h =i get is the main list $or the a%tivity. (or e:ample, here is a layout pulle $rom the +ist sample proNe%t*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent%! !!android#layout_&eig&t$%fill_parent%!' !!"-ext7iew !!!!android#id$%9Bid/selection% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content%/' !!"+ist7iew !!!!android#id$%9android#id/list% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent% !!!!android#drawSelector,n-op$%false% !!!!/' "/+inear+ayout'

-t is Nust a list =ith a label on top to sho= the %urrent sele%tion.

4$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

4he Gava %o e to %on$igure the list an %onne%t the list =ith the label is*
public!class!+ist7iewDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G!%purus%<5 !! !!/RR!)alled!wit&!t&e!activity!is!first!created.!R/ !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!setList#dapter:new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G !!!!!!!!!!!!!!!!!!!!!!!items;;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG!int!positionG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!long!id;!8 !!!selection.setText:itemsPpositionQ;5 !!< <

With +istActivity, you %an set the list a apter via set+istAdapter:; O in this %ase, provi ing an ArrayAdapter =rapping an array o$ nonsense strings. 4o $in out =hen the list sele%tion %hanges, overri e on+ist.tem)lic :; an take appropriate steps base on the supplie %hil vie= an position &in this %ase, up ating the label =ith the te:t $or that position'. 4he resultsC

40
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

!igure *9< The istFie)/emo sample application

Spin Control
-n An roi , the Spinner is the e;uivalent o$ the rop2 o=n sele%tor you might $in in other toolkits &e.g., =)ombo6ox in GavaU#=ing'. !ressing the le$t an right buttons on the A2pa iterates over %hil ren. !ressing the %enter button on the A2pa isplays, by e$ault, a small list &akin to a +ist7iew' appears to sho= a $e= items at a time, instea o$ the one2item2at2a2time perspe%tive the une:pan e Spinner itsel$ provi es. As =ith +ist7iew, you provi e the a apter $or ata an %hil vie=s via setAdapter:; an hook in a listener obNe%t $or sele%tions via set,n.temSelected+istener:;. -$ you =ant to tailor the vie= use =hen isplaying the rop2 o=n perspe%tive, you nee to %on$igure the a apter, not the Spinner =i get. "se the setDropDown7iewResource:; metho to supply the resour%e -A o$ the vie= to use.

41
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

(or e:ample, %ulle $rom the Spinner sample proNe%t, here is an DML layout $or a simple vie= =ith a Spinner*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"-ext7iew !!!!android#id$%9Bid/selection% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!/' !!"Spinner!android#id$%9Bid/spinner% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!android#drawSelector,n-op$%true% !!/' "/+inear+ayout'

4his is the same vie= as sho=n in the previous se%tion, Nust =ith a Spinner! instea o$ a +ist7iew. 4he Spinner property android#drawSelector,n-op! %ontrols =hether the arro=s are ra=n on the sele%tor button on the right si e o$ the Spinner "-. 4o populate an use the Spinner, =e nee some Gava %o e*
public!class!SpinnerDemo!extends!Activity !!implements!Adapter7iew.,n.temSelected+istener!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G!%purus%<5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!!! !!!!Spinner!spin$:Spinner;findViewById:R.id.spinner;5 !!!!spin.setOnItemSelectedListener:t&is;5 !!!! !!!!ArrayAdapter"String'!aa$new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_spinner_itemG

44
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!items;5 !!!! !!!!aa.setDropDownView$esource: !!!!!!android.R.layout.simple_spinner_dropdown_item;5 !!!!spin.set#dapter:aa;5 !!< !! !!public!void!onItemSelected:Adapter7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!long!id;!8 !!!!selection.setText:itemsPpositionQ;5 !!< !! !!public!void!on%othingSelected:Adapter7iew!parent;!8 !!!!selection.setText:%%;5 !!< <

)ere, =e atta%h the a%tivity itsel$ as the sele%tion listener &spin.set,n.temSelected+istener:t&is;'. 4his =orks be%ause the a%tivity implements the ,n.temSelected+istener inter$a%e. We %on$igure the a apter not only =ith the list o$ $ake =or s, but also =ith a spe%i$i% resour%e to use $or the rop2 o=n vie= &via aa.setDropDown7iewResource:;'. Also note the use o$ android.R.layout.simple_spinner_item as the built2in 7iew $or sho=ing items in the spinner itsel$. (inally, =e implement the %allba%ks re;uire by ,n.temSelected+istener to a Nust the sele%tion label base on user input. What =e get is*

47
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

!igure %;< The Spinner/emo sample application6 as initially launched

!igure %*< The same application6 )ith the spinner drop"do)n list displayed

49
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

'rid .our ions #,r Something ike That<<<&


As the name suggests, 0rid7iew gives you a t=o2 imensional gri o$ items to %hoose $rom. @ou have mo erate %ontrol over the number an siMe o$ the %olumnsP the number o$ ro=s is ynami%ally etermine base on the number o$ items the supplie a apter says are available $or vie=ing. 4here are a $e= properties =hi%h, =hen %ombine , etermine the number o$ %olumns an their siMes*

spells out ho= many %olumns there are, or, i$ you supply a value o$ auto_fit, An roi =ill %ompute the number o$ %olumns base on available spa%e an the properties liste belo=.
android#num)olumns

an its %ounterpart in i%ate ho= mu%h =hitespa%e there shoul be bet=een items in the gri .
android#verticalSpacing android#&ori(ontalSpacing android#columnCidt&

in i%ates ho= many pi:els =i e ea%h %olumn

shoul be.

i%ates, $or gri s =ith auto_fit $or shoul happen $or any available spa%e not taken up by %olumns or spa%ing O this shoul be columnCidt& to have the %olumns take up available spa%e or spacingCidt& to have the =hitespa%e bet=een %olumns absorb e:tra spa%e. (or e:ample, suppose the s%reen is ?20 pi:els =i e, an =e have android#columnCidt& set to ?@@ an android#&ori(ontalSpacing set to L. 4hree %olumns =oul use ?,0 pi:els &three %olumns o$ ,00 pi:els an t=o =hitespa%es o$ B pi:els'. With android#stretc&Mode set to columnCidt&, the three %olumns =ill ea%h e:pan by ?2< pi:els to use up the remaining ,0 pi:els. With android#stretc&Mode set to spacingCidt&, the t=o =hitespa%es =ill ea%h gro= by B pi:els to %onsume the remaining ,0 pi:els.

android#stretc&Mode in android#num)olumns, =hat

>ther=ise, the 0rid7iew =orks mu%h like any other sele%tion =i get O use setAdapter:; to provi e the ata an %hil vie=s, invoke set,n.temSelected+istener:; to register a sele%tion listener, et%.

7;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

(or e:ample, here is a DML layout $rom the 0rid sample proNe%t, sho=ing a 0rid7iew %on$iguration*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"-ext7iew !!!!android#id$%9Bid/selection% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!/' !!"0rid7iew !!!!android#id$%9Bid/grid% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent% !!!!android#verticalSpacing$%ILpx% !!!!android#&ori(ontalSpacing$%Lpx% !!!!android#num)olumns$%auto_fit% !!!!android#columnCidt&$%?@@px% !!!!android#stretc&Mode$%columnCidt&% !!!!android#gravity$%center% !!!!/' "/+inear+ayout'

(or this gri , =e take up the entire s%reen e:%ept $or =hat our sele%tion label re;uires. 4he number o$ %olumns is %ompute by An roi &android#num)olumns ! $ ! %auto_fit%' base on B2pi:el horiMontal spa%ing &android#&ori(ontalSpacing!$!%L%', ,002pi:el %olumns &android#columnCidt&! $ ! %?@@%', =ith the %olumns absorbing any QslopQ =i th le$t over &android#stretc&Mode!$!%columnCidt&%'. 4he Gava %o e to %on$igure the 0rid7iew is*
public!class!0ridDemo!extends!Activity !!implements!Adapter7iew.,n.temSelected+istener!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G!%purus%<5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8

7*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

!!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!!! !!!!0rid7iew!g$:0rid7iew;!findViewById:R.id.grid;5 !!!!g.set#dapter:new!"unnyLooking#dapter:t&isG !!!!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G !!!!!!!!!!!!!!!!!!!!!!!items;;5 !!!!g.setOnItemSelectedListener:t&is;5 !!< !! !!public!void!onItemSelected:Adapter7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!long!id;!8 !!!!selection.setText:itemsPpositionQ;5 !!< !! !!public!void!on%othingSelected:Adapter7iew!parent;!8 !!!!selection.setText:%%;5 !!< !! !!private!class!Eunny+oo ingAdapter!extends!ArrayAdapter!8 !!!!)ontext!ctxt5 !!!! !!!!"unnyLooking#dapter:)ontext!ctxtG!int!resourceG !!!!!!!!!!!!!!!!!!!!!!!StringPQ!items;!8 !!!!!!super:ctxtG!resourceG!items;5 !!!!!! !!!!!!t&is.ctxt$ctxt5 !!!!< !!!! !!!!public!7iew!getView:int!positionG!7iew!convert7iewG !!!!!!!!!!!!!!!!!!!!!!!!!7iew0roup!parent;!8 !!!!!!-ext7iew!label$:-ext7iew;convert7iew5 !!!!!! !!!!!!if!:convert7iew$$null;!8 !!!!!!!!convert7iew$new!TextView:ctxt;5 !!!!!!!!label$:-ext7iew;convert7iew5 !!!!!!< !!!!!! !!!!!!label.setText:itemsPpositionQ;5 !!!!!! !!!!!!return:convert7iew;5 !!!!< !!< <

(or the gri %ells, rather than using auto2generate -ext7iew =i gets as in the previous se%tions, =e %reate our o=n vie=s, by sub%lassing ArrayAdapter! an overri ing get7iew:;. -n this %ase, =e =rap the $unny2looking strings in our o=n -ext7iew =i gets, Nust to be i$$erent. -$ get7iew:; re%eives a

7%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

-ext7iew,

=e Nust reset its te:tP other=ise, =e %reate a ne= -ext7iew instan%e an populate it. With the ?B2pi:el verti%al spa%ing $rom the DML layout &android#verticalSpacing!$!%IL%', the gri over$lo=s the boun aries o$ the emulator6s s%reen*

!igure %%< The 'rid/emo sample application6 as initially launched

7Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

!igure %-< The same application6 scrolled to the bottom of the grid

!ieldsH 5o) With -0I ess Typing!


4he Auto)omplete-ext7iew is sort o$ a hybri bet=een the *dit7iew &$iel ' an the Spinner. With auto2%ompletion, as the user types, the te:t is treate as a pre$i: $ilter, %omparing the entere te:t as a pre$i: against a list o$ %an i ates. Mat%hes are sho=n in a sele%tion list that, like =ith Spinner, $ol s o=n $rom the $iel . 4he user %an either type out an entry &e.g., something not in the list' or %hoose an entry $rom the list to be the value o$ the $iel . sub%lasses *dit7iew, so you %an %on$igure all the stan ar look2an 2$eel aspe%ts, su%h as $ont $a%e an %olor.
Auto)omplete-ext7iew

-n a ition, Auto)omplete-ext7iew has a android#completion-&res&old! property, to in i%ate the minimum number o$ %hara%ters a user must enter be$ore the list $iltering begins. @ou %an give Auto)omplete-ext7iew an a apter %ontaining the list o$ %an i ate values via setAdapter:;. )o=ever, sin%e the user %oul type
7$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

something not in the list, Auto)omplete-ext7iew oes not support sele%tion listeners. -nstea , you %an register a -extCatc&er, like you %an =ith any *dit7iew, to be noti$ie =hen the te:t %hanges. 4hese events =ill o%%ur either be%ause o$ manual typing or $rom a sele%tion $rom the rop2 o=n list. .elo= =e have a $amiliar2looking DML layout, this time %ontaining an Auto)omplete-ext7iew &pulle $rom the Auto)omplete sample appli%ation'*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"-ext7iew !!!!android#id$%9Bid/selection% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!/' !!"Auto)omplete-ext7iew!android#id$%9Bid/edit% !!!!!!android#layout_widt&$%fill_parent% !!!!!!android#layout_&eig&t$%wrap_content% !!!!!!android#completion-&res&old$%I%/' "/+inear+ayout'

4he %orrespon ing Gava %o e is*


public!class!Auto)ompleteDemo!extends!Activity !!implements!-extCatc&er!8 !!-ext7iew!selection5 !!Auto)omplete-ext7iew!edit5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G!%purus%<5 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!!!edit$:Auto)omplete-ext7iew;findViewById:R.id.edit;5 !!!!edit.addTextChangedListener:t&is;5 !!!! !!!!edit.set#dapter:new!ArrayAdapter"String':t&isG

70
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

!!!!!!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G !!!!!!!!!!!!!!!!!!!!!!!!!items;;5 !!< !! !!public!void!onTextChanged:)&arSeJuence!sG!int!startG!int!beforeG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!count;!8 !!!!selection.setText:edit.getText:;;5 !!< !! !!public!void!!eforeTextChanged:)&arSeJuence!sG!int!startG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!countG!int!after;!8 !!!!//!needed!for!interfaceG!but!not!used !!< !! !!public!void!afterTextChanged:*ditable!s;!8 !!!!//!needed!for!interfaceG!but!not!used !!< <

4his time, our a%tivity implements -extCatc&er, =hi%h means our %allba%ks are on-ext)&anged:; an before-ext)&anged:;. -n this %ase, =e are only intereste in the $ormer, an =e up ate the sele%tion label to mat%h the Auto)omplete-ext7iew6s %urrent %ontents. )ere =e have the results*

!igure %$< The (utoComplete/emo sample application6 as initially launched

71
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

!igure %0< The same application6 after a fe) matching letters )ere entered6 sho)ing the auto"complete drop"do)n

!igure %1< The same application6 after the auto"complete value )as selected

74
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Selection Widgets

'alleries6 'ive ,r Take The (rt


4he 0allery =i get is not one or inarily $oun in 7"- toolkits. -t is, in e$$e%t, a horiMontally2lai 2out listbo:. >ne %hoi%e $ollo=s the ne:t a%ross the horiMontal plane, =ith the %urrently2sele%te item highlighte . >n an An roi evi%e, one rotates through the options through the le$t an right A2pa buttons. Compare to the +ist7iew, the 0allery takes up less s%reen spa%e =hile still sho=ing multiple %hoi%es at one time &assuming they are short enough'. Compare to the Spinner, the 0allery al=ays sho=s more than one %hoi%e at a time. 4he ;uintessential e:ample use $or the 0allery is image previe= O given a %olle%tion o$ photos or i%ons, the 0allery lets people previe= the pi%tures in the pro%ess o$ %hoosing one. Co e2=ise, the 0allery =orks mu%h like a Spinner or 0rid7iew. -n your DML layout, you have a $e= properties at your isposal*
android#spacing %ontrols the number o$

pi:els bet=een entries in the

list
android#spinnerSelector %ontrols =hat is use to in i%ate a sele%tion O this %an either be a re$eren%e to a Drawable &see the resour%es %hapter' or an R7. value in DAARR0066 or similar notation android#drawSelector,n-op in i%ates i$ the sele%tion bar &or Drawable' shoul be ra=n be$ore &false' or a$ter &true' ra=ing the sele%te %hil O i$ you %hoose true, be sure that your sele%tor has su$$i%ient

transparen%y to sho= the %hil through the sele%tor, other=ise users =ill not be able to rea the sele%tion

77
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 2

'etting !ancy With ists

4he humble +ist7iew is one o$ the most important =i gets in all o$ An roi , simply be%ause it is use so $re;uently. Whether %hoosing a %onta%t to %all or an email message to $or=ar or an ebook to rea , +ist7iew =i gets are employe in a =i e range o$ a%tivities. >$ %ourse, it =oul be ni%e i$ they =ere more than Nust plain te:t. 4he goo ne=s is that they %an be as $an%y as you =ant, =ithin the limitations o$ a mobile evi%e6s s%reen, o$ %ourse. )o=ever, making them $an%y takes some =ork an some $eatures o$ An roi that =e =ill %over in this %hapter. 4he material in this %hapter is base on the author6s posts to the .uil ing 6Aroi s %olumn on An roi 7uys.%om.

'etting To !irst Base


4he %lassi% An roi +ist7iew is a plain list o$ te:t V soli but uninspiring. 4his is be%ause all =e have han e to the +ist7iew is a bun%h o$ =or s in an array, an tol An roi to use a simple built2in layout $or pouring those =or s into a list.

79
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

)o=ever, you %an have a list =hose ro=s are ma e up o$ i%ons, or i%ons an te:t, or %he%kbo:es an te:t, or =hatever you =ant. -t is merely a matter o$ supplying enough ata to the a apter an helping the a apter to %reate a ri%her set o$ 7iew obNe%ts $or ea%h ro=. (or e:ample, suppose you =ant a +ist7iew =hose entries are ma e up o$ an i%on, $ollo=e by some te:t. @ou %oul %onstru%t a layout $or the ro= that looks like this, $oun in the Static sample proNe%t*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%wrap_content% !!android#orientation$%&ori(ontal% ' !!".mage7iew !!!!android#id$%9Bid/icon% !!!!android#layout_widt&$%HHpx% !!!!android#padding+eft$%Hpx% !!!!android#paddingRig&t$%Hpx% !!!!android#padding-op$%Hpx% !!!!android#layout_&eig&t$%wrap_content% !!!!android#src$%9drawable/o % !!/' !!"-ext7iew !!!!android#id$%9Bid/label% !!!!android#layout_widt&$%wrap_content% !!!!android#layout_&eig&t$%wrap_content% !!!!android#textSi(e$%OOsp% !!/' "/+inear+ayout'

4his layout uses a +inear+ayout to set up a ro=, =ith the i%on on the le$t an the te:t &in a ni%e big $ont' on the right. .y e$ault, though, An roi has no i ea that you =ant to use this layout =ith your +ist7iew. 4o make the %onne%tion, you nee to supply your Adapter =ith the resour%e -A o$ the %ustom layout sho=n above*
public!class!StaticDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G

9;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!!!!!!!!!%purus%<5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!setList#dapter:new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!!!!!!!!R.layout.rowG!R.id.labelG !!!!!!!!!!!!!!!!!!!!!!!items;;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!!long!id;!8 !!!selection.setText:itemsPpositionQ;5 !!< <

4his $ollo=s the general stru%ture $or the previous List+ie= sample. 4he key in this e:ample is that you have tol ArrayAdapter that you =ant to use your %ustom layout &R.layout.row' an that the -ext7iew =here the =or shoul go is kno=n as R.id.label =ithin that %ustom layout. 4he result is a +ist7iew =ith i%ons o=n the le$t si e. -n parti%ular, all the i%ons are the same*

9*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!igure %4< The Static/emo application

( /ynamic Presentation
4his te%hni;ue O supplying an alternate layout to use $or ro=s O han les simple %ases very ni%ely. )o=ever, it $alls o=n =hen you have more %ompli%ate s%enarios $or your ro=s, su%h as*

/ot every ro= uses the same layout &e.g., some have one line o$ te:t, others have t=o' @ou nee to %on$igure the =i gets in the ro=s &e.g., i$$erent i%ons $or i$$erent %ases'

-n those %ases, the better option is to %reate your o=n sub%lass o$ your esire Adapter, overri e get7iew:;, an %onstru%t your ro=s yoursel$. 4he get7iew:; metho is responsible $or returning a 7iew, representing the ro= $or the supplie position in the a apter ata. (or e:ample, letWs re=ork the above %o e to use get7iew:;, so =e %an have i$$erent i%ons $or i$$erent ro=s O in this %ase, one i%on $or short =or s an one $or long =or s &$rom the Dynamic sample proNe%t'*
9%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

public!class!DynamicDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G !!!!!!!!!!%purus%<5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!setList#dapter:new!Iconic#dapter:t&is;;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!long!id;!8 !!!selection.setText:itemsPpositionQ;5 !!< !! !!class!.conicAdapter!extends!ArrayAdapter!8 !!!!Activity!context5 !!!! !!!!Iconic#dapter:Activity!context;!8 !!!!!!super:contextG!R.layout.rowG!items;5 !!!!!! !!!!!!t&is.context$context5 !!!!< !!!! !!!!public!7iew!getView:int!positionG!7iew!convert7iewG !!!!!!!!!!!!!!!!!!!!!!!7iew0roup!parent;!8 !!!!!!+ayout.nflater!inflater$context.getLayoutInflater:;5 !!!!!!7iew!row$inflater.inflate:R.layout.rowG!null;5 !!!!!!-ext7iew!label$:-ext7iew;row.findViewById:R.id.label;5 !!!!!! !!!!!!label.setText:itemsPpositionQ;5 !!!!!! !!!!!!if!:itemsPpositionQ.length:;'O;!8 !!!!!!!!.mage7iew!icon$:.mage7iew;row.findViewById:R.id.icon;5 !!!!!!!! !!!!!!!!icon.setImage$esource:R.drawable.delete;5 !!!!!!<!! !!!!!! !!!!!!return:row;5 !!!!< !!< <

4he theory is that =e overri e get7iew:; an return ro=s base on =hi%h obNe%t is being isplaye , =here the obNe%t is in i%ate by a position in e: into the Adapter. )o=ever, i$ you look at the implementation sho=n above,
9Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

you =ill see a re$eren%e to a 7iew.nflate %lass...an that %on%ept takes a little bit o$ an e:planation.

A Side3 r A3out In,l tion


-n this %ase, 5in$lation8 means the a%t o$ %onverting an DML layout spe%i$i%ation into the a%tual tree o$ 7iew obNe%ts the DML represents. 4his is un oubte ly a te ious bit o$ %o e* take an element, %reate an instan%e o$ the spe%i$ie 7iew %lass, =alk the attributes, %onvert those into property setter %alls, iterate over all %hil elements, lather, rinse, repeat. 4he goo ne=s is that the $ine $olk on the An roi team =rappe all that up into a %lass %alle +ayout.nflater that =e %an use ourselves. When it %omes to $an%y lists, $or e:ample, =e =ill =ant to in$late 7iews $or ea%h ro= sho=n in the list, so =e %an use the %onvenient shorthan o$ the DML layout to es%ribe =hat the ro=s are suppose to look like. -n the sample sho=n above, =e in$late our R.layout.row layout =e %reate in the previous se%tion. 4his gives us a 7iew obNe%t ba%k =hi%h, in reality, is our +inear+ayout =ith an .mage7iew an a -ext7iew, Nust as R.layout.row spe%i$ies. )o=ever, rather than having to %reate all those obNe%ts ourselves an =ire them together, the DML an +ayout.nflater han le the Qheavy li$tingQ $or us.

And "o#4 B c$ To 0ur Story


#o =e have use +ayout.nflater to give us a 7iew representing the ro=. 4his ro= is QemptyQ, sin%e the stati% layout $ile has no i ea =hat a%tual ata goes into the ro=. -t is our Nob to %ustomiMe an populate the ro= as =e see $it be$ore returning it. #o, =e*

(ill in the te:t label into our label =i get, using the =or at the supplie position #ee i$ the =or is longer than $our %hara%ters an , i$ so, =e $in our .mage7iew i%on =i get an repla%e the sto%k resour%e =ith a i$$erent one

9$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

/o=, =e have a +ist7iew =ith i$$erent i%ons base upon %onte:t o$ that spe%i$i% entry in the list*

!igure %7< The /ynamic/emo application

>bviously, this =as a $airly %ontrive e:ample, but you %an see =here this te%hni;ue %oul be use to %ustomiMe ro=s base on any sort o$ %riteria, su%h as other %olumns in a returne )ursor.

Better< Stronger< !aster<


4he get7iew:; implementation sho=n above =orks, but is ine$$i%ient. Ivery time the user s%rolls, =e have to %reate a bun%h o$ ne= 7iew obNe%ts to a%%ommo ate the ne=ly2sho=n ro=s. An , sin%e the An roi $rame=ork oes not %a%he e:isting 7iew obNe%ts itsel$, =e =in up making ne= ro= 7iew! obNe%ts even $or ro=s =e Nust %reate a se%on or t=o ago. 4his is ba . -t might be ba $or the imme iate user e:perien%e, i$ the list appears to be sluggish. More likely, though, it =ill be ba ue to battery usage O every bit
90
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

o$ C!" that is use eats up the battery. 4his is %ompoun e by the e:tra =ork the garbage %olle%tor nee s to o to get ri o$ all those e:tra obNe%ts you %reate. #o the less e$$i%ient your %o e, the more ;ui%kly the phone6s battery =ill be raine , an the less happy the user =ill be. An you =ant happy users, rightC #o, let us take a look at a $e= tri%ks to make your $an%y +ist7iew =i gets more e$$i%ient.

+sin! convert5ie#
4he get7iew:; metho re%eives, as one o$ its parameters, a 7iew name , by %onvention, convert7iew. #ometimes, convert7iew =ill be null. -n those %ases, you have to %reate a ne= ro= 7iew $rom s%rat%h &e.g., via in$lation', Nust as =e i be$ore. )o=ever, i$ convert7iew is not null, then it is a%tually one o$ your previously2 %reate 7iews9 4his =ill happen primarily =hen the user s%rolls the +ist7iew! O as ne= ro=s appear, An roi =ill attempt to re%y%le the vie=s o$ the ro=s that s%rolle o$$ the other en o$ the list, to save you having to rebuil them $rom s%rat%h. Assuming that ea%h o$ your ro=s has the same basi% stru%ture, you %an use find7iew6y.d:; to get at the in ivi ual =i gets that make up your ro= an %hange their %ontents, then return content7iew $rom get7iew:;, rather than %reate a =hole ne= ro=. (or e:ample, here is the get7iew:; implementation $rom last time, no= optimiMe via content7iew &$rom the Re%y%ling proNe%t'*
public!class!RecyclingDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G

91
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!!!!!!!!!%purus%<5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!setList#dapter:new!Iconic#dapter:t&is;;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!long!id;!8 !!!selection.setText:itemsPpositionQ;5 !!< !! !!class!.conicAdapter!extends!ArrayAdapter!8 !!!!Activity!context5 !!!! !!!!Iconic#dapter:Activity!context;!8 !!!!!!super:contextG!R.layout.rowG!items;5 !!!!!! !!!!!!t&is.context$context5 !!!!< !!!! !!!!public!7iew!getView:int!positionG!7iew!convert7iewG !!!!!!!!!!!!!!!!!!!!!!!7iew0roup!parent;!8 !!!!!!7iew!row$convert7iew5 !!!!!! !!!!!!if!:row$$null;!8!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!+ayout.nflater!inflater$context.getLayoutInflater:;5 !!!!!!!! !!!!!!!!row$inflater.inflate:R.layout.rowG!null;5 !!!!!!< !!!!!! !!!!!!-ext7iew!label$:-ext7iew;row.findViewById:R.id.label;5 !!!!!! !!!!!!label.setText:itemsPpositionQ;5 !!!!!! !!!!!!if!:itemsPpositionQ.length:;'O;!8 !!!!!!!!.mage7iew!icon$:.mage7iew;row.findViewById:R.id.icon;5 !!!!!!!! !!!!!!!!icon.setImage$esource:R.drawable.delete;5 !!!!!!<!! !!!!!! !!!!!!return:row;5 !!!!< !!< <

)ere, =e %he%k to see i$ the content7iew is null an , i$ so, =e then in$late our ro= O but i$ it is not2null, =e Nust reuse it. 4he =ork to $ill in the %ontents

94
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

&i%on image, te:t' is the same in either %ase. 4he a vantage is that =e avoi the potentially2e:pensive in$lation step. 4his approa%h =ill not =ork in every %ase, though. (or e:ample, it may be that you have a List+ie= $or =hi%h some ro=s =ill have one line o$ te:t an others have t=o. -n this %ase, re%y%ling e:isting ro=s be%omes tri%ky, as the layouts may signi$i%antly i$$er. (or e:ample, i$ the ro= =e nee to %reate a +ie= $or re;uires t=o lines o$ te:t, =e %annot Nust use a 7iew =ith one line o$ te:t as2is. We either nee to tinker =ith the innar s o$ that 7iew, or ignore it an in$late a ne= 7iew. >$ %ourse, there are =ays to eal =ith this, su%h as making the se%on line o$ te:t visible or invisible epen ing on =hether it is nee e . An , on a phone, every millise%on o$ C!" time is pre%ious, possibly $or the user e:perien%e, but al=ays $or battery li$e O more C!" utiliMation means a more ;ui%kly2 raine battery. 4hat being sai , parti%ularly i$ you are a rookie to An roi , $o%us on getting the $un%tionality right $irst, then looking to optimiMe per$orman%e on a se%on pass through your %o e, rather than get lost in a sea o$ 7iews trying to ta%kle it all in one shot.

+sin! the Holder P ttern


Another some=hat e:pensive operation =e o a lot =ith $an%y vie=s is %all find7iew6y.d:;. 4his ives into our in$late ro= an pulls out =i gets by their assigne i enti$iers, so =e %an %ustomiMe the =i get %ontents &e.g., %hange the te:t o$ a -ext7iew, %hange the i%on in an .mage7iew'. #in%e find7iew6y.d:; %an $in =i gets any=here in the tree o$ %hil ren o$ the ro=Ws root 7iew, this %oul take a $air number o$ instru%tions to e:e%ute, parti%ularly i$ =e keep having to re2$in =i gets =e ha $oun on%e be$ore. -n some 7"- toolkits, this problem is avoi e by having the %omposite 7iews, like our ro=s, be e%lare totally in program %o e &in this %ase, Gava'. 4hen, a%%essing in ivi ual =i gets is merely the matter o$ %alling a getter or a%%essing a $iel . An you %an %ertainly o that =ith An roi , but the %o e
97
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

gets rather verbose. What =oul be ni%e is a =ay =here =e %an still use the layout DML yet %a%he our ro=Ws key %hil =i gets so =e only have to $in them on%e. 4hat6s =here the hol er pattern %omes into play, in a %lass =e6ll %all 7iewCrapper. All +ie= obNe%ts have get-ag:; an set-ag:; metho s. 4hese allo= you to asso%iate an arbitrary obNe%t =ith the =i get. What the hol er pattern oes is use that QtagQ to hol an obNe%t that, in turn, hol s ea%h o$ the %hil =i gets o$ interest. .y atta%hing that hol er to the ro= +ie=, every time =e use the ro=, =e alrea y have a%%ess to the %hil =i gets =e %are about, =ithout having to %all find7iew6y.d:; again. #o, letWs take a look at one o$ these hol er %lasses &taken $rom the 7iewCrapper sample proNe%t'*
class!7iewCrapper!8 !!7iew!base5 !!-ext7iew!label$null5 !!.mage7iew!icon$null5 !! !!View&rapper:7iew!base;!8 !!!!t&is.base$base5 !!< !! !!-ext7iew!getLa!el:;!8 !!!!if!:label$$null;!8 !!!!!!label$:-ext7iew;base.findViewById:R.id.label;5 !!!!< !!!! !!!!return:label;5 !!< !! !!.mage7iew!getIcon:;!8 !!!!if!:icon$$null;!8 !!!!!!icon$:.mage7iew;base.findViewById:R.id.icon;5 !!!!< !!!! !!!!return:icon;5 !!< <

7iewCrapper

not only hol s onto the %hil =i gets, it laMy2$in s the %hil =i gets. -$ you %reate a =rapper an never nee a spe%i$i% %hil , you never go
99

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

through the find7iew6y.d:; operation $or it an never have to pay $or those C!" %y%les. 4he hol er pattern also*

Allo=s us to %onsoli ate all our per2=i get type %asting in one pla%e, rather than having to %ast it every=here =e %all find7iew6y.d:; !erhaps tra%k other in$ormation about the ro=, su%h as state in$ormation =e are not yet rea y to 5$lush8 to the un erlying mo el

"sing 7iewCrapper is a matter o$ %reating an instan%e =henever =e in$late a ro= an atta%hing sai instan%e to the ro= 7iew via set-ag:;, as sho=n in this re=rite o$ get7iew:;*
public!class!7iewCrapperDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G !!!!!!!!!!%purus%<5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!setList#dapter:new!Iconic#dapter:t&is;;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!< !! !!private!String!get'odel:int!position;!8 !!!!return:::.conicAdapter;getList#dapter:;;.getItem:position;;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!long!id;!8 !!!selection.setText:get'odel:position;;5 !!< !! !!class!.conicAdapter!extends!ArrayAdapter"String'!8 !!!!Activity!context5 !!!! !!!!Iconic#dapter:Activity!context;!8 !!!!!!super:contextG!R.layout.rowG!items;5 !!!!!! !!!!!!t&is.context$context5 !!!!<

*;;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!!! !!!!public!7iew!getView:int!positionG!7iew!convert7iewG !!!!!!!!!!!!!!!!!!!!!!!7iew0roup!parent;!8 !!!!!!7iew!row$convert7iew5 !!!!!!7iewCrapper!wrapper$null5 !!!!!! !!!!!!if!:row$$null;!8!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!+ayout.nflater!inflater$context.getLayoutInflater:;5 !!!!!!!! !!!!!!!!row$inflater.inflate:R.layout.rowG!null;5 !!!!!!!!wrapper$new!View&rapper:row;5 !!!!!!!!row.setTag:wrapper;5 !!!!!!< !!!!!!else!8 !!!!!!!!wrapper$:7iewCrapper;row.getTag:;5 !!!!!!< !!!!!! !!!!!!wrapper.getLa!el:;.setText:get'odel:position;;5 !!!!!! !!!!!!if!:get'odel:position;.length:;'O;!8 !!!!!!!!wrapper.getIcon:;.setImage$esource:R.drawable.delete;5 !!!!!!<!! !!!!!! !!!!!!return:row;5 !!!!< !!< <

Gust as =e %he%k convert7iew to see i$ it is null in or er to %reate the ro= 7iews as nee e , =e also pull out &or %reate' the %orrespon ing ro=Ws 7iewCrapper. 4hen, a%%essing the %hil =i gets is merely a matter o$ %alling their asso%iate metho s on the =rapper.

+aking a ist<<<
Lists =ith pretty i%ons ne:t to them are all $ine an =ell. .ut, %an =e %reate +ist7iew =i gets =hose ro=s %ontain intera%tive %hil =i gets instea o$ Nust passive =i gets like -ext7iew an .mage7iewC (or e:ample, %oul =e %ombine the Rating6ar =ith te:t in or er to allo= people to s%roll a list o$, say, songs an rate them right insi e the listC 4here is goo ne=s an ba ne=s. 4he goo ne=s is that intera%tive =i gets in ro=s =ork Nust $ine. 4he ba ne=s is that it is a little tri%ky, spe%i$i%ally =hen it %omes to taking a%tion
*;*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

=hen the intera%tive =i get6s state %hanges &e.g., a value is type into a $iel '. We nee to store that state some=here, sin%e our Rating6ar =i get =ill be re%y%le =hen the +ist7iew is s%rolle . We nee to be able to set the Rating6ar state base upon the a%tual =or =e are vie=ing as the Rating6ar! is re%y%le , an =e nee to save the state =hen it %hanges so it %an be restore =hen this parti%ular ro= is s%rolle ba%k into vie=. What makes this interesting is that, by e$ault, the Rating6ar has absolutely no i ea =hat mo el in the ArrayAdapter it is looking at. A$ter all, the Rating6ar is Nust a =i get, use in a ro= o$ a +ist7iew. We nee to tea%h the ro=s =hi%h mo el they are presently isplaying, so =hen their %he%kbo: is %he%ke , they kno= =hi%h mo elWs state to mo i$y. #o, let6s see ho= this is one, using the a%tivity in the Rate+ist sample proNe%t. WeWll use the same basi% %lasses as our previous emo O =eWre sho=ing a list o$ nonsense =or s, =hi%h you %an then rate. -n a ition, =or s given a top rating are put in all %aps*
public!class!Rate+istDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G !!!!!!!!!!%purus%<5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!! !!!!Array+ist"RowModel'!list$new!Array+ist"RowModel':;5 !!!! !!!!for!:String!s!#!items;!8 !!!!!!list.add:new!$ow'odel:s;;5 !!!!< !!!! !!!!setList#dapter:new!Check#dapter:t&isG!list;;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!< !! !!private!RowModel!get'odel:int!position;!8 !!!!return:::)&ec Adapter;getList#dapter:;;.getItem:position;;5 !!< !!

*;%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!public!void!onListItemClick:+ist7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!long!id;!8 !!!selection.setText:get'odel:position;.toString:;;5 !!< !! !!class!)&ec Adapter!extends!ArrayAdapter"RowModel'!8 !!!!Activity!context5 !!!! !!!!Check#dapter:Activity!contextG!Array+ist"RowModel'!list;!8 !!!!!!super:contextG!R.layout.rowG!list;5 !!!!!! !!!!!!t&is.context$context5 !!!!< !!!! !!!!public!7iew!getView:int!positionG!7iew!convert7iewG !!!!!!!!!!!!!!!!!!!!!!!7iew0roup!parent;!8 !!!!!!7iew!row$convert7iew5 !!!!!!7iewCrapper!wrapper5 !!!!!!Rating6ar!rate5!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!if!:row$$null;!8!!!! !!!!!!!!+ayout.nflater!inflater$context.getLayoutInflater:;5 !!!!!!!! !!!!!!!!row$inflater.inflate:R.layout.rowG!null;5 !!!!!!!!wrapper$new!View&rapper:row;5 !!!!!!!!row.setTag:wrapper;5 !!!!!!!!rate$wrapper.get$atingBar:;5 !!!!!!!! !!!!!!!!Rating6ar.,nRating6ar)&ange+istener!l$ !!!!!!!!!!!!!!!!!!!!new!Rating6ar.On$atingBarChangeListener:;!8 !!!!!!!!!!public!void!on$atingChanged:Rating6ar!rating6arG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!float!ratingG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!boolean!from-ouc&;!!8 !!!!!!!!!!!!.nteger!my1osition$:.nteger;rating6ar.getTag:;5 !!!!!!!!!!!!RowModel!model$get'odel:my1osition;5 !!!!!!!!!!!! !!!!!!!!!!!!model.rating$rating5 !!!!!!!!!! !!!!!!!!!!!!+inear+ayout!parent$:+inear+ayout;rating6ar.get(arent:;5 !!!!!!!!!!!!-ext7iew!label$:-ext7iew;parent.findViewById:R.id.label;5 !!!!!!!! !!!!!!!!!!!!label.setText:model.toString:;;5 !!!!!!!!!!< !!!!!!!!<5 !!!!!!!! !!!!!!!!rate.setOn$atingBarChangeListener:l;5 !!!!!!< !!!!!!else!8 !!!!!!!!wrapper$:7iewCrapper;row.getTag:;5 !!!!!!!!rate$wrapper.get$atingBar:;5 !!!!!!< !!!!!!RowModel!model$get'odel:position;5 !!!!!!

*;Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!!!!!wrapper.getLa!el:;.setText:model.toString:;;5 !!!!!!rate.setTag:new!Integer:position;;5 !!!!!!rate.set$ating:model.rating;5 !!!!!! !!!!!!return:row;5 !!!!< !!< !! !!class!RowModel!8 !!!!String!label5 !!!!float!rating$H.@f5 !!!! !!!!$ow'odel:String!label;!8 !!!!!!t&is.label$label5 !!!!< !!!! !!!!public!String!toString:;!8 !!!!!!if!:rating'$I.@;!8 !!!!!!!!return:label.to)pperCase:;;5 !!!!!!< !!!!!! !!!!!!return:label;5 !!!!< !!< <

)ere is =hat is i$$erent in this a%tivity an get7iew:; implementation than be$ore* ,. While =e are still using StringXY items as the list o$ nonsense =or s, rather than pour that String array straight into an ArrayAdapter, =e turn it into a list o$ RowModel obNe%ts. RowModel is this emoWs poor e:%use $or a mutable mo el* it hol s the nonsense =or plus the %urrent %he%ke state. -n a real system, these might be obNe%ts populate $rom a )ursor, an the properties =oul have more business meaning.

2. "tility metho s like on+ist.tem)lic :; ha to be up ate to re$le%t the %hange $rom a pure2String mo el to use a RowModel. ?. 4he ArrayAdapter sub%lass &)&ec Adapter', in get7iew:;, looks to see i$ convert7iew is null. -$ so, =e %reate a ne= ro= by in$lating a simple layout &see belo=' an also atta%h a 7iewCrapper &also belo='. (or the ro=Ws Rating6ar, =e a an anonymous onRating)&anged:; listener that looks at the ro=Ws tag &get-ag:;' an %onverts that into an .nteger, representing the position =ithin the ArrayAdapter that this ro= is isplaying. "sing that, the %he%kbo: %an get the a%tual
*;$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

RowModel

$or the ro= an up ate the mo el base upon the ne= state o$ the rating bar. -t also up ates the te:t a Na%ent to the Rating6ar! =hen %he%ke to mat%h the rating bar state.

<. We al=ays make sure that the Rating6ar has the proper %ontents an has a tag &via set-ag:;' pointing to the position in the a apter the ro= is isplaying. 4he ro= layout is very simple* Nust a Rating6ar an +inear+ayout* a -ext7iew insi e a

">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%wrap_content% !!android#orientation$%&ori(ontal% ' !!"Rating6ar !!!!android#id$%9Bid/rate% !!!!android#layout_widt&$%wrap_content% !!!!android#layout_&eig&t$%wrap_content% !!!!android#numStars$%I% !!!!android#stepSi(e$%?% !!!!android#rating$%H%!/' !!"-ext7iew !!!!android#id$%9Bid/label% !!!!android#padding+eft$%Hpx% !!!!android#paddingRig&t$%Hpx% !!!!android#padding-op$%Hpx% !!!!android#textSi(e$%O@sp% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content%/' "/+inear+ayout'

4he 7iewCrapper is similarly simple, Nust e:tra%ting the Rating6ar an the -ext7iew out o$ the ro= 7iew*
class!7iewCrapper!8 !!7iew!base5 !!Rating6ar!rate$null5 !!-ext7iew!label$null5 !! !!View&rapper:7iew!base;!8 !!!!t&is.base$base5 !!< !! !!Rating6ar!get$atingBar:;!8 !!!!if!:rate$$null;!8

*;0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!!!!!rate$:Rating6ar;base.findViewById:R.id.rate;5 !!!!< !!!! !!!!return:rate;5 !!< !! !!-ext7iew!getLa!el:;!8 !!!!if!:label$$null;!8 !!!!!!label$:-ext7iew;base.findViewById:R.id.label;5 !!!!< !!!! !!!!return:label;5 !!< <

An the result is =hat you =oul e:pe%t, visually*

!igure %9< The 3ate ist/emo application6 as initially launched

4his in%lu es the toggle %he%kbo:es turning their =or s into all %aps*

*;1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!igure -;< The same application6 sho)ing a top"rated )ord

<<<(nd Checking 8t T)ice


4he rating list in the previous se%tion =orks, but implementing it =as very te ious. Worse, mu%h o$ that te ium =oul not be reusable e:%ept in very limite %ir%umstan%es. We %an o better. What =eW really like is to be able to %reate a layout like this*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent%! !!android#layout_&eig&t$%fill_parent%!' !!"-ext7iew !!!!android#id$%9Bid/selection% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content%/' !!"com.commonsware.android.fancylists.seven.Rate+ist7iew !!!!android#id$%9android#id/list% !!!!android#layout_widt&$%fill_parent%!

*;4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!!!android#layout_&eig&t$%fill_parent% !!!!android#drawSelector,n-op$%false% !!!!/' "/+inear+ayout'

=here, in our %o e, almost all o$ the logi% that might have re$erre to a +ist7iew be$ore 5Nust =orks8 =ith the Rate+ist7iew =e put in the layout*
public!class!Rate+ist7iewDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G !!!!!!!!!!%purus%<5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!! !!!!setList#dapter:new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G !!!!!!!!!!!!!!!!!!!!!!!items;;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!long!id;!8 !!!selection.setText:itemsPpositionQ;5 !!< <

Where things get a =ee bit %hallenging is =hen you stop an realiMe that, in everything up to this point in this %hapter, never =ere =e a%tually %hanging the +ist7iew itsel$. All our =ork =as =ith the a apters, overri ing get7iew:;! an in$lating our o=n ro=s, an =hatnot. #o i$ =e =ant Rate+ist7iew to take in any or inary +istAdapter an 5Nust =ork8, putting %he%kbo:es on the ro=s as nee e , =e are going to nee to o some $an%y $oot=ork. #pe%i$i%ally, =e are going to nee to =rap the 5ra=8 +istAdapter in some other +istAdapter that kno=s ho= to put the %he%kbo:es on the ro=s an tra%k the state o$ those %he%kbo:es.

*;7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

(irst, =e nee to establish the pattern o$ one +istAdapter augmenting another. )ere is the %o e $or AdapterCrapper, =hi%h takes a +istAdapter an elegates all o$ the inter$a%eWs metho s to the elegate &$rom the )&ec +ist7iew sample proNe%t'*
public!class!AdapterCrapper!implements!+istAdapter!8 !!+istAdapter!delegate$null5 !! !!public!#dapter&rapper:+istAdapter!delegate;!8 !!!!t&is.delegate$delegate5 !!< !! !!public!int!getCount:;!8 !!!!return:delegate.getCount:;;5 !!< !! !!public!,bject!getItem:int!position;!8 !!!!return:delegate.getItem:position;;5 !!< !! !!public!long!getItemId:int!position;!8 !!!!return:delegate.getItemId:position;;5 !!< !! !!public!7iew!getView:int!positionG!7iew!convert7iewG !!!!!!!!!!!!!!!!!!!!!7iew0roup!parent;!8 !!!!return:delegate.getView:positionG!convert7iewG!parent;;5 !!< !! !!public!void!registerDataSetO!ser er:DataSet,bserver!observer;!8 !!!!delegate.registerDataSetO!ser er:observer;5 !!< !! !!public!boolean!hasSta!leIds:;!8 !!!!return:delegate.hasSta!leIds:;;5 !!< !! !!public!boolean!is*mpty:;!8 !!!!return:delegate.is*mpty:;;5 !!< !! !!public!int!getViewTypeCount:;!8 !!!!return:delegate.getViewTypeCount:;;5 !!< !! !!public!int!getItemViewType:int!position;!8 !!!!return:delegate.getItemViewType:position;;5 !!< !! !!public!void!unregisterDataSetO!ser er:DataSet,bserver!observer;!8 !!!!delegate.unregisterDataSetO!ser er:observer;5 !!<

*;9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!! !!public!boolean!are#llItems*na!led:;!8 !!!!return:delegate.are#llItems*na!led:;;5 !!< !! !!public!boolean!is*na!led:int!position;!8 !!!!return:delegate.is*na!led:position;;5 !!< <

We %an then sub%lass AdapterCrapper to %reate RateableCrapper, overri ing the e$ault get7iew:; but other=ise allo=ing the elegate +istAdapter to o the 5real =ork8*
public!class!RateableCrapper!extends!AdapterCrapper!8 !!)ontext!ctxt$null5 !!floatPQ!rates$null5 !! !!public!$atea!le&rapper:)ontext!ctxtG!+istAdapter!delegate;!8 !!!!super:delegate;5 !!!! !!!!t&is.ctxt$ctxt5 !!!!t&is.rates$new!floatPdelegate.getCount:;Q5 !!!! !!!!for!:int!i$@5i"delegate.getCount:;5iBB;!8 !!!!!!t&is.ratesPiQ$H.@f5 !!!!< !!< !! !!public!7iew!getView:int!positionG!7iew!convert7iewG !!!!!!!!!!!!!!!!!!!!!7iew0roup!parent;!8 !!!!7iewCrapper!wrap$null5 !!!!7iew!row$convert7iew5 !!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!if!:convert7iew$$null;!8 !!!!!!+inear+ayout!layout$new!LinearLayout:ctxt;5 !!!!!!Rating6ar!rate$new!$atingBar:ctxt;5 !!!!!! !!!!!!rate.set%umStars:I;5 !!!!!!rate.setStepSi+e:?.@f;5 !!!!!! !!!!!!7iew!guts$delegate.getView:positionG!nullG!parent;5 !!!! !!!!!!layout.setOrientation:+inear+ayout.3,R.K,/-A+;5! !!!!!!!!!! !!!!!!rate.setLayout(arams:new!+inear+ayout.Layout(arams: !!!!!!!!!!!!+inear+ayout.+ayout1arams.CRA1_),/-*/-G !!!!!!!!!!!!+inear+ayout.+ayout1arams.E.++_1AR*/-;;5 !!!!!!guts.setLayout(arams:new!+inear+ayout.Layout(arams: !!!!!!!!!!!!+inear+ayout.+ayout1arams.E.++_1AR*/-G !!!!!!!!!!!!+inear+ayout.+ayout1arams.E.++_1AR*/-;;5 !!!!!!

**;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!!!!!Rating6ar.,nRating6ar)&ange+istener!l$ !!!!!!!!!!!!!!!!!!!!new!Rating6ar.On$atingBarChangeListener:;!8 !!!!!!!!public!void!on$atingChanged:Rating6ar!rating6arG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!float!ratingG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!boolean!from-ouc&;!!8 !!!!!!!!!!ratesP:.nteger;rating6ar.getTag:;Q$rating5 !!!!!!!!< !!!!!!<5 !!!!!! !!!!!!rate.setOn$atingBarChangeListener:l;5 !!!!!!!!!! !!!!!!layout.addView:rate;5!!!!!!!!!! !!!!!!layout.addView:guts;5 !!!!!! !!!!!!wrap$new!View&rapper:layout;5 !!!!!!wrap.setGuts:guts;5 !!!!!!layout.setTag:wrap;5 !!!!!! !!!!!!rate.setTag:new!Integer:position;;5 !!!!!!rate.set$ating:ratesPpositionQ;5 !!!!!!!! !!!!!!row$layout5!!!!!!!! !!!!< !!!!else!8 !!!!!!wrap$:7iewCrapper;convert7iew.getTag:;5 !!!!!!wrap.setGuts:delegate.getView:positionG!wrap.getGuts:;G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!parent;;5 !!!!!!wrap.get$atingBar:;.setTag:new!Integer:position;;5 !!!!!!wrap.get$atingBar:;.set$ating:ratesPpositionQ;5 !!!!< !!!! !!!!return:row;5 !!<!!!! <

4he i ea is that RateableCrapper is =here most o$ our rate2list logi% resi es. -t puts the rating bars on the ro=s an it tra%ks the rating barsW states as they are a Nuste by the user. (or the states, it has a floatPQ siMe to $it the number o$ ro=s that the elegate says are in the list.
RateableCrapperWs

implementation o$ get7iew:; is reminis%ent o$ the one $rom RateListAemo, e:%ept that rather than use +ayout.nflater, =e nee to manually %onstru%t a +inear+ayout to hol our Rating6ar an the 5guts8 &a.k.a., =hatever vie= the elegate %reate that =e are e%orating =ith the %he%kbo:'. +ayout.nflater is esigne to %onstru%t a 7iew $rom ra= =i getsP in our %ase, =e onWt kno= in a van%e =hat the ro=s =ill look like, other than that =e nee to a a %he%kbo: to them. )o=ever, the rest is similar to

***
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

the one $rom Rate+istDemo, in%lu ing using a 7iewCrapper &belo=', hooking onRating6ar)&anged:; to have the rating bar up ate the state, an so $orth*
class!7iewCrapper!8 !!7iew0roup!base5 !!7iew!guts$null5 !!Rating6ar!rate$null5 !! !!View&rapper:7iew0roup!base;!8 !!!!t&is.base$base5 !!< !! !!Rating6ar!get$atingBar:;!8 !!!!if!:rate$$null;!8 !!!!!!rate$:Rating6ar;base.getChild#t:@;5 !!!!< !!!! !!!!return:rate;5 !!< !! !!void!set$atingBar:Rating6ar!rate;!8 !!!!t&is.rate$rate5 !!< !! !!7iew!getGuts:;!8 !!!!if!:guts$$null;!8 !!!!!!guts$base.getChild#t:?;5 !!!!< !!!! !!!!return:guts;5 !!< !! !!void!setGuts:7iew!guts;!8 !!!!t&is.guts$guts5 !!< <

With all that in pla%e, Rate+ist7iew is %omparatively simple*


public!class!Rate+ist7iew!extends!+ist7iew!8 !!public!$ateListView:)ontext!context;!8 !!!!super:context;5 !!< !! !!public!$ateListView:)ontext!contextG!AttributeSet!attrs;!8 !!!!super:contextG!attrs;5 !!< !!!!!!!!!!!!!!!!!! !!public!$ateListView:)ontext!contextG!AttributeSet!attrsG !!!!!!!!!!!!!!!!!!!!!!!int!defStyle;!8 !!!!super:contextG!attrsG!defStyle;5

**%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

!!< !! !!public!void!set#dapter:+istAdapter!adapter;!8 !!!!super.set#dapter:new!$atea!le&rapper:getContext:;G!adapter;;5 !!< <

We simply sub%lass +ist7iew an overri e setAdapter:; so =e %an =rap the supplie +istAdapter in our o=n RateableCrapper. +isually, the results are similar to the Rate+istDemo, albeit =ithout top2rate =or s appearing in all %aps*

!igure -*< The 3ate istFie)/emo sample application

4he i$$eren%e is in reusability. We %oul pa%kage Rate+ist7iew in its o=n GAR an plop it into any An roi proNe%t =here =e nee it. #o =hile Rate+ist7iew is some=hat %ompli%ate to =rite, =e only have to =rite it on%e, an the rest o$ the appli%ation %o e is bliss$ully simple. >$ %ourse, this Rate+ist7iew %oul use some more $eatures, su%h as programmati%ally %hanging states &up ating both the floatPQ an the a%tual Rating6ar itsel$', allo=ing other appli%ation logi% to be invoke =hen a
**Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

'etting !ancy With ists

Rating6ar

state is toggle &via some sort o$ %allba%k', et%. 4hese are le$t as e:er%ises $or the rea er.

**$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 16

Employing !ancy Widgets and Containers

4he =i gets an %ontainers %overe to ate are not only $oun in many 7"toolkits &in one $orm or $ashion', but also are =i ely use in buil ing 7"appli%ations, =hether Web2base , esktop, or mobile. 4he =i gets an %ontainers in this %hapter are a little less =i ely use , though you =ill likely $in many to be ;uite use$ul.

Pick and Choose


With limite 2input evi%es like phones, having =i gets an ialogs that are a=are o$ the type o$ stu$$ somebo y is suppose to be entering is very help$ul. -t minimiMes keystrokes an s%reen taps, plus re u%es the %han%e o$ making some sort o$ error &e.g., entering a letter somepla%e =here only numbers are e:pe%te '. As sho=n previously, *dit7iew has %ontent2a=are $lavors $or entering in numbers, phone numbers, et%. An roi also supports =i gets &Date1ic er, -ime1ic er' an ialogs &Date1ic erDialog, -ime1ic erDialog' $or helping users enter ates an times. 4he Date1ic er an Date1ic erDialog allo= you to set the starting ate $or the sele%tion, in the $orm o$ a year, month, an ay o$ month value. /ote that the month runs $rom @ $or Ganuary through ?? $or Ae%ember. Most
**0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

importantly, ea%h let you provi e a %allba%k obNe%t &,nDate)&anged+istener or ,nDateSet+istener' =here you are in$orme o$ a ne= ate sele%te by the user. -t is up to you to store that ate somepla%e, parti%ularly i$ you are using the ialog, sin%e there is no other =ay $or you to get at the %hosen ate later on. #imilarly, -ime1ic er an -ime1ic erDialog let you*

set the initial time the user %an a Nust, in the $orm o$ an hour &@! through HI' an a minute &@ through LS' in i%ate i$ the sele%tion shoul be in ,22hour mo e =ith an AMU!M toggle, or in 2<2hour mo e &=hat in the "# is thought o$ as Qmilitary timeQ an in the rest o$ the =orl is thought o$ as Qthe =ay times are suppose to beQ' provi e %allba%k obNe%t &,n-ime)&anged+istener or to be noti$ie o$ =hen the user has %hosen a ne= time, =hi%h is supplie to you in the $orm o$ an hour an minute
,n-imeSet+istener'

(or e:ample, $rom the )&rono sample proNe%t, here6s a trivial layout %ontaining a label an t=o buttons O the buttons =ill pop up the ialog $lavors o$ the ate an time pi%kers*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"-ext7iew!android#id$%9Bid/dateAnd-ime%!! !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content% !!!!/' !!"6utton!android#id$%9Bid/date6tn%!! !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content%! !!!!android#text$%Set!t&e!Date% !!!!/' !!"6utton!android#id$%9Bid/time6tn%!! !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content%! !!!!android#text$%Set!t&e!-ime% !!!!/' "/+inear+ayout' **1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

4he more interesting stu$$ %omes in the Gava sour%e*


public!class!)&ronoDemo!extends!Activity!8 !!DateEormat!fmtDateAnd-ime$DateEormat.getDateTimeInstance:;5 !!-ext7iew!dateAnd-ime+abel5 !!)alendar!dateAnd-ime$)alendar.getInstance:;5 !!Date1ic erDialog.,nDateSet+istener!d$new!Date1ic erDialog.OnDateSetListener:;! 8 !!!!public!void!onDateSet:Date1ic er!viewG!int!yearG!int!mont&,fFearG !!!!!!!!!!!!!!!!int!day,fMont&;!8 !!!!!!dateAnd-ime.set:)alendar.F*ARG!year;5 !!!!!!dateAnd-ime.set:)alendar.M,/-3G!mont&,fFear;5 !!!!!!dateAnd-ime.set:)alendar.DAF_,E_M,/-3G!day,fMont&;5 !!!!!!updateLa!el:;5 !!!!< !!<5!! !!-ime1ic erDialog.,n-imeSet+istener!t$new!-ime1ic erDialog.OnTimeSetListener:;! 8 !!!!public!void!onTimeSet:-ime1ic er!viewG!int!&our,fDayG !!!!!!!!!!!!!!!!!!!!!!!!!int!minute;!8 !!!!!!dateAnd-ime.set:)alendar.3,2RG!&our,fDay;5 !!!!!!dateAnd-ime.set:)alendar.M./2-*G!minute;5 !!!!!!updateLa!el:;5 !!!!< !!<5!! !!!!!! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!! !!!!6utton!btn$:6utton;findViewById:R.id.date6tn;5 !!!! !!!!btn.setOnClickListener:new!7iew.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!v;!8 !!!!!!!!new!Date(ickerDialog:)&ronoDemo.t&isG !!!!!!!!!!!!dG !!!!!!!!!!!!dateAnd-ime.get:)alendar.F*AR;G !!!!!!!!!!!!dateAnd-ime.get:)alendar.M,/-3;G !!!!!!!!!!!!dateAnd-ime.get:)alendar.DAF_,E_M,/-3;;.show:;5 !!!!!!< !!!!<;5 !!!! !!!!btn$:6utton;findViewById:R.id.time6tn;5 !!!! !!!!btn.setOnClickListener:new!7iew.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!v;!8 !!!!!!!!new!Time(ickerDialog:)&ronoDemo.t&isG !!!!!!!!!!!!!!!!!!!!tG !!!!!!!!!!!!!!!!!!!!dateAnd-ime.get:)alendar.3,2R;G !!!!!!!!!!!!!!!!!!!!dateAnd-ime.get:)alendar.M./2-*;G !!!!!!!!!!!!!!!!!!!!true;.show:;5 !!!!!!< !!!!<;5 **4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

!!!! !!!!dateAnd-ime+abel$:-ext7iew;findViewById:R.id.dateAnd-ime;5 !!!! !!!!updateLa!el:;5 !!< !! !!private!void!updateLa!el:;!8 !!!!dateAnd-ime+abel.setText:fmtDateAnd-ime !!!!!!!!!!!!!!!!!!!!!!!!!!!!!.format:dateAnd-ime.getTime:;;;5 !!< <

4he Qmo elQ $or this a%tivity is Nust a )alendar instan%e, initially set to be the %urrent ate an time. We pour it into the vie= via a DateEormat $ormatter. -n the update+abel:; metho , =e take the %urrent )alendar, $ormat it, an put it in the -ext7iew. Ia%h button is given a ,n)lic +istener %allba%k obNe%t. When the button is %li%ke , either a Date1ic erDialog or a -ime1ic erDialog is sho=n. -n the %ase o$ the Date1ic erDialog, =e give it a ,nDateSet+istener %allba%k that up ates the )alendar =ith the ne= ate &year, month, ay o$ month'. We also give the ialog the last2sele%te ate, getting the values out o$ the )alendar. -n the %ase o$ the -ime1ic erDialog, it gets a ,n-imeSet+istener %allba%k to up ate the time portion o$ the )alendar, the last2sele%te time, an a true in i%ating =e =ant 2<2hour mo e on the time sele%tor. With all this =ire together, the resulting a%tivity looks like this*

**7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

!igure -%< The Chrono/emo sample application6 as initially launched

!igure --< The same application6 sho)ing the date picker dialog

**9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

!igure -$< The same application6 sho)ing the time picker dialog

Time @eeps !lo)ing ike a 3iver


-$ you =ant to isplay the time, rather than have users enter the time, you may =ish to use the Digital)loc or Analog)loc =i gets. 4hese are e:tremely easy to use, as they automati%ally up ate =ith the passage o$ time. All you nee to o it put them in your layout an let them o their thing. (or e:ample, $rom the )loc s sample appli%ation, here is an DML layout %ontaining both Digital)loc an Analog)loc *
">xml!version$%?.@%!encoding$%utf-A%>' "Relative+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"Analog)loc !android#id$%9Bid/analog% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content% !!!!android#layout_center3ori(ontal$%true% !!!!android#layout_align1arent-op$%true% !!!!/' !!"Digital)loc !android#id$%9Bid/digital%

*%;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

!!!!android#layout_widt&$%wrap_content%! !!!!android#layout_&eig&t$%wrap_content% !!!!android#layout_center3ori(ontal$%true% !!!!android#layout_below$%9id/analog% !!!!/' "/Relative+ayout'

Without any Gava %o e other than the generate proNe%t an get the $ollo=ing a%tivity*

stub, =e %an buil

this

!igure -0< The Clocks/emo sample application

+aking Progress
-$ you nee to be oing something $or a long perio o$ time, you o=e it to your users to o t=o things*

"se a ba%kgroun threa , =hi%h =ill be %overe in a later %hapter Eeep them apprise o$ your progress, lest they think your a%tivity has =an ere a=ay an =ill never %ome ba%k

4he typi%al approa%h to keeping users in$orme o$ progress is some $orm o$ progress bar or QthrobberQ &think the animate graphi% to=ar s the upper2
*%*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

right %orner o$ many Web bro=sers'. An roi supports this through the 1rogress6ar =i get. A 1rogress6ar keeps tra%k o$ progress, e$ine as an integer, =ith 0 in i%ating no progress has been ma e. @ou %an e$ine the ma:imum en o$ the range O =hat value in i%ates progress is %omplete O via setMax:;. .y e$ault, a 1rogress6ar starts =ith a progress o$ @, though you %an start $rom some other position via set1rogress:;. -$ you pre$er your progress bar to be in eterminate, use set.ndeterminate:;, setting it to true. -n your Gava %o e, you %an either positively set the amount o$ progress that has been ma e &via set1rogress:;' or in%rement the progress $rom its %urrent amount &via increment1rogress6y:;'. @ou %an $in out ho= mu%h progress has been ma e via get1rogress:;. #in%e the 1rogress6ar is tie %losely to the use o$ threa s O a ba%kgroun threa oing =ork, up ating the "- threa =ith ne= progress in$ormation O =e =ill hol o$$ emonstrating the use o$ 1rogress6ar to a later %hapter.

Putting 8t ,n +y Tab
4he general An roi philosophy is to keep a%tivities short an s=eet. -$ there is more in$ormation than %an reasonably $it on one s%reen, albeit perhaps =ith s%rolling, then it perhaps belongs in another a%tivity ki%ke o$$ via an .ntent, as =ill be es%ribe later in this book. )o=ever, that %an be %ompli%ate to set up. Moreover, sometimes there legitimately is a lot o$ in$ormation that nee s to be %olle%te to be pro%esse as an atomi% operation. -n a tra itional "-, you might use tabs to a%%omplish this en , su%h as a =-abbed1ane in GavaU#=ing. -n An roi , you no= have an option o$ using a -ab3ost %ontainer in mu%h the same =ay O a portion o$ your a%tivity6s s%reen is taken up =ith tabs =hi%h, =hen %li%ke , s=ap out part o$ the vie= an repla%e it =ith something else. (or e:ample, you might have an a%tivity =ith
*%%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

a tab $or entering a lo%ation an a se%on tab $or sho=ing a map o$ that lo%ation. #ome 7"- toolkits re$er to QtabsQ as being Nust the things a user %li%ks on to toggle $rom one vie= to another. #ome toolkits re$er to QtabsQ as being the %ombination o$ the %li%kable button2ish element an the %ontent that appears =hen that tab is %hosen. An roi treats the tab buttons an %ontents as is%rete entities, so =e =ill %all them Qtab buttonsQ an Qtab %ontentsQ in this se%tion.

The Pieces
4here are a $e= =i gets an %ontainers you nee to use in or er to set up a tabbe portion o$ a vie=*
-ab3ost is the overar%hing %ontainer $or the tab buttons an %ontents -abCidget

tab

implements the ro= o$ tab buttons, =hi%h %ontain te:t labels an optionally %ontain i%ons is the %ontainer $or the tab %ontentsP ea%h tab %ontent is a %hil o$ the Erame+ayout
Erame+ayout

4his is similar to the approa%h that MoMilla6s D"L takes. -n D"L6s %ase, the tabbox element %orrespon s to An roi 6s -ab3ost, the tabs element %orrespon s to -abCidget, an tabpanels %orrespon s to the Erame+ayout.

The Idiosyncr sies


4here are a $e= rules to $ollo=, at least in this milestone e ition o$ the An roi toolkit, in or er to make these three =ork together*

@ou must give the -abCidget an android#id o$ 9android#id/tabs @ou must set asi e some pa buttons &more on this belo=' ing in the Erame+ayout $or the tab

*%Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

-$ you =ish to use the -abActivity, you must give the -ab3ost an android#id o$ 9android#id/tab&ost

-abActivity, like +istActivity, =raps a %ommon "- pattern &a%tivity ma e up entirely o$ tabs' into a pattern2a=are a%tivity sub%lass. @ou o not ne%essarily have to use -abActivity O a plain a%tivity %an use tabs as =ell.

With respe%t to the Erame+ayout pa ing issue, $or =hatever reason, the -abCidget oes not seem to allo%ate its o=n spa%e insi e the -ab3ost! %ontainer. -n other =or s, no matter =hat you spe%i$y $or android#layout_&eig&t $or the -abCidget, the Erame+ayout ignores it an ra=s at the top o$ the overall -ab3ost. @our tab %ontents obs%ure your tab buttons. )en%e, you nee to leave enough pa ing &via android#padding-op' in Erame+ayout to QshoveQ the a%tual tab %ontents o=n beneath the tab buttons. 4his is likely a bug, so this behavior may =ell %hange in $uture versions o$ the toolkit. -n a ition, the -abCidget seems to al=ays ra= itsel$ =ith room $or i%ons, even i$ you o not supply i%ons. )en%e, $or this version o$ the toolkit, you nee to supply at least 32 pi:els o$ pa ing, perhaps more epen ing on the i%ons you supply. (or e:ample, here is a layout e$inition $or a tabbe a%tivity, $rom -ab*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent%' !!"-ab3ost!android#id$%9Bid/tab&ost% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%fill_parent%' !!!!"-abCidget!android#id$%9android#id/tabs% !!!!!!android#layout_widt&$%fill_parent% !!!!!!android#layout_&eig&t$%wrap_content% !!!!/' !!!!"Erame+ayout!android#id$%9android#id/tabcontent% !!!!!!android#layout_widt&$%fill_parent% !!!!!!android#layout_&eig&t$%fill_parent% !!!!!!android#padding-op$%NHpx%' !!!!!!"Analog)loc !android#id$%9Bid/tab?% !!!!!!!!android#layout_widt&$%fill_parent%! !!!!!!!!android#layout_&eig&t$%fill_parent% *%$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

!!!!!!!!android#layout_center3ori(ontal$%true% !!!!!!/' !!!!!!"6utton!android#id$%9Bid/tabH% !!!!!!!!android#layout_widt&$%fill_parent% !!!!!!!!android#layout_&eig&t$%fill_parent% !!!!!!!!android#text$%A!semi-random!button% !!!!!!/' !!!!"/Erame+ayout' !!"/-ab3ost' "/+inear+ayout'

/ote that the -abCidget an Erame+ayout are imme iate %hil ren o$ the -ab3ost, an the Erame+ayout itsel$ has %hil ren representing the various tabs. -n this %ase, there are t=o tabs* a %lo%k an a button. -n a more %ompli%ate s%enario, the tabs are probably some $orm o$ %ontainer &e.g., +inear+ayout' =ith their o=n %ontents.

7irin! It To!ether
4he Gava %o e nee s to tell the -ab3ost =hat vie=s represent the tab %ontents an =hat the tab buttons shoul look like. 4his is all =rappe up in -abSpec! obNe%ts. @ou get a -abSpec instan%e $rom the host via new-abSpec:;, $ill it out, then a it to the host in the proper se;uen%e. 4he t=o key metho s on -abSpec are*
set)ontent:;, =here you in i%ate =hat goes in the tab %ontent $or this tab, typi%ally the android#id o$ the vie= you =ant sho=n =hen this tab is sele%te set.ndicator:;,

=here you provi e the %aption $or the tab button an , in some $lavors o$ this metho , supply a Drawable to represent the i%on $or the tab

/ote that tab Qin i%atorsQ %an a%tually be vie=s in their o=n right, i$ you nee more %ontrol than a simple label an optional i%on. Also note that you must %all setup:; on the -ab3ost be$ore %on$iguring any o$ these -abSpec obNe%ts. 4he %all to setup:; is not nee e i$ you are using the -abActivity base %lass $or your a%tivity.
*%0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

(or e:ample, here is the Gava %o e to =ire together the tabs $rom the pre%e ing layout e:ample*
pac age!com.commonsware.android.fancy5 import!android.app.Activity5 import!android.os.6undle5 import!android.widget.-ab3ost5 public!class!-abDemo!extends!Activity!8 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!-ab3ost!tabs$:-ab3ost;findViewById:R.id.tab&ost;5 !!!! !!!!tabs.setup:;5 !!!! !!!!-ab3ost.-abSpec!spec$tabs.newTa!Spec:%tag?%;5 !!!! !!!!spec.setContent:R.id.tab?;5 !!!!spec.setIndicator:%)loc %;5 !!!!tabs.addTa!:spec;5 !!!! !!!!spec$tabs.newTa!Spec:%tagH%;5 !!!!spec.setContent:R.id.tabH;5 !!!!spec.setIndicator:%6utton%;5 !!!!tabs.addTa!:spec;5 !!!! !!!!tabs.setCurrentTa!:@;5 !!< <

We $in our -ab3ost via the $amiliar find7iew6y.d:; metho , then have it setup:;. A$ter that, =e get a -abSpec via new-abSpec:;, supplying a tag =hose purpose is unkno=n at this time. 7iven the spe%, you %all set)ontent:; an set.ndicator:;, then %all add-ab:; ba%k on the -ab3ost to register the tab as available $or use. (inally, you %an %hoose =hi%h tab is the one to sho= via set)urrent-ab:;, provi ing the @2base in e: o$ the tab. 4he resultC

*%1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

!igure -1< The Tab/emo sample application6 sho)ing the first tab

!igure -4< The same application6 sho)ing the second tab

*%4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Employing !ancy Widgets and Containers

,ther Containers of 5ote


An roi o$$ers Absolute+ayout, =here the %ontents are lai out base on spe%i$i% %oor inate positions. @ou tell Absolute+ayout =here to pla%e a %hil in pre%ise D,@ %oor inates, an An roi puts it there, no ;uestions aske . >n the plus si e, this gives you pre%ise positioning. >n the minus si e, it means your vie=s =ill only look QrightQ on s%reens o$ a %ertain imension, or it re;uires you to =rite a bun%h o$ %o e to a Nust the %oor inates base on s%reen siMe. #in%e An roi s%reens might run the gamut o$ siMes, plus have ne= siMes %rop up perio i%ally, using Absolute+ayout %oul get ;uite annoying. An roi also has a ne= $lavor o$ list, the *xpandable+ist7iew. 4his provi es a simpli$ie tree representation, supporting t=o levels o$ epth* groups an %hil ren. 7roups %ontain %hil renP %hil ren are QleavesQ o$ the tree. 4his re;uires a ne= set o$ a apters, sin%e the +istAdapter $amily oes not provi e any sort o$ group in$ormation $or the items in the list. 4his vie= $eels like it is a =ork2in2progress an so is not %overe here, but shoul appear in a $uture e ition o$ this book.

*%7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 11

(pplying +enus

Like appli%ations $or the esktop an some mobile operating systems, su%h as !alm># an Win o=s Mobile, An roi supports a%tivities =ith Qappli%ationQ menus. #ome An roi phones =ill have a e i%ate menu key $or popping up the menuP others =ill o$$er alternate means $or triggering the menu to appear. Also, as =ith many 7"- toolkits, you %an %reate Q%onte:t menusQ. >n a tra itional 7"-, this might be triggere by the right2mouse button. >n mobile evi%es, %onte:t menus typi%ally appear =hen the user Qtaps2an 2 hol sQ over a parti%ular =i get. (or e:ample, i$ a -ext7iew ha a %onte:t menu, an the evi%e =as esigne $or $inger2base tou%h input, you %oul push the -ext7iew =ith your $inger, hol it $or a se%on or t=o, an a pop2up menu =ill appear $or the user to %hoose $rom. Where An roi i$$ers $rom most other 7"- toolkits is in terms o$ menu %onstru%tion. While you %an a items to the menu, you o not have $ull %ontrol over the menu6s %ontents, nor the timing o$ =hen the menu is built. !art o$ the menu is system2 e$ine , an that portion is manage by the An roi $rame=ork itsel$.

!lavors of +enu
An roi %onsi ers the t=o types o$ menu es%ribe above as being the Qoptions menuQ an Q%onte:t menuQ. 4he options menu is triggere by
*%9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

pressing the har =are QMenuQ button on the evi%e, =hile the %onte:t menu is raise by a tap2an 2hol on the =i get sporting the menu. -n a ition, the options menu operates in one o$ t=o mo es* i%on an e:pan e . When the user $irst presses the QMenuQ button, the i%on mo e =ill appear, sho=ing up to the $irst si: menu %hoi%es as large, $inger2$rien ly buttons in a gri at the bottom o$ the s%reen. -$ the menu has more than si: %hoi%es, the si:th button =ill be%ome QMoreQ O %li%king that option =ill bring up the e:pan e mo e, sho=ing the remaining %hoi%es not visible in the regular menu. 4he menu is s%rollable, so the user %an get to any o$ the menu %hoi%es.

+enus of ,ptions
Rather than buil ing your a%tivity6s options menu uring on)reate:;, the =ay you =ire up the rest o$ your "-, you instea nee to implement on)reate,ptionsMenu:;. 4his %allba%k re%eives an instan%e o$ Menu. 4he $irst thing you shoul o is %hain up=ar to the super%lass &super.on)reate,ptionsMenu:menu;', so the An roi $rame=ork %an a in any menu %hoi%es it $eels are ne%essary. 4hen, you %an go about a ing your o=n options, es%ribe belo=. -$ you =ill nee to a Nust the menu uring your a%tivity6s use &e.g., isable a no=2invali menu %hoi%e', Nust hol onto the Menu instan%e you re%eive in on)reate,ptionsMenu:;. /ote, ho=ever, that on)reate,ptionsMenu:; =ill be %alle ea%h an every time the user presses the Menu button. 7iven that you have re%eive a Menu obNe%t via on)reate,ptionsMenu:;, you a menu %hoi%es by %alling add:;. 4here are many $lavors o$ this metho , =hi%h re;uire some %ombination o$ the $ollo=ing parameters*

A group i enti$ier &int', =hi%h shoul be /,/* unless you are %reating a spe%i$i% groupe set o$ menu %hoi%es $or use =ith set0roup)&ec able:; &see belo='

*-;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

A %hoi%e i enti$ier &also an int', $or use in i enti$ying this %hoi%e in the on,ptions.temSelected:; %allba%k =hen a menu %hoi%e is %hosen An or er i enti$ier &yet another int', $or in i%ating =here this menu %hoi%e shoul be slotte i$ the menu has An roi 2supplie %hoi%es alongsi e your o=n O $or no=, Nust use /,/* 4he te:t o$ the menu %hoi%e, as a #tring or a resour%e -A

4he add:; $amily o$ metho s all return an instan%e o$ Menu.tem, =here you %an a Nust any o$ the menu item settings you have alrea y set &e.g., the te:t o$ the menu %hoi%e'. @ou %an also set the short%uts $or the menu %hoi%e O single2%hara%ter mnemoni%s that %hoose that menu %hoi%e =hen the menu is visible. An roi supports both an alphabeti% &or Q;=ertyQ' set o$ short%uts an a numeri% set o$ short%uts. 4hese are set in ivi ually by %alling setAlp&abeticS&ortcut:; an set/umericS&ortcut:; respe%tively. 4he menu is pla%e into alphabeti% short%ut mo e by %alling setTwertyMode:; on the menu =ith a true parameter. 4he %hoi%e an group i enti$iers are keys use to unlo%k a $eatures, su%h as*

itional menu

Calling Menu.temDset)&ec able:; =ith a %hoi%e i enti$ier, to %ontrol i$ the menu %hoi%e has a t=o2state %he%kbo: alongsi e the title, =here the %he%kbo: value gets toggle =hen the user %hooses that menu %hoi%e Calling MenuDset0roup)&ec able:; =ith a group i enti$ier, to turn a set o$ menu %hoi%es into ones =ith a mutual2e:%lusion ra io button bet=een them, so one out o$ the group %an be in the Q%he%ke Q state at any time

@ou %an also %all add.ntent,ptions:; to populate the menu =ith menu %hoi%es %orrespon ing to the available a%tivities $or an intent &see the %hapter on laun%hing a%tivities' (inally, you %an %reate $ly2out sub2menus by %alling addSubMenu:;, supplying the same parameters as addMenu:;. An roi =ill eventually %all on)reate1anelMenu:;, passing it the %hoi%e i enti$ier o$ your sub2menu,

*-*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

along =ith another Menu instan%e representing the sub2menu itsel$. As =ith on)reate,ptionsMenu:;, you shoul %hain up=ar to the super%lass, then a menu %hoi%es to the sub2menu. >ne limitation is that you %annot in e$initely nest sub2menus O a menu %an have a sub2menu, but a sub2menu %annot itsel$ have a sub2sub2menu. -$ the user makes a menu %hoi%e, your a%tivity =ill be noti$ie via the on,ptions.temSelected:; %allba%k that a menu %hoi%e =as sele%te . @ou are given the Menu.tem obNe%t %orrespon ing to the sele%te menu %hoi%e. A typi%al pattern is to switc&:; on the menu -A &item.get.tem.d:;' an take appropriate behavior. /ote that on,ptions.temSelected:; is use regar less o$ =hether the %hosen menu item =as in the base menu or in a submenu.

+enus in Context
.y an large, %onte:t menus use the same guts as option menus. 4he t=o main i$$eren%es are ho= you populate the menu an ho= you are in$orme o$ menu %hoi%es. (irst, you nee to in i%ate =hi%h =i get&s' on your a%tivity have %onte:t menus. 4o o this, %all registerEor)ontextMenu:; $rom your a%tivity, supplying the 7iew that is the =i get nee ing a %onte:t menu. /e:t, you nee to implement on)reate)ontextMenu:;, =hi%h, among other things, is passe the 7iew you supplie in registerEor)ontextMenu:;. @ou %an use that to etermine =hi%h menu to buil , assuming your a%tivity has more than one. 4he on)reate)ontextMenu:; metho gets the )ontextMenu itsel$, the 7iew the %onte:t menu is asso%iate =ith, an a )ontextMenu.)ontextMenu.nfo, =hi%h tells you =hi%h item in the list the user i the tap2an 2hol over, in %ase you =ant to %ustomiMe the %onte:t menu base on that in$ormation. (or e:ample, you %oul toggle a %he%kable menu %hoi%e base upon the %urrent state o$ the item. /ote that you only get this Qe:tra in$ormationQ =hen the menu is built, not =hen a %hoi%e is ma e.

*-%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

-t is also important to note that on)reate)ontextMenu:; gets %alle $or ea%h time the %onte:t menu is re;ueste . "nlike the options menu &=hi%h is only built on%e per a%tivity', %onte:t menus are is%ar e on%e they are use or ismisse . )en%e, you o not =ant to hol onto the supplie )ontextMenu! obNe%tP Nust rely on getting the %han%e to rebuil the menu to suit your a%tivity6s nee s on an on2 eman basis base on user a%tions. 4o $in out =hen a %onte:t menu %hoi%e =as %hosen, implement on the a%tivity. /ote that you only get the Menu.tem! instan%e that =as %hosen in this %allba%k. As a result, i$ your a%tivity has t=o or more %onte:t menus, you may =ant to ensure they have uni;ue menu item i enti$iers $or all their %hoi%es, so you %an tell them apart in this %allba%k. >ther=ise, this %allba%k behaves the same as on,ptions.temSelected:; as is es%ribe above.
on)ontext.temSelected:;

Taking a Peek
-n the sample proNe%t Menus, you =ill $in an amen e version o$ the +ist7iew sample &+ist' =ith an asso%iate menu. #in%e the menus are e$ine in Gava %o e, the DML layout nee not %hange an is not reprinte here. )o=ever, the Gava %o e has a $e= ne= behaviors*
public!class!MenuDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!StringPQ!items$8%lorem%G!%ipsum%G!%dolor%G!%sit%G!%amet%G !!!!!!!!!!%consectetuer%G!%adipiscing%G!%elit%G!%morbi%G!%vel%G !!!!!!!!!!%ligula%G!%vitae%G!%arcu%G!%aliJuet%G!%mollis%G !!!!!!!!!!%etiam%G!%vel%G!%erat%G!%placerat%G!%ante%G !!!!!!!!!!%porttitor%G!%sodales%G!%pellentesJue%G!%augue%G!%purus%<5 !!public!static!final!int!*.03-_.D!$!Menu.E.RS-B?5 !!public!static!final!int!S.U-**/_.D!$!Menu.E.RS-BH5 !!public!static!final!int!-C*/-F_E,2R_.D!$!Menu.E.RS-BI5 !!public!static!final!int!-C,_.D!$!Menu.E.RS-BO5 !!public!static!final!int!-3.R-F_-C,_.D!$!Menu.E.RS-BL5 !!public!static!final!int!E,R-F_.D!$!Menu.E.RS-BN5 !!public!static!final!int!E,R-F_*.03-_.D!$!Menu.E.RS-BV5 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!super.onCreate:icicle;5

*-Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

!!setContentView:R.layout.main;5 !!!!setList#dapter:new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G!items;;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!!! !!!!register"orContext'enu:getListView:;;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!int!positionG!long!id;!8 !!!selection.setText:itemsPpositionQ;5 !!< !! !!9,verride !!public!void!onCreateContext'enu:)ontextMenu!menuG!7iew!vG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)ontextMenu.)ontextMenu.nfo!menu.nfo;!8 !!!!populate'enu:menu;5 !!< !! !!9,verride !!public!boolean!onCreateOptions'enu:Menu!menu;!8 !!!!populate'enu:menu;5 !!!!return:super.onCreateOptions'enu:menu;;5 !!< !!9,verride !!public!boolean!onOptionsItemSelected:Menu.tem!item;!8 !!!!apply'enuChoice:item;5 !!!!return:apply'enuChoice:item;!WW !!!!!!!!!!!!super.onOptionsItemSelected:item;;5 !!< !!9,verride !!public!boolean!onContextItemSelected:Menu.tem!item;!8 !!!!return:apply'enuChoice:item;!WW !!!!!!!!!!!!super.onContextItemSelected:item;;5 !!< !! !!private!void!populate'enu:Menu!menu;!8 !!!!menu.add:Menu./,/*G!-C,_.DG!Menu./,/*G!%H!1ixels%;5 !!!!menu.add:Menu./,/*G!*.03-_.DG!Menu./,/*G!%A!1ixels%;5 !!!!menu.add:Menu./,/*G!S.U-**/_.DG!Menu./,/*G!%?N!1ixels%;5 !!!!menu.add:Menu./,/*G!-C*/-F_E,2R_.DG!Menu./,/*G!%HO!1ixels%;5 !!!!menu.add:Menu./,/*G!-3.R-F_-C,_.DG!Menu./,/*G!%IH!1ixels%;5 !!!!menu.add:Menu./,/*G!E,R-F_.DG!Menu./,/*G!%O@!1ixels%;5 !!!!menu.add:Menu./,/*G!E,R-F_*.03-_.DG!Menu./,/*G!%OA!1ixels%;5 !!< !! !!private!boolean!apply'enuChoice:Menu.tem!item;!8 !!!!switc&!:item.getItemId:;;!8 !!!!!!case!*.03-_.D#

*-$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

!!!!!!!!getListView:;.setDi !!!!!!!!return:true;5 !!!! !!!!!!case!S.U-**/_.D# !!!!!!!!getListView:;.setDi !!!!!!!!return:true;5 !!!! !!!!!!case!-C*/-F_E,2R_.D# !!!!!!!!getListView:;.setDi !!!!!!!!return:true;5 !!!! !!!!!!case!-C,_.D# !!!!!!!!getListView:;.setDi !!!!!!!!return:true;5 !!!! !!!!!!case!-3.R-F_-C,_.D# !!!!!!!!getListView:;.setDi !!!!!!!!return:true;5 !!!! !!!!!!case!E,R-F_.D# !!!!!!!!getListView:;.setDi !!!!!!!!return:true;5 !!!! !!!!!!case!E,R-F_*.03-_.D# !!!!!!!!getListView:;.setDi !!!!!!!!return:true;5 !!!!< !!!!return:false;5 !!< <

ider,eight:A;5

ider,eight:?N;5

ider,eight:HO;5

ider,eight:H;5

ider,eight:IH;5

ider,eight:O@;5

ider,eight:OA;5

-n on)reate:;, =e register our list =i get as having a %onte:t menu, =hi%h =e $ill in via our populateMenu:; private metho , by =ay o$ on)reate)ontextMenu:;. We also implement the on)reate,ptionsMenu:; %allba%k, in i%ating that our a%tivity also has an options menu. >n%e again, =e elegate to populateMenu:;! to $ill in the menu. >ur implementations o$ on,ptions.temSelected:; &$or options menu sele%tions' an on)ontext.temSelected:; &$or %onte:t menu sele%tions' both elegate to a private applyMenu)&oice:; metho , plus %haining up=ar s to the super%lass i$ none o$ our menu %hoi%es =as the one sele%te by the user.

*-0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

-n populateMenu:;, =e a $our menu %hoi%es, ea%h =ith a uni;ue i enti$ier. .eing laMy, =e es%he= the i%ons. -n applyMenu)&oice:;, =e see i$ any o$ our menu %hoi%es =ere %hosenP i$ so, =e set the list6s ivi er siMe to be the user2sele%te =i th. -nitially, the a%tivity looks the same in the emulator as it i $or +istDemo*

!igure -7< The +enu/emo sample application6 as initially launched

.ut, i$ you press the Menu button, you =ill get our options menu*

*-1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

!igure -9< The same application6 sho)ing the options menu

Cli%king the More button sho=s the remaining t=o menu %hoi%es*

!igure $;< The same application6 the remaining menu choices

*-4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

Choosing a height &say, ,3 pi:els' then %hanges the ivi er height o$ the list to something garish*

!igure $*< The same application6 made ugly

@ou %an trigger the %onte:t menu by oing a tap2an 2hol on any item in the list*

*-7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(pplying +enus

!igure $%< The same application6 sho)ing a context menu

>n%e again, %hoosing an option sets the ivi er height.

*-9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 1&

Embedding the Web@it Bro)ser

>ther 7"- toolkits let you use )4ML $or presenting in$ormation, $rom limite )4ML ren erers &e.g., GavaU#=ing, =:Wi gets' to embe ing -nternet I:plorer into ./I4 appli%ations. An roi is mu%h the same, in that you %an embe the built2in Web bro=ser as a =i get in your o=n a%tivities, $or isplaying )4ML or $ull2$le ge bro=sing. 4he An roi bro=ser is base on WebEit, the same engine that po=ers Apple6s #a$ari Web bro=ser. 4he An roi bro=ser is su$$i%iently %omple: that it gets its o=n Gava pa%kage &android.web it', though using the Ceb7iew =i get itsel$ %an be simple or po=er$ul, base upon your re;uirements.

( Bro)ser6 Writ Small


(or simple stu$$, Ceb7iew is not signi$i%antly i$$erent than any other =i get in An roi O pop it into a layout, tell it =hat "RL to navigate to via Gava %o e, an you6re one. (or e:ample &6rowser?', here is a simple layout =ith a Ceb7iew*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"Ceb7iew!android#id$%9Bid/web it%

*$*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Embedding the Web@it Bro)ser

!!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent%! !!/' "/+inear+ayout'

As =ith any other =i get, you nee to tell it ho= it shoul $ill up the spa%e in the layout &in this %ase, it $ills all remaining spa%e'. 4he Gava %o e is e;ually simple*
pac age!com.commonsware.android.web it5 import!android.app.Activity5 import!android.os.6undle5 import!android.web it.Ceb7iew5 public!class!6rowserDemo?!extends!Activity!8 !!Ceb7iew!browser5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!browser$:Ceb7iew;findViewById:R.id.web it;5 !!!! !!!!browser.load)rl:%&ttp#//commonsware.com%;5 !!< <

4he only bit unusual =ith this e ition o$ on)reate:; is that =e invoke load2rl:; on the Ceb7iew =i get, to tell it to loa a Web page &in this %ase, the home page o$ some ran om $irm'. )o=ever, =e also have to make one %hange to AndroidManifest.xml, re;uesting permission to a%%ess the -nternet*
"manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!pac age$%com.commonsware.android.web it%' !!"uses-permission!android#name$%android.permission../-*R/*-%!/' !!"application' !!!!"activity!android#name$%.6rowserDemo?%!android#label$%6rowserDemo?%' !!!!!!"intent-filter' !!!!!!!!"action!android#name$%android.intent.action.MA./%!/' !!!!!!!!"category!android#name$%android.intent.category.+A2/)3*R%!/' !!!!!!"/intent-filter' !!!!"/activity'

*$%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Embedding the Web@it Bro)ser

!!"/application' "/manifest'

-$ =e $ail to a

this permission, the bro=ser =ill re$use to loa pages. en s%rollbars*

4he resulting a%tivity looks like a Web bro=ser, Nust =ith hi

!igure $-< The Bro)ser* sample application

As =ith the regular An roi bro=ser, you %an pan aroun the page by ragging it, =hile the ire%tional pa moves you aroun all the $o%usable elements on the page. What is missing is all the e:tra a%%outerments that make up a Web bro=ser, su%h as a navigational toolbar.

oading 8t >p
4here are t=o main =ays to get %ontent into the Ceb7iew. >ne, sho=n above, is to provi e the bro=ser =ith a "RL an have the bro=ser isplay that page via load2rl:;. 4he bro=ser =ill a%%ess the -nternet through =hatever means
*$Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Embedding the Web@it Bro)ser

are available to that spe%i$i% evi%e at the present time &Wi(i, %ellular net=ork, .luetooth2tethere phone, =ell2traine tiny %arrier pigeons, et%.'. 4he alternative is to use loadData:;. )ere, you supply the )4ML $or the bro=ser to vie=. @ou might use this to*

isplay a manual that =as installe as a $ile =ith your appli%ation pa%kage isplay snippets o$ )4ML you retrieve as part o$ other pro%essing, su%h as the es%ription o$ an entry in an Atom $ee generate a =hole user inter$a%e using )4ML, instea o$ using the An roi =i get set

4here are t=o $lavors o$ loadData:;. 4he simpler one allo=s you to provi e the %ontent, the M-MI type, an the en%o ing, all as strings. 4ypi%ally, your M-MI type =ill be text/&tml an your en%o ing =ill be 2-E-A $or or inary )4ML. (or e:ample, i$ you repla%e the load2rl:; invo%ation in the previous e:ample =ith the $ollo=ing*
browser.loadData:%"&tml'"body'3elloG!worldX"/body'"/&tml'%G !!!!!!!!!!!!!!!!!!%text/&tml%G!%2-E-A%;5

@ou get*

*$$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Embedding the Web@it Bro)ser

!igure $$< The Bro)ser% sample application

4his is also available as a $ully2buil able sample, as 6rowserH.

5avigating the Waters


As =as mentione above, there is no navigation toolbar =ith the Ceb7iew! =i get. 4his allo=s you to use it in pla%es =here su%h a toolbar =oul be pointless an a =aste o$ s%reen real estate. 4hat being sai , i$ you =ant to o$$er navigational %apabilities, you %an, but you have to supply the "-.
Ceb7iew o$$ers =ays to per$orm gar

en2variety bro=ser navigation, in%lu ing* Web page

reload:; to re$resh the %urrently2vie=e go6ac :;

to go ba%k one step in the bro=ser history, an can0o6ac :;! to etermine i$ there is any history to go ba%k to
goEorward:; to go can0oEorward:; to go6ac ,rEorward:;

$or=ar one step in the bro=ser history, an etermine i$ there is any history to go $or=ar to

to go ba%k=ar s or $or=ar s in the bro=ser history, =here negative numbers represent a %ount o$ steps to go
*$0

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Embedding the Web@it Bro)ser

ba%k=ar s, an positive numbers represent ho= many steps to go $or=ar s

to see i$ the bro=ser %an go ba%k=ar s or $or=ar s the state number o$ steps &$ollo=ing the same positiveUnegative %onvention as go6ac ,rEorward:;'
can0o6ac ,rEorward:; clear)ac&e:;

to %lear the bro=ser resour%e %a%he an clear3istory:;! to %lear the bro=sing history

Entertaining the Client


!arti%ularly i$ you are going to use the Ceb7iew as a lo%al user inter$a%e &vs. bro=sing the Web', you =ill =ant to be able to get %ontrol at key times, parti%ularly =hen users %li%k on links. @ou =ill =ant to make sure those links are han le properly, either by loa ing your o=n %ontent ba%k into the Ceb7iew, by submitting an .ntent to An roi to open the "RL in a $ull bro=ser, or by some other means &see the %hapter on laun%hing a%tivities'. @our hook into Ceb7iew a%tivity is via setCeb7iew)lient:;, =hi%h takes an instan%e o$ a Ceb7iew)lient implementation as a parameter. 4he supplie %allba%k obNe%t =ill be noti$ie o$ a =i e range o$ a%tivities, ranging $rom =hen parts o$ a page have been retrieve &on1ageStarted:;, et%.' to =hen you, as the host appli%ation, nee to han le %ertain user2 or %ir%umstan%e2 initiate events, su%h as*
on-ooManyRedirects:; onReceived3ttpAut&ReJuest:;

et%.

A %ommon hook =ill be s&ould,verride2rl+oading:;, =here your %allba%k is passe a "RL &plus the Ceb7iew itsel$' an you return true i$ you =ill han le the re;uest or false i$ you =ant e$ault han ling &e.g., a%tually $et%h the Web page re$eren%e by the "RL'. -n the %ase o$ a $ee rea er appli%ation, $or e:ample, you =ill probably not have a $ull bro=ser =ith navigation built into your rea er, so i$ the user %li%ks a "RL, you probably =ant to use an .ntent to ask An roi to loa that page in a $ull bro=ser. .ut, i$ you have

*$1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Embedding the Web@it Bro)ser

inserte a Q$akeQ "RL into the )4ML, representing a link to some a%tivity2 provi e %ontent, you %an up ate the Ceb7iew yoursel$. (or e:ample, let6s amen the $irst bro=ser e:ample to be a bro=ser2base e;uivalent o$ our original e:ample* an appli%ation that, upon a %li%k, sho=s the %urrent time. (rom 6rowserI, here is the revise Gava*
pac age!com.commonsware.android.web it5 import!android.app.Activity5 import!android.os.6undle5 import!android.web it.Ceb7iew5 import!android.web it.Ceb7iew)lient5 import!java.util.Date5 public!class!6rowserDemoI!extends!Activity!8 !!Ceb7iew!browser5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!browser$:Ceb7iew;findViewById:R.id.web it;5 !!!!browser.set&e!ViewClient:new!Call!ack:;;5 !!!! !!!!loadTime:;5 !!< !! !!void!loadTime:;!8 !!!!String!page$%"&tml'"body'"a!&ref$4%cloc 4%'% !!!!!!!!!!!!Bnew!Date:;.toString:; !!!!!!!!!!!!B%"/a'"/body'"/&tml'%5 !!!!!!!!!!!! !!!!!!!!!!!!browser.loadData&ithBase)$L:%x-data#//base%G!pageG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%text/&tml%G!%2-E-A%G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!null;5 !!< !!private!class!)allbac !extends!Ceb7iew)lient!8 !!!!public!boolean!shouldO erride)rlLoading:Ceb7iew!viewG!String!url;!8 !!!!!!loadTime:;5 !!!!!! !!!!!!return:true;5 !!!!<

*$4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Embedding the Web@it Bro)ser

)ere, =e loa a simple Web page into the bro=ser & load-ime:;' that %onsists o$ the %urrent time, ma e into a hyperlink to the /cloc "RL. We also atta%h an instan%e o$ a Ceb7iew)lient sub%lass, provi ing our implementation o$ s&ould,verride2rl+oading:;. -n this %ase, no matter =hat the "RL, =e =ant to Nust reloa the Ceb7iew via load-ime:;. Running this a%tivity gives us*

!igure $0< The Bro)ser- sample application

#ele%ting the link an %li%king the A2pa %enter button =ill Q%li%kQ the link, %ausing us to rebuil the page =ith the ne= time.

Settings6 Preferences6 and ,ptions #,h6 +y!&


With your $avorite esktop Web bro=ser, you have some sort o$ QsettingsQ or Qpre$eren%esQ or QoptionsQ =in o=. .et=een that an the toolbar %ontrols, you %an t=eak an t=i le the behavior o$ your bro=ser, $rom pre$erre $onts to the behavior o$ Gavas%ript.

*$7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Embedding the Web@it Bro)ser

#imilarly, you %an a Nust the settings o$ your Ceb7iew =i get as you see $it, via the CebSettings instan%e returne $rom %alling the =i get6s getSettings:;! metho . 4here are lots o$ options on CebSettings to play =ith. Most appear $airly esoteri% &e.g., setEantasyEontEamily:;'. )o=ever, here are some that you may $in more use$ul*

Control the $ont siMing via setDefaultEontSi(e:; &to use a point siMe' or set-extSi(e:; &to use %onstants in i%ating relative siMes like +AR0*R an SMA++*S-' Control Gavas%ript via set=avaScript*nabled:; &to isable it outright' an set=avaScript)an,penCindowsAutomatically:; &to merely stop it $rom opening pop2up =in o=s' Control Web site ren ering via set2serAgent:; O @ means the Ceb7iew! gives the Web site a user2agent string that in i%ates it is a mobile bro=ser, =hile ? results in a user2agent string that suggests it is a esktop bro=ser

4he settings you %hange are not persistent, so you shoul store them some=here &su%h as via the An roi pre$eren%es engine' i$ you are allo=ing your users to etermine the settings, versus har 2=iring the settings in your appli%ation.

*$9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 1'

Sho)ing Pop">p +essages

#ometimes, your a%tivity &or other pie%e o$ An roi %o e' =ill nee to speak up. /ot every intera%tion =ith An roi users =ill be neat, ti y, an %ontainable in a%tivities %ompose o$ vie=s. Irrors =ill %rop up. .a%kgroun tasks may take =ay longer than e:pe%te . #omething asyn%hronous may o%%ur, su%h as an in%oming message. -n these an other %ases, you may nee to %ommuni%ate =ith the user outsi e the boun s o$ the tra itional user inter$a%e. >$ %ourse, this is nothing ne=. Irror messages in the $orm o$ ialog bo:es have been aroun $or a very long time. More subtle in i%ators also e:ist, $rom task tray i%ons to boun%ing o%k i%ons to a vibrating %ell phone. An roi has ;uite a $e= systems $or letting you alert your users outsi e the boun s o$ an Activity2base "-. >ne, noti$i%ations, is tie heavily into intents an servi%es an , as su%h, is %overe in a later %hapter. -n this %hapter, you =ill see t=o means o$ raising pop2up messages* toasts an alerts.

3aising Toasts
A -oast is a transient message, meaning that it isplays an isappears on its o=n =ithout user intera%tion. Moreover, it oes not take $o%us a=ay $rom
*0*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Sho)ing Pop">p +essages

the %urrently2a%tive Activity, so i$ the user is busy =riting the ne:t 7reat Ameri%an !rogramming 7ui e, they =ill not have keystrokes be QeatenQ by the message. #in%e a -oast is transient, you have no =ay o$ kno=ing i$ the user even noti%es it. @ou get no a%kno=le gment $rom them, nor oes the message sti%k aroun $or a long time to pester the user. )en%e, the -oast is mostly $or a visory messages, su%h as in i%ating a long2running ba%kgroun task is %omplete , the battery has roppe to a lo=2but2not2too2lo= level, et%. Making a -oast is $airly easy. 4he -oast %lass o$$ers a stati% ma e-ext:; that a%%epts a String &or string resour%e -A' an returns a -oast instan%e. 4he ma e-ext:; metho also nee s the Activity &or other )ontext' plus a uration. 4he uration is e:presse in the $orm o$ the +*/0-3_S3,R- or +*/0-3_+,/0 %onstants to in i%ate, on a relative basis, ho= long the message shoul remain visible. -$ you =oul pre$er your -oast be ma e out o$ some other 7iew, rather that be a boring ol pie%e o$ te:t, simply %reate a ne= -oast instan%e via the %onstru%tor &=hi%h takes a )ontext', then %all set7iew:; to supply it =ith the vie= to use an setDuration:; to set the uration. >n%e your -oast is %on$igure , %all its s&ow:; metho , an the message =ill be isplaye .

(lert! (lert!
-$ you =oul pre$er something in the more %lassi% ialog bo: style, =hat you =ant is an AlertDialog. As =ith any other mo al ialog bo:, an AlertDialog! pops up, grabs the $o%us, an stays there until %lose by the user. @ou might use this $or a %riti%al error, a vali ation message that %annot be e$$e%tively isplaye in the base a%tivity "-, or something else =here you are sure that the user nee s to see the message an nee s to see it no=. 4he simplest =ay to %onstru%t an AlertDialog is to use the 6uilder %lass. (ollo=ing in true buil er style, 6uilder o$$ers a series o$ metho s to
*0%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Sho)ing Pop">p +essages

%on$igure an AlertDialog, ea%h metho returning the 6uilder $or easy %haining. At the en , you %all s&ow:; on the buil er to isplay the ialog bo:. Commonly2use %on$iguration metho s on 6uilder in%lu e*
setMessage:; i$ you =ant the Qbo yQ o$ the ialog to be a simple te:tual message, $rom either a supplie String or a supplie string resour%e -A set-itle:; an

to %on$igure the te:t an Uor i%on to appear in the title bar o$ the ialog bo:
set1ositive6utton:;, set/eutral6utton:;, an set/egative6utton:;, to

set.con:;,

in i%ate =hi%h button&s' shoul appear a%ross the bottom o$ the ialog, =here they shoul be positione &le$t, %enter, or right, respe%tively', =hat their %aptions shoul be, an =hat logi% shoul be invoke =hen the button is %li%ke &besi es ismissing the ialog'.

-$ you nee to %on$igure the AlertDialog beyon =hat the buil er allo=s, instea o$ %alling s&ow:;, %all create:; to get the partially2built AlertDialog! instan%e, %on$igure it the rest o$ the =ay, then %all one o$ the $lavors o$ s&ow:; on the AlertDialog itsel$. >n%e s&ow:; is %alle , the ialog bo: =ill appear an a=ait user input.

Checking Them ,ut


4o see ho= these =ork in pra%ti%e, take a peek at Message, %ontaining the $ollo=ing layout...*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent%! !!android#layout_&eig&t$%fill_parent%!' !!"6utton !!!!android#id$%9Bid/alert% !!!!android#text$%Raise!an!alert% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content%/'

*0Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Sho)ing Pop">p +essages

!!"6utton !!!!android#id$%9Bid/toast% !!!!android#text$%Ma e!a!toast% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content%/' "/+inear+ayout'

...an Gava %o e*
public!class!MessageDemo!extends!Activity!implements!7iew.,n)lic +istener!8 !!6utton!alert5 !!6utton!toast5 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!! !!!!setContentView:R.layout.main;5 !!!! !!!!alert$:6utton;findViewById:R.id.alert;5 !!!!alert.setOnClickListener:t&is;5 !!!!toast$:6utton;findViewById:R.id.toast;5 !!!!toast.setOnClickListener:t&is;5 !!< !! !!public!void!onClick:7iew!view;!8 !!!!if!:view$$alert;!8 !!!!!!new!AlertDialog.Builder:t&is; !!!!!!!!.setTitle:%MessageDemo%; !!!!!!!!.set'essage:%ee X%; !!!!!!!!.set%eutralButton:%)lose%G!new!Dialog.nterface.OnClickListener:;!8 !!!!!!!!!!public!void!onClick:Dialog.nterface!dlgG!int!sumt&in;!8 !!!!!!!!!!!!//!do!not&ing!Y!it!will!close!on!its!own !!!!!!!!!!< !!!!!!!!<; !!!!!!!!.show:;5 !!!!< !!!!else!8 !!!!!!-oast !!!!!!!!.makeText:t&isG!%"clin G!clin '%G!-oast.+*/0-3_S3,R-; !!!!!!!!.show:;5 !!!!< !!< <

4he layout is unremarkable O Nust a pair o$ buttons to trigger the alert an the toast. When you %li%k the alert button, =e use a buil er &new!6uilder:t&is;' to set the title &set-itle:%MessageDemo%;', message &setMessage:%ee X%;', an
*0$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Sho)ing Pop">p +essages

Qneutral buttonQ &set/eutral6utton:%)lose%G ! new ! ,n)lic +istener:; ! ...' be$ore sho=ing the ialog. When the button is %li%ke , the ,n)lic +istener! %allba%k oes nothing O the mere $a%t the button =as presse %auses the ialog to be ismisse . )o=ever, you %oul up ate in$ormation in your a%tivity base upon the user a%tion, parti%ularly i$ you have multiple buttons $or the user to %hoose $rom. 4he result is a typi%al ialog bo:*

!igure $1< The +essage/emo sample application6 after clicking the =3aise an alert= button

When you %li%k the toast button, the -oast %lass makes us a te:t2base toast &ma e-ext:t&isG ! %"clin G ! clin '%G ! +*/0-3_S3,R-;', =hi%h =e then s&ow:;. 4he result is a short2live , non2interrupting message*

*00
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Sho)ing Pop">p +essages

!igure $4< The same application6 after clicking the =+ake a toast= button

*01
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 1(

/ealing )ith Threads

- eally, you =ant your a%tivities to be o=nright snappy, so your users on6t $eel that your appli%ation is sluggish. Respon ing to user input ;ui%kly &e.g., 200ms' is a $ine goal. At minimum, though, you nee to make sure you respon =ithin B se%on s, lest the ActivityManager e%i e to play the role o$ the 7rim Reaper an kill o$$ your a%tivity as being non2responsive. >$ %ourse, your a%tivity might have real =ork to o, =hi%h takes non2 negligible amounts o$ time. 4here are t=o =ays o$ ealing =ith this* ,. Ao e:pensive operations in a ba%kgroun servi%e, relying on noti$i%ations to prompt users to go ba%k to your a%tivity

2. Ao e:pensive =ork in a ba%kgroun threa An roi provi es a veritable %ornu%opia o$ means to set up ba%kgroun threa s yet allo= them to sa$ely intera%t =ith the "- on the "- threa . 4hese in%lu e 3andler obNe%ts, posting Runnable! obNe%ts to the 7iew, an using 2.-&read2tilities.

'etting Through the Dandlers


4he most $le:ible means o$ making an An roi 2$rien ly ba%kgroun threa is to %reate an instan%e o$ a 3andler sub%lass. @ou only nee one 3andler! obNe%t per a%tivity, an you o not nee to manually register it or anything O

*04
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

/ealing )ith Threads

merely %reating the instan%e is su$$i%ient to register it =ith the An roi threa ing subsystem. @our ba%kgroun threa %an %ommuni%ate =ith the 3andler, =hi%h =ill o all o$ its =ork on the a%tivity "- threa . 4his is important, as "- %hanges, su%h as up ating =i gets, shoul only o%%ur on the a%tivity "- threa . @ou have t=o options $or %ommuni%ating =ith the 3andler* messages an Runnable obNe%ts.

%ess !es
4o sen a Message to a 3andler, $irst invoke obtainMessage:; to get the Message! obNe%t out o$ the pool. 4here are a $e= $lavors o$ obtainMessage:;, allo=ing you to Nust %reate empty Message obNe%ts, or ones populate =ith message i enti$iers an arguments. 4he more %ompli%ate your 3andler pro%essing nee s to be, the more likely it is you =ill nee to put ata into the Message to help the 3andler istinguish i$$erent events. 4hen, you sen the Message to the 3andler via its message ;ueue, using one o$ the sendMessage...:; $amily o$ metho s, su%h as*
sendMessage:; puts the message on the ;ueue imme sendMessageAtEront,fTueue:;

iately

puts the message on the ;ueue imme iately, an moreover puts it at the $ront o$ the message ;ueue &versus the ba%k, as is the e$ault', so your message takes priority over all others puts the message on the ;ueue at the state time, e:presse in the $orm o$ millise%on s base on system uptime &System)loc .uptimeMillis:;'
sendMessageAt-ime:; sendMessageDelayed:;

puts the message on the ;ueue a$ter a elay, e:presse in millise%on s

4o

these messages, your 3andler nee s to implement &andleMessage:;, =hi%h =ill be %alle =ith ea%h message that appears on the

pro%ess

*07
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

/ealing )ith Threads

message ;ueue. 4here, the han ler %an up ate the "- as nee e . )o=ever, it shoul still o that =ork ;ui%kly, as other "- =ork is suspen e until the 3andler is one. (or e:ample, let6s %reate a 1rogress6ar an up ate it via a 3andler. )ere is the layout $rom 3andler*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"1rogress6ar!android#id$%9Bid/progress% !!!!style$%>android#attr/progress6arStyle3ori(ontal% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content%!/' "/+inear+ayout'

4he 1rogress6ar, in a ition to setting the =i th an height as normal, also employs t=o other properties o$ note*
style,

=hi%h =ill be %overe in greater etail in some $uture e ition o$ this book. (or no=, su$$i%e it to say that it in i%ates this 1rogress6ar shoul be ra=n as the tra itional horiMontal bar sho=ing the amount o$ =ork that has been %omplete .
android#max,

=hi%h in i%ates the ma:imum value $or the 1rogress6ar! &i.e., at =hat value is the =ork Q oneQ an the progress bar %omplete '. A value o$ ?@@ means the 1rogress6ar =orks on a simple per%entage system.

An here is the Gava*


pac age!com.commonsware.android.t&reads5 import!android.app.Activity5 import!android.os.6undle5 import!android.os.3andler5 import!android.os.Message5 import!android.widget.1rogress6ar5 public!class!3andlerDemo!extends!Activity!8 !!1rogress6ar!bar5 !!3andler!&andler$new!,andler:;!8

*09
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

/ealing )ith Threads

!!!!9,verride !!!!public!void!handle'essage:Message!msg;!8 !!!!!!bar.increment(rogressBy:L;5 !!!!< !!<5 !!boolean!isRunning$false5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!bar$:1rogress6ar;findViewById:R.id.progress;5 !!< !! !!public!void!onStart:;!8 !!!!super.onStart:;5 !!!!bar.set(rogress:@;5 !!!! !!!!-&read!bac ground$new!Thread:new!$unna!le:;!8 !!!!!!public!void!run:;!8 !!!!!!!!try!8 !!!!!!!!!!for!:int!i$@5i"H@!ZZ!isRunning5iBB;!8 !!!!!!!!!!!!-&read.sleep:?@@@;5 !!!!!!!!!!!!&andler.send'essage:&andler.o!tain'essage:;;5 !!!!!!!!!!< !!!!!!!!< !!!!!!!!catc&!:-&rowable!t;!8 !!!!!!!!!!//!just!end!t&e!bac ground!t&read !!!!!!!!< !!!!!!< !!!!<;5 !!!! !!!!isRunning$true5 !!!!bac ground.start:;5 !!< !! !!public!void!onStop:;!8 !!!!super.onStop:;5 !!!!isRunning$false5 !!< <

As part o$ %onstru%ting the Activity, =e %reate an instan%e o$ 3andler, =ith our implementation o$ &andleMessage:;. .asi%ally, $or any message re%eive , =e up ate the 1rogress6ar by L points, then e:it the message han ler. -n onStart:;, =e set up a ba%kgroun threa . -n a real system, this threa =oul o something meaning$ul. )ere, =e Nust sleep one se%on , post a Message to the 3andler, an repeat $or a total o$ H@ passes.

*1;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

/ealing )ith Threads

/ote that =e then leave onStart:;. 4his is %ru%ial. 4he onStart:; metho is invoke on the a%tivity "- threa , so it %an up ate =i gets an su%h. )o=ever, that means =e nee to get out o$ onStart:;, both to let the 3andler! get its =ork one, an also so An roi oes not think our a%tivity is stu%k. 4he resulting a%tivity is simply a horiMontal progress bar*

!igure $7< The Dandler/emo sample application

Runn 3les
-$ you =oul rather not $uss =ith Message obNe%ts, you %an also pass Runnable! obNe%ts to the 3andler, =hi%h =ill run those Runnable obNe%ts on the a%tivity "- threa . 3andler o$$ers a set o$ post...:; metho s $or passing Runnable! obNe%ts in $or eventual pro%essing.

3unning 8n Place
Gust as 3andler supports post:; an postDelayed:; to a Runnable obNe%ts to the event ;ueue, you %an use those same metho s on 7iew. 4his lightly

*1*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

/ealing )ith Threads

simpli$ies your %o e, in that you %an then skip the 3andler obNe%t. )o=ever, you lose a bit o$ $le:ibility, an the 3andler has been aroun longer in the An roi toolkit an may be more teste .

Where6 ,h Where Das +y >8 Thread 'one:


#ometimes, you may not kno= i$ you are presently e:e%uting on the "threa o$ your appli%ation. (or e:ample, i$ you pa%kage some o$ your %o e in a GAR $or others to reuse, you might not kno= =hether your %o e is being e:e%ute on the "- threa or $rom a ba%kgroun threa . 4o help %ombat this problem, Activity o$$ers run,n2.-&read:;. 4his =orks similar to the post:; metho s on 3andler an 7iew, in that it ;ueues up a Runnable to run on the "- threa ...i$ you are not on the "- threa right no=. -$ you alrea y are on the "- threa , it invokes the Runnable imme iately. 4his gives you the best o$ both =orl s* no elay i$ you are on the "- threa , yet sa$ety in %ase you are not.

(nd 5o)6 The Caveats


.a%kgroun threa s, =hile eminently possible using the An roi 3andler! system, are not all happiness an =arm puppies. .a%kgroun threa s not only a %omple:ity, but they have real2=orl %osts in terms o$ available memory, C!", an battery li$e. 4o that en , there are a =i e range o$ s%enarios you nee to a%%ount $or =ith your ba%kgroun threa , in%lu ing*

4he possibility that users =ill intera%t =ith your a%tivity6s "- =hile the ba%kgroun threa is %hugging along. -$ the =ork that the ba%kgroun threa is oing is altere or invali ate by the user input, you =ill nee to %ommuni%ate this to the ba%kgroun threa . An roi in%lu es many %lasses in the java.util.concurrent pa%kage that =ill help you %ommuni%ate sa$ely =ith your ba%kgroun threa . 4he possibility that the a%tivity =ill be kille o$$ =hile ba%kgroun =ork is going on. (or e:ample, a$ter starting your a%tivity, the user
*1%

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

/ealing )ith Threads

might have a %all %ome in, $ollo=e by a te:t message, $ollo=e by a nee to look up a %onta%t...all o$ =hi%h might be su$$i%ient to ki%k your a%tivity out o$ memory. 4he ne:t %hapter =ill %over the various events An roi =ill take your a%tivity throughP hook the proper ones an be sure to shut o=n your ba%kgroun threa %leanly =hen you have the %han%e.

4he possibility that your user =ill get irritate i$ you %he= up a lot o$ C!" time an battery li$e =ithout giving any payba%k. 4a%ti%ally, this means using 1rogress6ar or other means o$ letting the user kno= that something is happening. #trategi%ally, this means you still nee to be e$$i%ient at =hat you o O ba%kgroun threa s are no pana%ea $or sluggish or pointless %o e. 4he possibility that you =ill en%ounter an error uring ba%kgroun pro%essing. (or e:ample, i$ you are gathering in$ormation o$$ the -nternet, the evi%e might lose %onne%tivity. Alerting the user o$ the problem via a /oti$i%ation! an shutting o=n the ba%kgroun threa may be your best option.

*1Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 1)

Dandling (ctivity ifecycle Events

While this may soun like a broken re%or ...please remember that An roi evi%es, by an large, are phones. As su%h, some a%tivities are more important that others O taking a %all is probably more important to users than is playing #u oku. An , sin%e it is a phone, it probably has less RAM than oes your %urrent esktop or notebook. As a result, your a%tivity may $in itsel$ being kille o$$ be%ause other a%tivities are going on an the system nee s your a%tivity6s memory. 4hink o$ it as the An roi e;uivalent o$ the Q%ir%le o$ li$eQ O your a%tivity ies so others may live, an so on. @ou %annot assume that your a%tivity =ill run until you think it is %omplete, or even until the user thinks it is %omplete. 4his is one e:ample O perhaps the most important e:ample O o$ ho= an a%tivity6s li$e%y%le =ill a$$e%t your o=n appli%ation logi%. 4his %hapter %overs the various states an %allba%ks that make up an a%tivity6s li$e%y%le an ho= you %an hook into them appropriately.

SchroedingerAs (ctivity
An a%tivity, generally speaking, is in one o$ $our states at any point in time*

*10
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Dandling (ctivity ifecycle Events

Active* the a%tivity =as starte by the user, is running, an is in the $oregroun . 4his is =hat you6re use to thinking o$ in terms o$ your a%tivity6s operation. Paused* the a%tivity =as starte by the user, is running, an is visible, but a noti$i%ation or something is overlaying part o$ the s%reen. Auring this time, the user %an see your a%tivity but may not be able to intera%t =ith it. (or e:ample, i$ a %all %omes in, the user =ill get the opportunity to take the %all or ignore it. #topped* the a%tivity =as starte by the user, is running, but it is hi en by other a%tivities that have been laun%he or s=it%he to. @our appli%ation =ill not be able to present anything meaning$ul to the user ire%tly, only by =ay o$ a /oti$i%ation!. Dead* either the a%tivity =as never starte &e.g., Nust a$ter a phone reset' or the a%tivity =as terminate , perhaps ue to la%k o$ available memory.

ife6 /eath6 and .our (ctivity


An roi =ill %all into your a%tivity as the a%tivity transitions bet=een the $our states liste above. #ome transitions may result in multiple %alls to your a%tivity, an sometimes An roi =ill kill your appli%ation =ithout %alling it. 4his =hole area is rather murky an probably subNe%t to %hange, so pay %lose attention to the o$$i%ial An roi o%umentation as =ell as this se%tion =hen e%i ing =hi%h events to pay attention to an =hi%h you %an sa$ely ignore. /ote that $or all o$ these, you shoul %hain up=ar an invoke the super%lass6 e ition o$ the metho , or An roi may raise an e:%eption.

onCre te89 nd onDestroy89


We have been implementing on)reate:; in all o$ our Activity sub%lasses in all the e:amples. 4his =ill get %alle in three situations* ,. When the a%tivity is $irst starte &e.g., sin%e a system restart', on)reate:; =ill be invoke =ith a null parameter.
*11
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Dandling (ctivity ifecycle Events

2. -$ the a%tivity ha been running, then sometime later =as kille o$$, on)reate:; =ill be invoke =ith the 6undle $rom onSave.nstanceState:; as a parameter &see belo='. ?. -$ the a%tivity ha been running an you have set up your a%tivity to have i$$erent resour%es base on i$$erent evi%e states &e.g., lan s%ape versus portrait', your a%tivity =ill be re2%reate an on)reate:; =ill be %alle . )ere is =here you initialiMe your user inter$a%e an set up anything that nee s to be one on%e, regar less o$ ho= the a%tivity gets use . >n the other en o$ the li$e%y%le, onDestroy:; may be %alle =hen the a%tivity is shutting o=n, either be%ause the a%tivity %alle finis&:; &=hi%h Q$inishesQ the a%tivity' or be%ause An roi nee s RAM an is %losing the a%tivity prematurely. /ote that onDestroy:; may not get %alle i$ the nee $or RAM is urgent &e.g., in%oming phone %all' an that the a%tivity =ill Nust get shut o=n regar less. )en%e, onDestroy:; is mostly $or %leanly releasing resour%es you obtaine in on)reate:; &i$ any'.

onSt rt894 onRest rt894 nd onStop89


An a%tivity %an %ome to the $oregroun either be%ause it is $irst being laun%he , or be%ause it is being brought ba%k to the $oregroun a$ter having been hi en &e.g., by another a%tivity, by an in%oming phone %all'. 4he onStart:; metho is %alle in either o$ those %ases. 4he onRestart:;! metho is %alle in the %ase =here the a%tivity ha been stoppe an is no= restarting. Conversely, onStop:; is %alle =hen the a%tivity is about to be stoppe .

onP use89 nd onResume89


4he onResume:; metho is %alle Nust be$ore your a%tivity %omes to the $oregroun , either a$ter being initially laun%he , being restarte $rom a
*14
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Dandling (ctivity ifecycle Events

stoppe state, or a$ter a pop2up ialog &e.g., in%oming %all' is %leare . 4his is a great pla%e to re$resh the "- base on things that may have o%%urre sin%e the user last =as looking at your a%tivity. (or e:ample, i$ you are polling a servi%e $or %hanges to some in$ormation &e.g., ne= entries $or a $ee ', onResume:; is a $ine time to both re$resh the %urrent vie= an , i$ appli%able, ki%k o$$ a ba%kgroun threa to up ate the vie= &e.g., via a 3andler'. Conversely, anything that steals your user a=ay $rom your a%tivity O mostly, the a%tivation o$ another a%tivity O =ill result in your on1ause:; being %alle . )ere, you shoul un o anything you i in onResume:;, su%h as stopping ba%kgroun threa s, releasing any e:%lusive2a%%ess resour%es you may have a%;uire &e.g., %amera', an the like. >n%e on1ause:; is %alle , An roi reserves the right to kill o$$ your a%tivity6s pro%ess at any point. )en%e, you shoul not be relying upon re%eiving any $urther events.

The 'race of State


Mostly, the a$orementione metho s are $or ealing =ith things at the appli%ation2general level &e.g., =iring together the last pie%es o$ your "- in on)reate:;, %losing o=n ba%kgroun threa s in on1ause:;'. )o=ever, a large part o$ the goal o$ An roi is to have a patina o$ seamlessness. A%tivities may %ome an go as i%tate by memory re;uirements, but users are, i eally, una=are that this is going on. -$, $or e:ample, they =ere using a %al%ulator, an %ome ba%k to that %al%ulator a$ter an absen%e, they shoul see =hatever number&s' they =ere =orking on originally O unless they themselves took some a%tion to %lose o=n the %al%ulator. 4o make all this =ork, a%tivities nee to be able to save their appli%ation2 instan%e state, an to o so ;ui%kly an %heaply. #in%e a%tivities %oul get kille o$$ at any time, a%tivities may nee to save their state more $re;uently than one might e:pe%t. 4hen, =hen the a%tivity restarts, the a%tivity shoul

*17
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Dandling (ctivity ifecycle Events

get its $ormer state ba%k, so it %an restore the a%tivity to the =ay it appeare previously. #aving instan%e state is han le by onSave.nstanceState:;. 4his supplies a 6undle, into =hi%h a%tivities %an pour =hatever ata they nee &e.g., the number sho=ing on the %al%ulator6s isplay'. 4his metho implementation nee s to be spee y, so o not try to o too mu%h $an%y O Nust put your ata in the 6undle an e:it the metho . 4hat instan%e state is provi e to you again in t=o pla%es* ,. -n on)reate:;

2. -n onRestore.nstanceState:; -t is your %hoi%e =hen you =ish to re2apply the state ata to your a%tivity O either %allba%k is a reasonable option.

*19
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

PART III Data Stores, Network Services, and APIs

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 1*

>sing Preferences

An roi has many i$$erent =ays $or you to store ata $or long2term use by your a%tivity. 4he simplest to use is the pre$eren%es system. An roi allo=s a%tivities an appli%ations to keep pre$eren%es, in the $orm o$ keyUvalue pairs &akin to a Map', that =ill hang aroun bet=een invo%ations o$ an a%tivity. As the name suggests, the primary purpose is $or you to store user2spe%i$ie %on$iguration etails, su%h as the last $ee the user looke at in your $ee rea er, or =hat sort or er to use by e$ault on a list, or =hatever. >$ %ourse, you %an store in the pre$eren%es =hatever you like, so long as it is keye by a String an has a primitive value &boolean, String, et%.' !re$eren%es %an either be $or a single a%tivity or share among all a%tivities in an appli%ation. Iventually, pre$eren%es might be shareable a%ross appli%ations, but that is not supporte as o$ the time o$ this =riting.

'etting What .ou Want


4o get a%%ess to the pre$eren%es, you have three A!-s to %hoose $rom* ,. $rom =ithin your Activity, to a%%ess a%tivity2 spe%i$i% pre$eren%es
get1references:;

2. getS&ared1references:; $rom =ithin your Activity &or other appli%ation )ontext', to a%%ess appli%ation2level pre$eren%es

*4Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

?. getDefaultS&ared1references:;, on 1referencesManager, to get the share pre$eren%es that =ork in %on%ert =ith An roi 6s overall pre$eren%e $rame=ork 4he $irst t=o take a se%urity mo e parameter O $or no=, pass in @. 4he getS&ared1references:; metho also takes a name o$ a set o$ pre$eren%es O get1references:; e$$e%tively %alls getS&ared1references:; =ith the a%tivity6s %lass name as the pre$eren%e set name. 4he getDefaultS&ared1references:;! metho takes the )ontext $or the pre$eren%es &e.g., your Activity'. All o$ those metho s return an instan%e o$ S&ared1references, =hi%h o$$ers a series o$ getters to a%%ess name pre$eren%es, returning a suitably2type result &e.g., get6oolean:; to return a boolean pre$eren%e'. 4he getters also take a e$ault value, =hi%h is returne i$ there is no pre$eren%e set un er the spe%i$ie key.

Stating .our Preference


7iven the appropriate S&ared1references obNe%t, you %an use edit:; to get an Qe itorQ $or the pre$eren%es. 4his obNe%t has a set o$ setters that mirror the getters on the parent S&ared1references obNe%t. -t also has*
remove:; to get ri clear:; to get ri

o$ a single name pre$eren%e o$ all pre$eren%es e via the e itor

commit:; to persist your %hanges ma

4he last one is important O i$ you mo i$y pre$eren%es via the e itor an $ail to commit:; the %hanges, those %hanges =ill evaporate on%e the e itor goes out o$ s%ope. Conversely, sin%e the pre$eren%es obNe%t supports live %hanges, i$ one part o$ your appli%ation &say, an a%tivity' mo i$ies share pre$eren%es, another part o$ your appli%ation &say, a servi%e' =ill have a%%ess to the %hange value imme iately.

*4$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

(nd 5o)6 a Word !rom ,ur !rame)ork


.eginning =ith the 0.0 #AE, An roi has intro u%e a $rame=ork $or managing pre$eren%es. -roni%ally, this $rame=ork oes not %hange anything sho=n above. -nstea , the $rame=ork is more $or presenting a %onsistent set o$ pre$eren%e2setting options $or users, so i$$erent appli%ations o not have to Qreinvent the =heelQ. 4he lin%hpin to the pre$eren%es $rame=ork is yet another DML ata stru%ture. @ou %an es%ribe your appli%ation6s pre$eren%es in an DML $ile store in your proNe%t6s res/xml/ ire%tory. 7iven that, An roi %an present a pleasant user "- $or manipulating those pre$eren%es, =hi%h are then store in the S&ared1references you get ba%k $rom getDefaultS&ared1references:;. .elo=, you =ill $in the pre$eren%e DML $or the #imple pre$eren%es sample proNe%t*
"1referenceScreen !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android%' !!")&ec 6ox1reference !!!!android# ey$%9string/c&ec box% !!!!android#title$%)&ec box!1reference% !!!!android#summary$%)&ec !it!onG!c&ec !it!off%!/' !!"Ringtone1reference !!!!android# ey$%9string/ringtone% !!!!android#title$%Ringtone!1reference% !!!!android#s&owDefault$%true% !!!!android#s&owSilent$%true% !!!!android#summary$%1ing!a!toneG!any!toneG!even!silence%!/' "/1referenceScreen'

4he root o$ the pre$eren%e DML is a 1referenceScreen element. We =ill e:plain =hy it is name that later in this %hapterP $or no=, take it on $aith that it is a sensible name. >ne o$ the things you %an have insi e a 1referenceScreen element, not surprisingly, are pre$eren%e e$initions. 4hese are sub%lasses o$ 1reference, su%h as )&ec 6ox1reference or Ringtone1reference, as sho=n above. As one might e:pe%t, these allo= you to %he%k a %he%kbo: or %hoose a ringtone, respe%tively. -n the %ase o$ Ringtone1reference, you have your option o$

*40
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

allo=ing users to %hoose the system e$ault ringtone, or to %hoose Qsilen%eQ as a ringtone.

etting >sers Dave Their Say


7iven that you have set up the pre$eren%e DML, you %an use a nearly2built2in a%tivity $or allo=ing your users to set their pre$eren%es. 4he a%tivity is Qnearly2built2inQ be%ause you nee to sub%lass it to point it to your pre$eren%e DML, plus hook it into the rest o$ your appli%ation. #o, $or e:ample, here is the *dit1references a%tivity o$ the #imple proNe%t*
pac age!com.commonsware.android.prefs5 import!android.app.Activity5 import!android.os.6undle5 import!android.preference.1referenceActivity5 public!class!*dit1references!extends!1referenceActivity!8 !!9,verride !!public!void!onCreate:6undle!saved.nstanceState;!8 !!!!super.onCreate:saved.nstanceState;5 !!!! !!!!add(references"rom$esource:R.xml.preferences;5 !!< <

As you %an see, there is not mu%h to see. All you nee to o is %all add1referencesEromResource:; an spe%i$y the DML resour%e %ontaining your pre$eren%es. @ou =ill also nee to a this as an a%tivity to your AndroidManifest.xml $ile*

">xml!version$%?.@%!encoding$%utf-A%>' "manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!pac age$%com.commonsware.android.prefs%' !!!!"application!android#label$%9string/app_name%' !!!!!!!!"activity !!!!!!!!!!!!android#name$%.Simple1refsDemo% !!!!!!!!!!!!android#label$%9string/app_name%' !!!!!!!!!!!!"intent-filter' !!!!!!!!!!!!!!!!"action!android#name$%android.intent.action.MA./%!/' !!!!!!!!!!!!!!!!"category!android#name$%android.intent.category.+A2/)3*R%!/' *41
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

!!!!!!!!!!!!"/intent-filter' !!!!!!!!"/activity' !!!!!!!!"activity !!!!!!!!!!!!android#name$%.*dit1references% !!!!!!!!!!!!android#label$%9string/app_name%' !!!!!!!!"/activity' !!!!"/application' "/manifest'

An you =ill nee to arrange to invoke the a%tivity, su%h as $rom a menu option, here pulle $rom Simple1refsDemo*
9,verride public!boolean!onCreateOptions'enu:Menu!menu;!8 !!menu.add:Menu./,/*G!*D.-_.DG!Menu./,/*G!%*dit!1refs%; !!!!!!.setIcon:R.drawable.misc; !!!!!!.set#lpha!eticShortcut:[e[;5 !!menu.add:Menu./,/*G!)+,S*_.DG!Menu./,/*G!%)lose%; !!!!!!.setIcon:R.drawable.eject; !!!!!!.set#lpha!eticShortcut:[c[;5 !!return:super.onCreateOptions'enu:menu;;5 < 9,verride public!boolean!onOptionsItemSelected:Menu.tem!item;!8 !!switc&!:item.getItemId:;;!8 !!!!case!*D.-_.D# !!!!!!start#cti ity:new!Intent:t&isG!*dit1references.class;;5 !!!!!!return:true;5 !!!!case!)+,S*_.D# !!!!!!finish:;5 !!!!!!return:true;5 !!< !!return:super.onOptionsItemSelected:item;;5 <

)o=ever, that is all that is nee e , an it really is not that mu%h %o e outsi e o$ the pre$eren%es DML. When you get $or your e$$ort is an An roi 2 supplie pre$eren%e "-*

*44
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

!igure $9< The Simple pro2ectAs preferences >8

4he %he%kbo: %an be ire%tly %he%ke or un%he%ke . 4o %hange the ringtone pre$eren%e, Nust %li%k on the entry in the pre$eren%e list to bring up a sele%tion ialog*

*47
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

!igure 0;< Choosing a ringtone preference

/ote that there is no e:pli%it QsaveQ or Q%ommitQ button or menu O %hanges are persiste as soon as they are ma e. 4he Simple1refsDemo a%tivity, beyon having the a$orementione menu, also isplays the %urrent pre$eren%es via a -able+ayout*
">xml!version$%?.@%!encoding$%utf-A%>' "-able+ayout !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% ' !!"-ableRow' !!!!"-ext7iew !!!!!!!!android#text$%)&ec box#% !!!!!!!!android#paddingRig&t$%Lpx% !!!!/' !!!!"-ext7iew!android#id$%9Bid/c&ec box% !!!!/' !!"/-ableRow' !!"-ableRow' !!!!"-ext7iew !!!!!!!!android#text$%Ringtone#% !!!!!!!!android#paddingRig&t$%Lpx% !!!!/' !!!!"-ext7iew!android#id$%9Bid/ringtone%

*49
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

!!!!/' !!"/-ableRow' "/-able+ayout'

4he $iel s $or the table are $oun in on)reate:;*


9,verride public!void!onCreate:6undle!saved.nstanceState;!8 !!super.onCreate:saved.nstanceState;5 !!setContentView:R.layout.main;5 !!c&ec box$:-ext7iew;findViewById:R.id.c&ec box;5 !!ringtone$:-ext7iew;findViewById:R.id.ringtone;5 <

4he $iel s are up ate on ea%h onResume:;*


9,verride public!void!on$esume:;!8 !!super.on$esume:;5 !!S&ared1references!prefs$1referenceManager !!!!!!!!!!!!!!!!!!!!!!!!!!!.getDefaultShared(references:t&is;5 !!c&ec box.setText:new!Boolean:prefs !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.getBoolean:%c&ec box%G!false;; !!!!!!!!!!!!!!!!!!!!!.toString:;;5 !!ringtone.setText:prefs.getString:%ringtone%G!%"unset'%;;5 <

4his means the $iel s =ill be up ate =hen the a%tivity is opene an a$ter the pre$eren%es a%tivity is le$t &e.g., via the ba%k button'*

*7;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

!igure 0*< The Simple pro2ectAs list of saved preferences

(dding a Wee Bit ,A Structure


-$ you have a lot o$ pre$eren%es $or users to set, having them all in one big list may be%ome troublesome. An roi 6s pre$eren%e $rame=ork gives you a $e= =ays to impose a bit o$ stru%ture on your bag o$ pre$eren%es, in%lu ing %ategories an s%reens. Categories are a e via a 1reference)ategory element in your pre$eren%e DML an are use to group together relate pre$eren%es. Rather than have your pre$eren%es all as %hil ren o$ the root 1referenceScreen, you %an put a $e= 1reference)ategory elements in the 1referenceScreen, an then put your pre$eren%es in their appropriate %ategories. +isually, this a s a ivi er =ith the %ategory title bet=een groups o$ pre$eren%es. -$ you have lots an lots o$ pre$eren%es O more than is %onvenient $or users to s%roll through O you %an also put them on separate Qs%reensQ by intro u%ing the 1referenceScreen element. @es, that 1referenceScreen element.
*7*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

Any %hil ren o$ 1referenceScreen go on their o=n s%reen. -$ you nest 1referenceScreens, the parent s%reen isplays the s%reen as a pla%ehol er entry O tapping that entry brings up the %hil s%reen. (or e:ample, $rom the #tru%ture sample proNe%t, here is a pre$eren%e DML $ile that %ontains both 1reference)ategory an neste 1referenceScreen! elements*
"1referenceScreen !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android%' !!"1reference)ategory!android#title$%Simple!1references%' !!!!")&ec 6ox1reference !!!!!!android# ey$%9string/c&ec box% !!!!!!android#title$%)&ec box!1reference% !!!!!!android#summary$%)&ec !it!onG!c&ec !it!off% !!!!/' !!!!"Ringtone1reference !!!!!!android# ey$%9string/ringtone% !!!!!!android#title$%Ringtone!1reference% !!!!!!android#s&owDefault$%true% !!!!!!android#s&owSilent$%true% !!!!!!android#summary$%1ing!a!toneG!any!toneG!even!silence% !!!!/' !!"/1reference)ategory' !!"1reference)ategory!android#title$%Detail!Screens%' !!!!"1referenceScreen !!!!!!android# ey$%detail% !!!!!!android#title$%Detail!Screen% !!!!!!android#summary$%Additional!preferences!&eld!in!anot&er!page%' !!!!!!")&ec 6ox1reference !!!!!!!!android# ey$%9string/c&ec boxH% !!!!!!!!android#title$%Anot&er!)&ec box% !!!!!!!!android#summary$%,n.!,ff.!.t!really!doesn[t!matter.% !!!!!!/' !!!!"/1referenceScreen' !!"/1reference)ategory' "/1referenceScreen'

4he result, =hen you use this pre$eren%e DML =ith your 1referenceActivity! implementation, is a %ategoriMe list o$ elements*

*7%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

!igure 0%< The Structured pro2ectAs preference >86 sho)ing categories and a screen placeholder

An , i$ you tap on the Aetail #%reen entry, you are taken to the %hil pre$eren%e s%reen*

!igure 0-< The child preference screen of the Structured pro2ectAs preference >8 *7Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

The @ind ,f Pop">ps .ou ike


>$ %ourse, not all pre$eren%es are %he%kbo:es an ringtones. (or others, like entry $iel s an lists, An roi uses pop2up ialogs. "sers o not enter their pre$eren%e ire%tly in the pre$eren%e "- a%tivity, but rather tap on a pre$eren%e, $ill in a value, an %li%k >E to %ommit the %hange. #tru%turally, in the pre$eren%e DML, $iel s an lists are not signi$i%antly i$$erent $rom other pre$eren%e types, as seen in this pre$eren%e DML $rom the Aialogs sample proNe%t*
"1referenceScreen !!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android%' !!"1reference)ategory!android#title$%Simple!1references%' !!!!")&ec 6ox1reference !!!!!!android# ey$%9string/c&ec box% !!!!!!android#title$%)&ec box!1reference% !!!!!!android#summary$%)&ec !it!onG!c&ec !it!off% !!!!/' !!!!"Ringtone1reference !!!!!!android# ey$%9string/ringtone% !!!!!!android#title$%Ringtone!1reference% !!!!!!android#s&owDefault$%true% !!!!!!android#s&owSilent$%true% !!!!!!android#summary$%1ing!a!toneG!any!toneG!even!silence% !!!!/' !!"/1reference)ategory' !!"1reference)ategory!android#title$%Detail!Screens%' !!!!"1referenceScreen !!!!!!android# ey$%detail% !!!!!!android#title$%Detail!Screen% !!!!!!android#summary$%Additional!preferences!&eld!in!anot&er!page%' !!!!!!")&ec 6ox1reference !!!!!!!!android# ey$%9string/c&ec boxH% !!!!!!!!android#title$%Anot&er!)&ec box% !!!!!!!!android#summary$%,n.!,ff.!.t!really!doesn[t!matter.% !!!!!!/' !!!!"/1referenceScreen' !!"/1reference)ategory' !!"1reference)ategory!android#title$%Simple!1references%' !!!!"*dit-ext1reference !!!!!!android# ey$%9string/text% !!!!!!android#title$%-ext!*ntry!Dialog% !!!!!!android#summary$%)lic !to!pop!up!a!field!for!entry% !!!!!!android#dialog-itle$%*nter!somet&ing!useful% !!!!/' !!!!"+ist1reference

*7$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

!!!!!!android# ey$%9string/list% !!!!!!android#title$%Selection!Dialog% !!!!!!android#summary$%)lic !to!pop!up!a!list!to!c&oose!from% !!!!!!android#entries$%9array/cities% !!!!!!android#entry7alues$%9array/airport_codes% !!!!!!android#dialog-itle$%)&oose!a!1ennsylvania!city%!/' !!"/1reference)ategory' "/1referenceScreen'

With the $iel &*dit-ext1reference', in a ition to the title an summary you put on the pre$eren%e itsel$, you %an also supply the title to use $or the ialog. With the list &+ist1reference', you supply both a ialog title an t=o string2 array resour%es* one $or the isplay names, one $or the values. 4hese nee to be in the same or er O the in e: o$ the %hosen isplay name etermines =hi%h value is store as the pre$eren%e in the S&ared1references. (or e:ample, here are the arrays $or use by the +ist1reference sho=n above*
">xml!version$%?.@%!encoding$%utf-A%>' "resources' !!"string-array!name$%cities%' !!!!"item'1&iladelp&ia"/item' !!!!"item'1ittsburg&"/item' !!!!"item'Allentown/6et&le&em"/item' !!!!"item'*rie"/item' !!!!"item'Reading"/item' !!!!"item'Scranton"/item' !!!!"item'+ancaster"/item' !!!!"item'Altoona"/item' !!!!"item'3arrisburg"/item' !!"/string-array' !!"string-array!name$%airport_codes%' !!!!"item'13+"/item' !!!!"item'1.-"/item' !!!!"item'A6*"/item' !!!!"item'*R."/item' !!!!"item'RD0"/item' !!!!"item'A71"/item' !!!!"item'+/S"/item' !!!!"item'A,,"/item' !!!!"item'MD-"/item' !!"/string-array' "/resources'

When you bring up the pre$eren%e "-, you start =ith another %ategory =ith another pair o$ pre$eren%e entries*
*70
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

!igure 0$< The preference screen of the /ialogs pro2ectAs preference >8

4apping the 4e:t Intry Aialog one brings up...a te:t entry ialog O in this %ase, =ith the prior pre$eren%e entry pre2$ille 2in*

!igure 00< Editing a text preference

*71
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing Preferences

4apping the #ele%tion Aialog one brings up...a sele%tion ialog, sho=ing the isplay names $rom the one array*

!igure 01< Editing a list preference

*74
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 1-

(ccessing !iles

While An roi o$$ers stru%ture storage, via pre$eren%es an atabases, sometimes a simple $ile =ill su$$i%e. An roi o$$ers t=o mo els $or a%%essing $iles* one $or $iles pre2pa%kage =ith your appli%ation, an one $or $iles %reate on2 evi%e by your appli%ation.

.ou (nd The Dorse .ou 3ode 8n ,n


Let6s suppose you have some stati% ata you =ant to ship =ith the appli%ation, su%h as a list o$ =or s $or a spell2%he%ker. 4he easiest =ay to eploy that is to put the $ile in the res/raw ire%tory, so it gets put in the An roi appli%ation .ap $ile as part o$ the pa%kaging pro%ess. 4o a%%ess this $ile, you nee to get yoursel$ a Resources obNe%t. (rom an a%tivity, that is as simple as %alling getResources:;. A Resources obNe%t o$$ers openRawResource:; to get an .nputStream on the $ile you spe%i$y. Rather than a path, openRawResource:; e:pe%ts an integer i enti$ier $or the $ile as pa%kage . 4his =orks Nust like a%%essing =i gets via find7iew6y.d:; O i$ you put a $ile name words.xml in res/raw, the i enti$ier is a%%essible in Gava as R.raw.words. #in%e you %an only get an .nputStream, you have no means o$ mo i$ying this $ile. )en%e, it is really only use$ul $or stati% re$eren%e ata. Moreover, sin%e it is un%hanging until the user installs an up ate version o$ your appli%ation pa%kage, either the re$eren%e ata has to be vali $or the $oreseeable $uture,
*79
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing !iles

or you =ill nee to provi e some means o$ up ating the ata. 4he simplest =ay to han le that is to use the re$eren%e ata to bootstrap some other mo i$iable $orm o$ storage &e.g., a atabase', but this makes $or t=o %opies o$ the ata in storage. An alternative is to keep the re$eren%e ata as2is but keep mo i$i%ations in a $ile or atabase, an merge them together =hen you nee a %omplete pi%ture o$ the in$ormation. (or e:ample, i$ your appli%ation ships a $ile o$ "RLs, you %oul have a se%on $ile that tra%ks "RLs a e by the user or re$eren%e "RLs that =ere elete by the user. -n the Static sample proNe%t, you =ill $in a re=orking o$ the listbo: e:ample $rom earlier, this time using a stati% DML $ile instea o$ a har =ire array in Gava. 4he layout is the same*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent%! !!android#layout_&eig&t$%fill_parent%!' !!"-ext7iew !!!!android#id$%9Bid/selection% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!/' !!"+ist7iew !!!!android#id$%9android#id/list% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent% !!!!android#drawSelector,n-op$%false% !!/' "/+inear+ayout'

-n a ition to that DML $ile, you also nee an DML $ile =ith the =or s to sho= in the list*
"words' !!"word!value$%lorem%!/' !!"word!value$%ipsum%!/' !!"word!value$%dolor%!/' !!"word!value$%sit%!/' !!"word!value$%amet%!/' !!"word!value$%consectetuer%!/' !!"word!value$%adipiscing%!/' !!"word!value$%elit%!/' !!"word!value$%morbi%!/' !!"word!value$%vel%!/' !!"word!value$%ligula%!/'

*9;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing !iles

!!"word!value$%vitae%!/' !!"word!value$%arcu%!/' !!"word!value$%aliJuet%!/' !!"word!value$%mollis%!/' !!"word!value$%etiam%!/' !!"word!value$%vel%!/' !!"word!value$%erat%!/' !!"word!value$%placerat%!/' !!"word!value$%ante%!/' !!"word!value$%porttitor%!/' !!"word!value$%sodales%!/' !!"word!value$%pellentesJue%!/' !!"word!value$%augue%!/' !!"word!value$%purus%!/' "/words'

While this DML stru%ture is not e:a%tly a mo el o$ spa%e e$$i%ien%y, it =ill su$$i%e $or a emo. 4he Gava %o e no= must rea in that DML $ile, parse out the =or s, an put them somepla%e $or the list to pi%k up*
public!class!StaticEileDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!Array+ist!items$new!#rrayList:;5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!!! !!!!try!8 !!!!!!.nputStream!in$get$esources:;.open$aw$esource:R.raw.words;5 !!!!!!Document6uilder!builder$Document6uilderEactory !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.newInstance:; !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.newDocumentBuilder:;5 !!!!!!Document!doc$builder.parse:inG!null;5 !!!!!!/ode+ist!words$doc.get*lementsByTag%ame:%word%;5 !!!!!! !!!!!!for!:int!i$@5i"words.getLength:;5iBB;!8 !!!!!!!!items.add:::*lement;words.item:i;;.get#ttri!ute:%value%;;5 !!!!!!< !!!!!! !!!!!!in.close:;5 !!!!< !!!!catc&!:-&rowable!t;!8 !!!!!!-oast !!!!!!!!.makeText:t&isG!%*xception#!%Bt.toString:;G!H@@@; !!!!!!!!.show:;5 !!!!< *9*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing !iles

!!!! !!!!setList#dapter:new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!items;;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG!int!positionG !!!!!!!!!!!!!!!!!!long!id;!8 !!!!selection.setText:items.get:position;.toString:;;5 !!< <

4he i$$eren%es mostly lie =ithin on)reate:;. We get an .nputStream $or the DML $ile &getResources:;.openRawResource:R.raw.words;', then use the built2 in DML parsing logi% to parse the $ile into a A>M Document, pi%k out the =or elements, then pour the value attributes into an Array+ist $or use by the ArrayAdapter. 4he resulting a%tivity looks the same as be$ore, sin%e the list o$ =or s is the same, Nust relo%ate *

!igure 04< The Static!ile/emo sample application

>$ %ourse, there are even easier =ays to have DML $iles available to you as pre2pa%kage $iles O using an DML resour%e. 4hat is %overe in the ne:t
*9%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing !iles

%hapter. )o=ever, =hile this e:ample use DML, the $ile %oul Nust as easily have been a simple one2=or 2per2line list, or in some other $ormat not han le natively by the An roi resour%e system.

3eadinA An WritinA
Rea ing an =riting your o=n, appli%ation2spe%i$i% ata $iles is nearly i enti%al to =hat you might o in a esktop Gava appli%ation. 4he key is to use openEile.nput:; an openEile,utput:; on your Activity or other )ontext! to get an .nputStream an ,utputStream, respe%tively. (rom that point $or=ar , it is not mu%h i$$erent than regular Gava -U> logi%*

Wrap those streams as nee e , su%h as using an .nputStreamReader or ,utputStreamCriter $or te:t2base -U> Rea or =rite the ata "se close:; to release the stream =hen one

Relative paths &i.e., those =ithout lea ing slashes' are lo%al to the appli%ation. -$ t=o appli%ations both try rea ing a notes.txt $ile via openEile.nput:;, they =ill ea%h a%%ess their o=n e ition o$ the $ile. -$ you nee to have one $ile a%%essible $rom many pla%es, you probably =ant to %reate a %ontent provi er, as =ill be es%ribe an up%oming %hapter. .elo= you =ill see the layout $or the =orl 6s most trivial te:t e itor, pulle $rom the ReadCrite sample appli%ation*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent%! !!android#layout_&eig&t$%fill_parent% !!android#orientation$%vertical%' !!"6utton!android#id$%9Bid/close% !!!!android#layout_widt&$%wrap_content%! !!!!android#layout_&eig&t$%wrap_content% !!!!android#text$%)lose%!/' !!"*dit-ext !!!!android#id$%9Bid/editor% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent% !!!!android#single+ine$%false%

*9Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing !iles

!!!!/' "/+inear+ayout'

All =e have here is a large te:t2e iting =i get, =ith a QCloseQ button above it. 4he Gava is only slightly more %ompli%ate *
pac age!com.commonsware.android.files5 import!android.app.Activity5 import!android.os.6undle5 import!android.view.7iew5 import!android.widget.6utton5 import!android.widget.*dit-ext5 import!android.widget.-oast5 import!java.io.6ufferedReader5 import!java.io..nputStream5 import!java.io..nputStreamReader5 import!java.io..nputStream5 import!java.io.,utputStream5 import!java.io.,utputStreamCriter5 public!class!ReadCriteEileDemo!extends!Activity!8 !!*dit-ext!editor5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!editor$:*dit-ext;findViewById:R.id.editor;5 !!!! !!!!6utton!btn$:6utton;findViewById:R.id.close;5 !!!! !!!!btn.setOnClickListener:new!6utton.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!v;!8 !!!!!!!!finish:;5 !!!!!!< !!!!<;5 !!< !! !!public!void!on$esume:;!8 !!!!super.on$esume:;5 !!!! !!!!try!8 !!!!!!.nputStream!in$open"ileInput:%notes.txt%;5 !!!!!! !!!!!!if!:inX$null;!8 !!!!!!!!6ufferedReader!reader$new!Buffered$eader:new!InputStream$eader:in;;5 !!!!!!!!String!str5 !!!!!!!!String6uffer!buf$new!StringBuffer:;5 !!!!!!!!

*9$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing !iles

!!!!!!!!w&ile!::str!$!reader.readLine:;;!X$!null;!8 !!!!!!!!!!buf.append:strB%4n%;5 !!!!!!!!< !!!!!!!! !!!!!!!!in.close:;5 !!!!!!!!editor.setText:buf.toString:;;5 !!!!!!< !!!!< !!!!catc&!:java.io.Eile/otEound*xception!e;!8 !!!!!!//!t&at[s!,MG!we!probably!&aven[t!created!it!yet !!!!< !!!!catc&!:-&rowable!t;!8 !!!!!!-oast !!!!!!!!.makeText:t&isG!%*xception#!%Bt.toString:;G!H@@@; !!!!!!!!.show:;5 !!!!< !!< !! !!public!void!on(ause:;!8 !!!!super.on(ause:;5 !!!! !!!!try!8 !!!!!!,utputStreamCriter!out$ !!!!!!!!!!new!OutputStream&riter:open"ileOutput:%notes.txt%G!@;;5 !!!!!! !!!!!!out.write:editor.getText:;.toString:;;5 !!!!!!out.close:;5!!!! !!!!< !!!!catc&!:-&rowable!t;!8

(irst, =e =ire up the button to %lose out our a%tivity =hen %li%ke by using set,n)lic +istener:; to invoke finis&:; on the a%tivity. /e:t, =e hook into onResume:;, so =e get %ontrol =hen our e itor is %oming ba%k to li$e, $rom a $resh laun%h or a$ter having been $roMen. We use openEile.nput:; to rea in notes.txt an pour the %ontents into the te:t e itor. -$ the $ile is not $oun , =e assume this is the $irst time the a%tivity =as run &or the $ile =as elete by other means', an =e Nust leave the e itor empty. (inally, =e hook into on1ause:;, so =e get %ontrol as our a%tivity gets hi en by other user a%tivity or is %lose , su%h as via our QCloseQ button. )ere, =e use openEile,utput:; to open notes.txt, into =hi%h =e pour the %ontents o$ the te:t e itor.

*90
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing !iles

4he net result is that =e have a persistent notepa * =hatever is type in =ill remain until elete , surviving our a%tivity being %lose , the phone being turne o$$, or similar situations. >$ %ourse, it oesn6t look like mu%h*

!igure 07< The 3eadWrite!ile/emo sample application6 as initially launched

!igure 09< The same application6 after entering some text *91
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 1/

Working )ith 3esources

Resour%es are stati% bits o$ in$ormation hel outsi e the Gava sour%e %o e. @ou have seen one type o$ resour%e O the layout O $re;uently in the e:amples in this book. 4here are many other types o$ resour%e, su%h as images an strings, that you %an take a vantage o$ in your An roi appli%ations.

The 3esource ineup


Resour%es are store as $iles un er the res/ ire%tory in your An roi proNe%t layout. With the e:%eption o$ ra= resour%es &res/raw/', all the other types o$ resour%es are parse $or you, either by the An roi pa%kaging system or by the An roi system on the evi%e or emulator. #o, $or e:ample, =hen you lay out an a%tivity6s "- via a layout resour%e &res/layout/', you o not have to parse the layout DML yoursel$ O An roi han les that $or you. -n a ition to layout resour%es &$irst seen in an earlier %hapter' an ra= resour%es &intro u%e in another earlier %hapter', there are several other types o$ resour%e available to you, in%lu ing*

Animations &res/anim/', esigne $or short %lips as part o$ a user inter$a%e, su%h as an animation suggesting the turning o$ a page =hen a button is %li%ke -mages &res/drawable', $or putting stati% i%ons or other pi%tures in a user inter$a%e

*94
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

#trings, %olors, arrays, an imensions &res/values/', to both give these sorts o$ %onstants symboli% names an to keep them separate $rom the rest o$ the %o e &e.g., $or internationaliMation an lo%aliMation' DML &res/xml/', $or stati% DML $iles %ontaining your o=n ata an stru%ture

String Theory
Eeeping your labels an other bits o$ te:t outsi e the main sour%e %o e o$ your appli%ation is generally %onsi ere to be a very goo i ea. -n parti%ular, it helps =ith internationaliMation &-,8/' an lo%aliMation &L,0/', %overe later in this %hapter. Iven i$ you are not going to translate your strings to other languages, it is easier to make %orre%tions i$ all the strings are in one spot instea o$ s%attere throughout your sour%e %o e. An roi supports regular e:ternaliMe strings, along =ith Qstring $ormatsQ, =here the string has pla%ehol ers $or ynami%ally2inserte in$ormation. >n top o$ that, An roi supports simple te:t $ormatting, %alle Qstyle te:tQ, so you %an make your =or s be bol or itali% intermingle =ith normal te:t.

Pl in Strin!s
7enerally speaking, all you nee to o is have an DML $ile in the res/values! ire%tory &typi%ally name res/values/strings.xml', =ith a resources root element, an one %hil string element $or ea%h string you =ish to en%o e as a resour%e. 4he string element takes a name attribute, =hi%h is the uni;ue name $or this string, an a single te:t element %ontaining the te:t o$ the string*
"resources' !!"string!name$%Juic %'-&e!Juic !brown!fox..."/string' !!"string!name$%laug&s%'3e!w&o!laug&s!last..."/string' "/resources'

4he only tri%ky part is i$ the string value %ontains a ;uote &%' or an apostrophe &['. -n those %ases, you =ill =ant to es%ape those values, by
*97
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

pre%e ing them =ith a ba%kslash &e.g., -&ese!are!t&e!times!t&at!try!men4[s! souls'. >r, i$ it is Nust an apostrophe, you %oul en%lose the value in ;uotes &e.g., %-&ese!are!t&e!times!t&at!try!men[s!souls.%'. @ou %an then re$eren%e this string $rom a layout $ile &as 9string/..., =here the ellipsis is the uni;ue name O e.g., 9string/laug&s'. >r you %an get the string $rom your Gava %o e by %alling getString:; =ith the resour%e -A o$ the string resour%e, that being the uni;ue name pre$i:e =ith R.string. &e.g., getString:R.string.Juic ;'.

Strin! :orm ts
As =ith other implementations o$ the Gava language, An roi 6s Aalvik +M supports string $ormats. )ere, the string %ontains pla%ehol ers representing ata to be repla%e at runtime by variable in$ormation &e.g., My ! name ! is! \?]s'. !lain strings store as resour%es %an be use as string $ormats*
String!strEormat$getString:R.string.my_name;5 String!strResult$String.format:strEormatG!%-im%;5 ::-ext7iew;findViewById:R.layout.some_label;; !!.setText:strResult;5

Styled Te.t
-$ you =ant really ri%h te:t, you shoul have ra= resour%es %ontaining )4ML, then pour those into a WebEit =i get. )o=ever, $or light )4ML $ormatting, using "b', "i', an "u', you %an Nust use a string resour%e*
"resources' !!"string!name$%b%'-&is!&as!"b'bold"/b'!in!it."/string' !!"string!name$%i%'C&ereas!t&is!&as!"i'italics"/i'X"/string' "/resources'

@ou %an a%%ess these the same as =ith plain strings, =ith the e:%eption that the result o$ the getString:; %all is really a Spanned*
::-ext7iew;findViewById:R.layout.anot&er_label;; !!!!!!!!!!!!.setText:getString:R.string.laug&s;;5

*99
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

Styled :orm ts
Where style te:t gets tri%ky is =ith style string $ormats, as String.format:;! =orks on String obNe%ts, not Spanned obNe%ts =ith $ormatting instru%tions. -$ you really =ant to have style string $ormats, here is the =orkaroun * ,. Intity2es%ape the angle bra%kets in the string resour%e &e.g., t&is!is! Zlt5bZgt5\?]sZlt5/bZgt5'

2. Retrieve the string resour%e as normal, though it =ill not be style at this point &e.g., getString:R.string.fun y_format;' ?. 7enerate the $ormat results, being sure to es%ape any string values you substitute in, in %ase they %ontain angle bra%kets or ampersan s
String.format:getString:R.string.fun y_format;G !!!!!!!!!!!!!!-ext2tils.html*ncode:str/ame;;5

<. Convert the entity2es%ape


3tml.from3tml:;

)4ML into a Spanned obNe%t via

some-ext7iew.setText:3tml !!!!!!!!!!!!!!!!!!!!!.from,tml:resultEromStringEormat;;5

4o see this in a%tion, let6s look at the Strings emo. )ere is the layout $ile*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!android#orientation$%&ori(ontal% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!' !!!!"6utton!android#id$%9Bid/format% !!!!!!android#layout_widt&$%wrap_content%! !!!!!!android#layout_&eig&t$%wrap_content% !!!!!!android#text$%9string/btn_name% !!!!!!/' !!!!"*dit-ext!android#id$%9Bid/name% !!!!!!android#layout_widt&$%fill_parent%! !!!!!!android#layout_&eig&t$%wrap_content%! !!!!!!/' !!"/+inear+ayout' !!"-ext7iew!android#id$%9Bid/result% %;;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

!!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!/' "/+inear+ayout'

As you %an see, it is Nust a button, a $iel , an a label. 4he intent is $or somebo y to enter their name in the $iel , then %li%k the button to %ause the label to be up ate =ith a $ormatte message %ontaining their name. 4he 6utton in the layout $ile re$eren%es a string resour%e &9string/btn_name', so =e nee a string resour%e $ile &res/values/strings.xml'*
">xml!version$%?.@%!encoding$%utf-A%>' "resources' !!"string!name$%app_name%'StringsDemo"/string' !!"string!name$%btn_name%'/ame#"/string' !!"string!name$%fun y_format%'My!name!is!Zlt5bZgt5\?]sZlt5/bZgt5"/string' "/resources'

4he app_name resour%e is automati%ally %reate by the activity)reator s%ript. 4he btn_name string is the %aption o$ the 6utton, =hile our style string $ormat is in fun y_format. (inally, to hook all this together, =e nee a pin%h o$ Gava*
pac age!com.commonsware.android.resources5 import!android.app.Activity5 import!android.os.6undle5 import!android.text.-ext2tils5 import!android.text.3tml5 import!android.view.7iew5 import!android.widget.6utton5 import!android.widget.*dit-ext5 import!android.widget.-ext7iew5 public!class!StringsDemo!extends!Activity!8 !!*dit-ext!name5 !!-ext7iew!result5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!! !!!!name$:*dit-ext;findViewById:R.id.name;5

%;*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

!!!!result$:-ext7iew;findViewById:R.id.result;5 !!!! !!!!6utton!btn$:6utton;findViewById:R.id.format;5 !!!! !!!!btn.setOnClickListener:new!6utton.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!v;!8 !!!!!!!!apply"ormat:;5 !!!!!!< !!!!<;5 !!< !! !!private!void!apply"ormat:;!8 !!!!String!format$getString:R.string.fun y_format;5 !!!!String!simpleResult$String.format:formatG !!!!!!!!!!!!!!!!!!!!!-ext2tils.html*ncode:name.getText:;.toString:;;;5 !!!!result.setText:3tml.from,tml:simpleResult;;5 !!< <

4he string resour%e manipulation %an be $oun in applyEormat:;, =hi%h is %alle =hen the button is %li%ke . (irst, =e get our $ormat via getString:; O something =e %oul have one at on)reate:; time $or e$$i%ien%y. /e:t, =e $ormat the value in the $iel using this $ormat, getting a String ba%k, sin%e the string resour%e is in entity2en%o e )4ML. /ote the use o$ -ext2tils.&tml*ncode:; to entity2en%o e the entere name, in %ase somebo y e%i es to use an ampersan or something. (inally, =e %onvert the simple )4ML into a style te:t obNe%t via 3tml.from3tml:; an up ate our label. When the a%tivity is $irst laun%he , =e have an empty label*

%;%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

!igure 1;< The Strings/emo sample application6 as initially launched

but i$ =e $ill in a name an %li%k the button, =e get*

!igure 1*< The same application6 after filling in some heroic figureAs name

%;Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

'ot the Picture:


An roi supports images in the !/7, G!I7, an 7-( $ormats. 7-( is o$$i%ially is%ourage , ho=everP !/7 is the overall pre$erre $ormat. -mages %an be use any=here that re;uires a Drawable, su%h as the image an ba%kgroun o$ an .mage7iew. "sing images is simply a matter o$ putting your image $iles in res/drawable/! an then re$eren%ing them as a resour%e. Within layout $iles, images are re$eren%e as 9drawable/... =here the ellipsis is the base name o$ the $ile &e.g., $or res/drawable/foo.png, the resour%e name is 9drawable/foo'. -n Gava, =here you nee an image resour%e -A, use R.drawable. plus the base name &e.g., R.drawable.foo'. -$ you nee a 2ri to an image resour%e, you %an use one o$ t=o i$$erent string $ormats $or the path* ,.
android.resource#//com.example.app/...,

=here com.example.app is the name o$ the Gava pa%kage use by your appli%ation in AndroidManifest.xml an ... is the numeri% resour%e -A $or the resour%e in ;uestion &e.g., the value o$ R.drawable.foo'

2. android.resource#//com.example.app/raw/..., =here com.example.app! is the name o$ the Gava pa%kage use by your appli%ation in AndroidManifest.xml an ... is the te:tual name o$ the ra= resour%e &e.g., foo $or res/drawable/foo.png' /ote that An roi ships =ith some image resour%es built in. 4hose are a resse in Gava =ith an android.R.drawable pre$i: to istinguish them $rom appli%ation2spe%i$i% resour%es &e.g., android.R.drawable.picture_frame'. #o, let6s up ate the previous e:ample to use an i%on $or the button instea o$ the string resour%e. 4his %an be $oun as .mages. (irst, =e slightly a Nust the layout $ile, using an .mage6utton an re$eren%ing a ra=able name 9drawable/icon*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android%

%;$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

!!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!android#orientation$%&ori(ontal% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!' !!!!".mage6utton!android#id$%9Bid/format% !!!!!!android#layout_widt&$%wrap_content%! !!!!!!android#layout_&eig&t$%wrap_content% !!!!!!android#src$%9drawable/icon% !!!!!!/' !!!!"*dit-ext!android#id$%9Bid/name% !!!!!!android#layout_widt&$%fill_parent%! !!!!!!android#layout_&eig&t$%wrap_content%! !!!!!!/' !!"/+inear+ayout' !!"-ext7iew!android#id$%9Bid/result% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!/' "/+inear+ayout'

/e:t, =e nee to put an image $ile in res/drawable =ith a base name o$ i%on. -n this %ase, =e use a ?2:?2 !/7 $ile $rom the /uvola i%on set. (inally, =e t=i le the Gava sour%e, repla%ing our 6utton =ith an .mage6utton*
pac age!com.commonsware.android.resources5 import!android.app.Activity5 import!android.os.6undle5 import!android.text.-ext2tils5 import!android.text.3tml5 import!android.view.7iew5 import!android.widget.6utton5 import!android.widget..mage6utton5 import!android.widget.*dit-ext5 import!android.widget.-ext7iew5 public!class!.magesDemo!extends!Activity!8 !!*dit-ext!name5 !!-ext7iew!result5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!! !!!!name$:*dit-ext;findViewById:R.id.name;5 !!!!result$:-ext7iew;findViewById:R.id.result;5

%;0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

!!!! !!!!.mage6utton!btn$:.mage6utton;findViewById:R.id.format;5 !!!! !!!!btn.setOnClickListener:new!6utton.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!v;!8 !!!!!!!!apply"ormat:;5 !!!!!!< !!!!<;5 !!< !! !!private!void!apply"ormat:;!8 !!!!String!format$getString:R.string.fun y_format;5 !!!!String!simpleResult$String.format:formatG !!!!!!!!!!!!!!!!!!!!-ext2tils.html*ncode:name.getText:;.toString:;;;5 !!!!result.setText:3tml.from,tml:simpleResult;;5 !!< <

/o=, our button has the esire i%on*

!igure 1%< The 8mages/emo sample application

%;1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

?+ H The 3esource Way


-n a previous %hapter, =e sho=e ho= you %an pa%kage DML $iles as ra= resour%es an get a%%ess to them $or parsing an usage. 4here is another =ay o$ pa%kaging stati% DML =ith your appli%ation* the DML resour%e. #imply put the DML $ile in res/xml/, an you %an a%%ess it by getUml:; on a Resources obNe%t, supplying it a resour%e -A o$ R.xml. plus the base name o$ your DML $ile. #o, in an a%tivity, =ith an DML $ile o$ words.xml, you %oul %all getResources:;.getUml:R.xml.words;. 4his returns an instan%e o$ the presently2un o%umente Uml1ull1arser, $oun in the org.xmlpull.v? Gava namespa%e. Ao%umentation $or this library %an be $oun at the parser6s site as o$ this =riting. An DML pull parser is event2 riven* you keep %alling next:; on the parser to get the ne:t event, =hi%h %oul be S-AR-_-A0, */D_-A0, */D_D,)2M*/-, et%. >n a S-AR-_-A0 event, you %an a%%ess the tag6s name an attributesP a single -*U-! event represents the %on%atenation o$ all te:t no es that are ire%t %hil ren o$ this element. .y looping, testing, an invoking per2element logi%, you parse the $ile. 4o see this in a%tion, let6s re=rite the Gava %o e $or the Static sample proNe%t to use an DML resour%e. 4his ne= proNe%t, UM+, re;uires that you pla%e the words.xml $ile $rom Static not in res/raw/, but in res/xml/. 4he layout stays the same, so all that nee s repla%ing is the Gava sour%e*
pac age!com.commonsware.android.resources5 import!android.app.Activity5 import!android.os.6undle5 import!android.app.+istActivity5 import!android.view.7iew5 import!android.widget.Adapter7iew5 import!android.widget.ArrayAdapter5 import!android.widget.+ist7iew5 import!android.widget.-ext7iew5 import!android.widget.-oast5 import!java.io..nputStream5 import!java.util.Array+ist5 import!org.xmlpull.v?.Uml1ull1arser5 %;4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

import!org.xmlpull.v?.Uml1ull1arser*xception5 public!class!UM+ResourceDemo!extends!+istActivity!8 !!-ext7iew!selection5 !!Array+ist!items$new!#rrayList:;5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!!! !!!!try!8 !!!!!!Uml1ull1arser!xpp$get$esources:;.get-ml:R.xml.words;5 !!!!!! !!!!!!w&ile!:xpp.get* entType:;X$Uml1ull1arser.*/D_D,)2M*/-;!8 !!!!!!!!if!:xpp.get* entType:;$$Uml1ull1arser.S-AR-_-A0;!8 !!!!!!!!!!if!:xpp.get%ame:;.e.uals:%word%;;!8 !!!!!!!!!!!!items.add:xpp.get#ttri!uteValue:@;;5 !!!!!!!!!!< !!!!!!!!< !!!!!!!! !!!!!!!!xpp.next:;5 !!!!!!< !!!!< !!!!catc&!:-&rowable!t;!8 !!!!!!-oast !!!!!!!!.makeText:t&isG!%ReJuest!failed#!%Bt.toString:;G!O@@@; !!!!!!!!.show:;5 !!!!< !!!! !!!!setList#dapter:new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G !!!!!!!!!!!!!!!!!!!!!!!!!!!items;;5 !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG!int!positionG !!!!!!!!!!!!!!!!!!long!id;!8 !!!!selection.setText:items.get:position;.toString:;;5 !!< <

/o=, insi e our try...catc& blo%k, =e get our Uml1ull1arser an loop until the en o$ the o%ument. -$ the %urrent event is S-AR-_-A0 an the name o$ the element is word &xpp.get/ame:;.eJuals:%word%;', then =e get the one2 an 2only attribute an pop that into our list o$ items $or the sele%tion =i get. #in%e =e6re in %omplete %ontrol over the DML $ile, it is sa$e enough to assume there is e:a%tly one attribute. .ut, i$ you =ere not as %om$ortable that the DML is properly e$ine , you might %onsi er %he%king the attribute %ount &getAttribute)ount:;' an the name o$ the attribute
%;7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

&getAttribute/ame:;' be$ore blin ly assuming the @2in e: attribute is =hat you think it is. 4he result looks the same as be$ore, albeit =ith a i$$erent name in the title bar*

!igure 1-< The ?+ 3esource/emo sample application

+iscellaneous Falues
-n the res/values/ ire%tory, you %an pla%e one &or more' DML $iles es%ribing simple resour%es* imensions, %olors, an arrays. We have alrea y seen uses o$ imensions an %olors in previous e:amples, =here they =ere passe as simple strings &e.g., %?@px%' as parameters to %alls. @ou %an, o$ %ourse, set these up as Gava stati% $inal obNe%ts an use their symboli% names...but this only =orks insi e Gava sour%e, not in layout DML $iles. .y putting these values in resour%e DML $iles, you %an re$eren%e them $rom both Gava an layouts, plus have them %entrally lo%ate $or easy e iting. Resour%e DML $iles have a root element o$ resourcesP everything else is a %hil o$ that root.
%;9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

Dimensions
Aimensions are use in several pla%es in An roi to es%ribe istan%es, su%h a =i get6s pa ing. While this book usually uses pi:els &e.g., ?@px $or ten pi:els', there are several i$$erent units o$ measurement available to you*
in

an mm $or in%hes an a%tual siMe o$ the s%reen


pt dp

millimeters, respe%tively, base

on the

$or points, =hi%h in publishing terms is ,U12n o$ an in%h &again, base on the a%tual physi%al siMe o$ the s%reen' an sp $or evi%e2in epen ent pi:els an s%ale2in epen ent pi:els O one pi:el e;uals one p $or a ,30 pi resolution s%reen, =ith the ratio s%aling base on the a%tual s%reen pi:el ensity &s%ale2 in epen ent pi:els also take into a%%ount the user6s pre$erre $ont siMe'

4o en%o e a imension as a resour%e, a a dimen element, =ith a name! attribute $or your uni;ue name $or this resour%e, an a single %hil te:t element representing the value*
"resources' !!"dimen!name$%t&in%'?@px"/dimen' !!"dimen!name$%fat%'?in"/dimen' "/resources'

-n a layout, you %an re$eren%e imensions as 9dimen/..., =here the ellipsis is a pla%ehol er $or your uni;ue name $or the resour%e &e.g., t&in an fat $rom the sample above'. -n Gava, you re$eren%e imension resour%es by the uni;ue name pre$i:e =ith R.dimen. &e.g., Resources.getDimen:R.dimen.t&in;'.

Colors
Colors in An roi are he:a e%imal R7. values, also optionally spe%i$ying an alpha %hannel. @ou have your %hoi%e o$ single2%hara%ter he: values or ouble2%hara%ter he: values, leaving you =ith $our styles*
DR06

%*;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

DAR06 DRR0066 DAARR0066

4hese =ork similarly to their %ounterparts in Cas%a ing #tyle #heets &C##'. @ou %an, o$ %ourse, put these R7. values as string literals in Gava sour%e or layout resour%es. -$ you =ish to turn them into resour%es, though, all you nee to o is a color elements to the resour%es $ile, =ith a name attribute $or your uni;ue name $or this %olor, an a single te:t element %ontaining the R7. value itsel$*
"resources' !!"color!name$%yellow_orange%'DEEDLLL"/color' !!"color!name$%forest_green%'D@@LL@@"/color' !!"color!name$%burnt_umber%'DAAIIHO"/color' "/resources'

-n a layout, you %an re$eren%e %olors as 9color/..., repla%ing the ellipsis =ith your uni;ue name $or the %olor &e.g., burnt_umber'. -n Gava, you re$eren%e %olor resour%es by the uni;ue name pre$i:e =ith R.color. &e.g., Resources.get)olor:R.dimen.forest_green;'.

Arr ys
Array resour%es are esigne to hol lists o$ simple strings, su%h as a list o$ honori$i%s &Mr., Mrs., Ms., Ar., et%.'. -n the resour%e $ile, you nee one string-array element per array, =ith a name! attribute $or the uni;ue name you are giving the array. 4hen, a one or more %hil item elements, ea%h o$ =hi%h having a single te:t element =ith the value $or that entry in the array*
"resources' !!"array!name$%&onorifics%' !!!!"item'Dr."/item' !!!!"item'Mr."/item' !!!!"item'Mrs."/item'

%**
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

!!!!"item'Ms."/item' !!"/array' "/resources'

(rom your Gava %o e, you %an then use Resources.getStringArray:; to get a StringPQ o$ the items in the list. 4he parameter to getStringArray:; is your uni;ue name $or the array, pre$i:e =ith R.array. &e.g., Resources.getStringArray:R.array.&onorifics;'.

/ifferent Strokes for /ifferent !olks


>ne set o$ resour%es may not $it all situations =here your appli%ation may be use . >ne obvious area %omes =ith string resour%es an ealing =ith internationaliMation &-,8/' an lo%aliMation &L,0/'. !utting strings all in one language =orks $ine O probably at least $or the eveloper O but only %overs one language. 4hat is not the only s%enario =here resour%es might nee to i$$er, though. )ere are others*

#creen orientation* is the s%reen in a portrait orientationC Lan s%apeC -s the s%reen s;uare an , there$ore, oes not really have an orientationC #creen siBe* ho= many pi:els oes the s%reen have, so you %an siMe your resour%es a%%or ingly &e.g., large versus small i%ons'C Touchscreen* oes the evi%e have a tou%hs%reenC -$ so, is the tou%hs%reen set up to be use =ith a stylus or a $ingerC 6ey5oard* =hat keyboar oes the user have &HWIR4@, numeri%, neither', either no= or as an optionC Ather input* oes the evi%e have some other $orm o$ input, like a ire%tional pa or %li%k2=heelC

4he =ay An roi presently han les this is by having multiple resour%e ire%tories, =ith the %riteria $or ea%h embe e in their names.

%*%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

#uppose, $or e:ample, you =ant to support strings in both Inglish an #panish. /ormally, $or a single2language setup, you =oul put your strings in a $ile name res/values/strings.xml. 4o support both Inglish an #panish, you =oul %reate t=o $ol ers, res/values-en an res/values-es, =here the value a$ter the hyphen is the -#> 3?02, t=o2letter %o e $or the language you =ant. @our Inglish2language strings =oul go in res/valuesen/strings.xml an the #panish ones in res/values-es/strings.xml. An roi =ill %hoose the proper $ile base on the user6s evi%e settings. #eems easy, rightC Where things start to get %ompli%ate is =hen you nee to use multiple isparate %riteria $or your resour%es. 4his may %ome most $re;uently =ith layouts, as you might =ant one layout $or portrait an small s%reens, one layout $or larger s%reens in lan s%ape mo e, an variations o$ ea%h $or $inger2input versus other types o$ input &keyboar , stylus'. 4his =ill allo= you to make the best use o$ the available s%reen Qreal estateQ, =ithout any %o ing %hanges to your a%tivity using the layout. >n%e you get into these sorts o$ situations, though, all sorts o$ rules %ome into play, su%h as*

4he %on$iguration options &e.g., -en' have a parti%ular or er o$ pre%e en%e, an they must appear in the ire%tory name in that or er. 4he An roi o%umentation outlines the spe%i$i% or er in =hi%h these options %an appear. (or the purposes o$ this e:ample, s%reen orientation must pre%e e tou%hs%reen type, =hi%h must pre%e e s%reen siMe. 4here %an only be one value o$ ea%h %on$iguration option %ategory per ire%tory. @ou %annot, $or e:ample, %onsi er portrait an s;uare s%reens to be the same O ea%h =ill re;uire its o=n name res/layout... $ol er. >ptions are %ase sensitive

#o, $or the s%enario es%ribe above, in theory, =e =oul nee the $ollo=ing ire%tories*

%*Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

res/layout-finger res/layout-sJuare-finger res/layout-land-finger-NO@xOA@ res/layout-notouc&

res/layout-sJuare-notouc&
res/layout-land-notouc&-NO@xOA@ res/layout-stylus res/layout-sJuare-stylus res/layout-land-stylus-NO@xOA@

/ote that $or some o$ these, the a%tual layout $iles =ill be i enti%al. (or e:ample, =e only %are about $inger layouts being i$$erent than the other t=o, but sin%e =e %annot %ombine those t=o, =e =oul theoreti%ally have to have separate ire%tories =ith i enti%al %ontents $or notouc& an stylus. Also note that there is nothing preventing you $rom also having a ire%tory =ith the una orne base name &res/layout'. -n $a%t, this is probably a goo i ea, in %ase $uture e itions o$ the An roi runtime intro u%e other %on$iguration options you i not %onsi er O having a e$ault layout might make the i$$eren%e bet=een your appli%ation =orking or $ailing on that ne= evi%e. /o=, =e %an Q%heatQ a bit, by e%o ing the rules An roi uses $or etermining =hi%h, among a set o$ %an i ates, is the QrightQ resour%e ire%tory to use* ,. (irst up, An roi tosses out ones that are spe%i$i%ally invali . #o, $or e:ample, i$ the s%reen siMe o$ the evi%e is ?20:2<0, the NO@xOA@! ire%tories =oul be roppe as %an i ates, sin%e they spe%i$i%ally %all $or some other siMe.

2. /e:t, An roi %ounts the number o$ mat%hes $or ea%h $ol er, an only pays attention to those =ith the most mat%hes.

%*$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Working )ith 3esources

?. (inally, An roi goes in the or er o$ pre%e en%e o$ the options O in other =or s, it goes $rom le$t to right in the ire%tory name. #o =e %oul skate by =ith only the $ollo=ing %on$igurations*
res/layout-land-finger-NO@xOA@ res/layout-land-NO@xOA@ res/layout-finger res/layout

-$ the evi%e is in portrait or s;uare mo e, or oes not have a 3<0:<80 s%reen siMe, the $irst t=o %an i ates =ill be skippe , an the layout =ill be %hosen base on =hether the evi%e supports $inger input or not. >ther=ise, one o$ the t=o lan s%ape 3<0:<80 layouts =ill be %hosen, as they =oul be a QstrongerQ mat%h than the others, =ith the $inal etermination being on =hether the evi%e supports $inger input or not.

%*0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER 12

+anaging and (ccessing ocal /atabases

#HLite is a very popular embe e atabase, as it %ombines a %lean #HL inter$a%e =ith a very small memory $ootprint an e%ent spee . Moreover, it is publi% omain, so everyone %an use it. Lots o$ $irms &A obe, Apple, 7oogle, #un, #ymbian' an open sour%e proNe%ts &MoMilla, !)!, !ython' all ship pro u%ts =ith #HLite. (or An roi , #HLite is Qbake intoQ the An roi runtime, so every An roi appli%ation %an %reate #HLite atabases. #in%e #HLite uses a #HL inter$a%e, it is $airly straight$or=ar to use $or people =ith e:perien%e in other #HL2 base atabases. )o=ever, its native A!- is not GA.C, an GA.C might be too mu%h overhea $or a memory2limite evi%e like a phone, any=ay. )en%e, An roi programmers have a i$$erent A!- to learn O the goo ne=s being is that it is not that i$$i%ult. 4his %hapter =ill %over the basi%s o$ #HLite use in the %onte:t o$ =orking on An roi . -t by no means is a thorough %overage o$ #HLite as a =hole. -$ you =ant to learn more about #HLite an ho= to use it in other environment than An roi , a $ine book is 4he Ae$initive 7ui e to #HLite by Mi%hael >=ens. A%tivities =ill typi%ally a%%ess a atabase via a %ontent provi er or servi%e. As su%h, this %hapter oes not have a $ull e:ample. @ou =ill $in a $ull e:ample

%*4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

o$ a %ontent provi er that a%%esses a atabase in the .uil ing a Content !rovi er %hapter.

( Guick SG ite Primer


#HLite, as the name suggests, uses a iale%t o$ #HL $or ;ueries &S*+*)-', ata manipulation &./S*R-, et. al.', an ata e$inition &)R*A-* ! -A6+*, et. al.'. #HLite has a $e= pla%es =here it eviates $rom the #HL202 stan ar , no i$$erent than most #HL atabases. 4he goo ne=s is that #HLite is so spa%e2e$$i%ient that the An roi runtime %an in%lu e all o$ #HLite, not some arbitrary subset to trim it o=n to siMe. 4he biggest i$$eren%e $rom other #HL atabases you =ill en%ounter is probably the ata typing. While you %an spe%i$y the ata types $or %olumns in a )R*A-*!-A6+* statement, an =hile #HLite =ill use those as a hint, that is as $ar as it goes. @ou %an put =hatever ata you =ant in =hatever %olumn you =ant. !ut a string in an ./-*0*R %olumnC #ure9 /o problem9 +i%e versaC Works too9 #HLite re$ers to this as Qmani$est typingQ, as es%ribe in the o%umentation* In manifest typing, the datatype is a property of the value it self, not of the column in which the value is stored. S Lite thus allows the user to store any value of any datatype into any column regardless of the declared type of that column. -n a ition, there are a han $ul o$ stan ar #HL $eatures not supporte in #HLite, notably E,R*.0/ ! M*F %onstraints, neste transa%tions, R.03- ! ,2-*R! =,./ an E2++!,2-*R!=,./, an some $lavors o$ A+-*R!-A6+*. .eyon that, though, you get a $ull #HL system, %omplete =ith triggers, transa%tions, an the like. #to%k #HL statements, like S*+*)-, =ork pretty mu%h as you might e:pe%t. -$ you are use to =orking =ith a maNor atabase, like >ra%le, you may look upon #HLite as being a QtoyQ atabase. !lease bear in min that >ra%le an
%*7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

#HLite are meant to solve i$$erent problems, an that you =ill not be seeing a $ull %opy o$ >ra%le on a phone any time real soon, in all likelihoo .

Start at the Beginning


/o atabases are automati%ally supplie to you by An roi . -$ you =ant to use #HLite, you have to %reate your o=n atabase, then populate it =ith your o=n tables, in e:es, an ata. 4o %reate an open a atabase, your best option is to %ra$t a sub%lass o$ ST+ite,pen3elper. 4his %lass =raps up the logi% to %reate an upgra e a atabase, per your spe%i$i%ations, as nee e by your appli%ation. @our sub%lass o$ ST+ite,pen3elper =ill nee three metho s*

4he %onstru%tor, %haining up=ar to the ST+ite,pen3elper! %onstru%tor. 4his takes the )ontext &e.g., an Activity', the name o$ the atabase, an optional %ursor $a%tory &typi%ally, Nust pass null', an an integer representing the version o$ the atabase s%hema you are using.
on)reate:;,

=hi%h passes you a ST+iteDatabase obNe%t that you nee to populate =ith tables an initial ata, as appropriate. =hi%h passes you a ST+iteDatabase obNe%t an the ol an ne= version numbers, so you %an $igure out ho= best to %onvert the atabase $rom the ol s%hema to the ne= one. 4he simplest, albeit least $rien ly, approa%h is to simply rop the ol tables an %reate ne= ones. 4his is %overe in greater etail in the %hapter on %reating a %ontent provi er.
on2pgrade:;,

4he rest o$ this %hapter =ill is%uss ho= you a%tually %reate tables, insert ata, rop tables, et%., an =ill sho= sample %o e $rom a ST+ite,pen3elper! sub%lass. 4o use your ST+ite,pen3elper sub%lass, %reate an instan%e an ask it to getReadableDatabase:; or getCriteableDatabase:;, epen ing upon =hether or not you =ill be %hanging its %ontents*

%*9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

db$:new!Data!ase,elper:getContext:;;;.get&rita!leData!ase:;5 return!:db!$$!null;!>!false!#!true5

4his =ill return a ST+iteDatabase instan%e, =hi%h you %an then use to ;uery the atabase or mo i$y its ata. When you are one =ith the atabase &e.g., your a%tivity is being %lose ', simply %all close:; on the ST+iteDatabase to release your %onne%tion.

Setting the Table


ST+iteDatabase,

(or %reating your tables an in e:es, you =ill nee to %all execST+:; on your provi ing the AAL statement you =ish to apply against the atabase. .arring a atabase error, this metho returns nothing.

#o, $or e:ample, you %an*


db.execS/L:%)R*A-*!-A6+*!constants!:_id!./-*0*R!1R.MARF!M*F!A2-,./)R*M*/-G!title! -*U-G!value!R*A+;5%;5

4his =ill %reate a table, name constants, =ith a primary key %olumn name that is an auto2in%remente integer &i.e., #HLite =ill assign the value $or you =hen you insert ro=s', plus t=o ata %olumns* title &te:t' an value &a $loat, or QrealQ in #HLite terms'. #HLite =ill automati%ally %reate an in e: $or you on your primary key %olumn, so the se%on statement a s another in e: on the table, by name.
_id

Most likely, you =ill %reate tables an in e:es =hen you $irst %reate the atabase, or possibly =hen the atabase nee s upgra ing to a%%ommo ate a ne= release o$ your appli%ation. -$ you o not %hange your table s%hemas, you might never rop your tables or in e:es, but i$ you o, Nust use execST+:;! to invoke DR,1!./D*U an DR,1!-A6+* statements as nee e .

%%;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

+akinA /ata
7iven that you have a atabase an one or more tables, you probably =ant to put some ata in them an su%h. @ou have t=o maNor approa%hes $or oing this. @ou %an al=ays use execST+:;, Nust like you i $or %reating the tables. 4he execST+:; metho =orks $or any #HL that oes not return results, so it %an han le ./S*R-, 21DA-*, D*+*-*, et%. Nust $ine. #o, $or e:ample*
db.execS/L:%./S*R-!./-,!widgets!:nameG!inventory;%B !!!!!!!!!!!!%7A+2*S!:[Sproc et[G!L;%;5

@our alternative is to use the insert:;, update:;, an delete:; metho s on the ST+iteDatabase obNe%t. 4hese are Qbuil erQ sorts o$ metho s, in that the break o=n the #HL statements into is%rete %hunks, then take those %hunks as parameters. 4hese metho s make use o$ )ontent7alues obNe%ts, =hi%h implement a Map2 es;ue inter$a%e, albeit one that has a itional metho s $or =orking =ith #HLite types. (or e:ample, in a ition to get:; to retrieve a value by its key, you have getAs.nteger:;, getAsString:;, an so $orth. 4he insert:; metho takes the name o$ the table, the name o$ one %olumn as the Qnull %olumn ha%kQ, an a )ontent7alues =ith the initial values you =ant put into this ro=. 4he Qnull %olumn ha%kQ is $or the %ase =here the )ontent7alues instan%e is empty O the %olumn name as the Qnull %olumn ha%kQ =ill be e:pli%itly assigne the value /2++ in the #HL ./S*R- statement generate by insert:;.
)ontent7alues!cv$new!ContentValues:;5 cv.put:)onstants.-.-+*G!%0ravityG!Deat&!Star!.%;5 cv.put:)onstants.7A+2*G!SensorManager.0RA7.-F_D*A-3_S-AR_.;5 db.insert:%constants%G!get%ullColumn,ack:;G!cv;5

4he update:; metho takes the name o$ the table, a )ontent7alues! representing the %olumns an repla%ement values to use, an optional C3*R*!

%%*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

%lause, an an optional list o$ parameters to $ill into the C3*R* %lause, to repla%e any embe e ;uestion marks &>'. #in%e update:; only repla%es %olumns =ith $i:e values, versus ones %ompute base on other in$ormation, you may nee to use execST+:; to a%%omplish some en s. 4he C3*R* %lause an parameter list =orks akin to the positional #HL parameters you may be use to $rom other #HL A!-s. (or e:ample*
//!replacements!is!a!)ontent7alues!instance StringPQ!parms$new!StringPQ!8%snic lefrit(%<5 db.update:%widgets%G!replacementsG!%name$>%G!parms;5

4he delete:; metho =orks akin to update:;, taking the name o$ the table, the optional C3*R* %lause, an the %orrespon ing parameters to $ill into the C3*R* %lause.

What 'oes (round6 Comes (round


As =ith ./S*R-, 21DA-*, an D*+*-*, you have t=o main options $or retrieving ata $rom a #HLite atabase using S*+*)-* ,. @ou %an use rawTuery:; to invoke a S*+*)- statement ire%tly, or

2. @ou %an use Juery:; to buil up a ;uery $rom its %omponent parts Con$oun ing matters $urther is the ST+iteTuery6uilder %lass an the issue o$ %ursors an %ursor $a%tories. Let6s take all o$ this one pie%e at a time.

R # ;ueries
4he simplest solution, at least in terms o$ the A!-, is rawTuery:;. #imply %all it =ith your #HL S*+*)- statement. 4he S*+*)- statement %an in%lu e positional parametersP the array o$ these $orms your se%on parameter to rawTuery:;. #o, =e =in up =ith*
)ursor!c$db.raw/uery:%S*+*)-!name!ER,M!sJlite_master!C3*R*!type$[table[!A/D! name$[constants[%G!null;5

%%%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

-n this e:ample, =e a%tually ;uery a #HLite system table & sJlite_master' to see i$ our %onstants table alrea y e:ists. 4he return value is a )ursor, =hi%h %ontains metho s $or iterating over results &see belo='. -$ your ;ueries are pretty mu%h Qbake intoQ your appli%ation, this is a very straight$or=ar =ay to use them. )o=ever, it gets %ompli%ate i$ parts o$ the ;uery are ynami%, beyon =hat positional parameters %an really han le. (or e:ample, i$ the set o$ %olumns you nee to retrieve is not kno=n at %ompile time, puttering aroun %on%atenating %olumn names into a %omma2 elimite list %an be annoying...=hi%h is =here Juery:; %omes in.

Re!ul r ;ueries
4he Juery:; metho takes the is%rete pie%es o$ a #ILIC4 statement an buil s the ;uery $rom them. 4he pie%es, in or er that they appear as parameters to Juery:;, are*

4he name o$ the table to ;uery against 4he list o$ %olumns to retrieve 4he C3*R* %lause, optionally in%lu ing positional parameters 4he list o$ values to substitute in $or those positional parameters 4he 0R,21!6F %lause, i$ any 4he ,RD*R!6F %lause, i$ any

4hese %an be null =hen they are not nee e &e:%ept the table name, o$ %ourse'. #o, our previous snippet %onverts into*
StringPQ!columns$8%.D%G!%inventory%<5 StringPQ!parms$8%snic lefrit(%<5 )ursor!result$db..uery:%widgets%G!columnsG!%name$>%G !!!!!!!!!!!!!!!!!!!!!!!parmsG!nullG!nullG!null;5

%%Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

Buildin! #ith Builders


@et another option is to use ST+iteTuery6uilder, =hi%h o$$ers mu%h ri%her ;uery2buil ing options, parti%ularly $or nasty ;ueries involving things like the union o$ multiple sub2;uery results. More importantly, the ST+iteTuery6uilder inter$a%e ovetails ni%ely =ith the )ontent1rovider! inter$a%e $or e:e%uting ;ueries. )en%e, a %ommon pattern $or your %ontent provi er6s Juery:; implementation is to %reate a ST+iteTuery6uilder, $ill in some e$aults, then allo= it to buil up &an optionally e:e%ute' the $ull ;uery %ombining the e$aults =ith =hat is provi e to the %ontent provi er on the ;uery re;uest. (or e:ample, here is a snippet o$ %o e $rom a %ontent provi er using ST+iteTuery6uilder*
9,verride public!)ursor!.uery:2ri!urlG!StringPQ!projectionG!String!selectionG !!!!!!!!!!!!!!!!!!!!!StringPQ!selectionArgsG!String!sort;!8 !!ST+iteTuery6uilder!Jb$new!S/Lite/ueryBuilder:;5 !!Jb.setTa!les:getTa!le%ame:;;5 !!if!:isCollection)ri:url;;!8 !!!!Jb.set(ro0ection'ap:getDefault(ro0ection:;;5 !!< !!else!8 !!!!Jb.append&here:getIdColumn%ame:;B%$%Burl.get(athSegments:;.get:?;;5 !!< !!String!order6y5 !!if!:-ext2tils.is*mpty:sort;;!8 !!!!order6y$getDefaultSortOrder:;5 !!<!else!8 !!!!order6y$sort5 !!< !!)ursor!c$Jb..uery:dbG!projectionG!selectionG!selectionArgsG !!!!!!!!!!!!!!!!!!!!nullG!nullG!order6y;5 !!c.set%otification)ri:getContext:;.getContent$esol er:;G!url;5 !!return!c5

Content provi ers are e:plaine in greater etail later in the book, so some o$ this you =ill have to take on $aith until then. )ere, =e see*

A ST+iteTuery6uilder is %onstru%te
%%$

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

-t is tol the table to use $or the ;uery &set-ables:get-able/ame:;;' -t is either tol the e$ault set o$ %olumns to return &set1rojectionMap:;', or is given a pie%e o$ a C3*R* %lause to i enti$y a parti%ular ro= in the table by an i enti$ier e:tra%te $rom the 2ri! supplie to the Juery:; %all &appendC&ere:;' (inally, it is tol to e:e%ute the ;uery, blen ing the preset values =ith those supplie on the %all to Juery:; &Jb.Juery:dbG!projectionG! selectionG!selectionArgsG!nullG!nullG!order6y;'

-nstea o$ having the ST+iteTuery6uilder e:e%ute the ;uery ire%tly, =e %oul have %alle buildTuery:; to have it generate an return the #HL S*+*)-! statement =e nee e , =hi%h =e %oul then e:e%ute ourselves.

+sin! Cursors
/o matter ho= you e:e%ute the ;uery, you get a )ursor ba%k. 4his is the An roi U#HLite e ition o$ the atabase %ursor, a %on%ept use in many atabase systems. With the %ursor, you %an*

(in out ho= many ro=s are in the result set via count:; -terate over the ro=s via first:;, next:;, an isAfter+ast:; (in out the names o$ the %olumns via get)olumn/ames:;, %onvert those into %olumn numbers via get)olumn.ndex:;, an get values $or the %urrent ro= $or a given %olumn via metho s like getString:;, get.nt:;, et%. Re2e:e%ute the ;uery that %reate the %ursor via reJuery:; Release the %ursor6s resour%es via close:;

(or e:ample, here =e iterate over the =i gets table entries $rom the previous snippets*
)ursor!result$ !!db.raw/uery:%S*+*)-!.DG!nameG!inventory!ER,M!widgets%;5 w&ile!:Xresult.is#fterLast:;;!8 int!id$result.getInt:@;5

%%0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

String!name$result.getString:?;5 int!inventory$result.getInt:H;5 //!do!somet&ing!useful!wit&!t&ese result.next:;5 < result.close:;5

% $in! <our 0#n Cursors


4here may be %ir%umstan%es in =hi%h you =ant to use your o=n )ursor! sub%lass, rather than the sto%k implementation provi e by An roi . -n those %ases, you %an use JueryCit&Eactory:; an rawTueryCit&Eactory:; that take a ST+iteDatabase.)ursorEactory instan%e as a parameter. 4he $a%tory, as one might e:pe%t, is responsible $or %reating ne= %ursors via its new)ursor:;! implementation. (in ing an implementing a vali use $or this $a%ility is le$t as an e:er%ise $or the rea er. #u$$i%e it to say that you shoul not nee to %reate your o=n %ursor %lasses mu%h, i$ at all, in or inary An roi evelopment.

/ata6 /ata6 Every)here


-$ you are use to eveloping $or other atabases, you are also probably use to having tools to inspe%t an manipulate the %ontents o$ the atabase, beyon merely the atabase6s A!-. With An roi 6s emulator, you have t=o main options $or this. (irst, the emulator is suppose to bun le in the sJliteI %onsole program an makes it available $rom the adb!s&ell %omman . >n%e you are in the emulator6s shell, Nust e:e%ute sJliteI, provi ing it the path to your atabase $ile. @our atabase $ile %an be $oun at*
/data/data/your.app.pac age/databases/your-db-name.db

%%1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

)ere your.app.pac age is the Gava pa%kage $or your appli%ation &e.g., com.commonsware.android' an your-db-name is the name o$ your atabase, as supplie to createDatabase:;. /ote, ho=ever, that the An roi 0.0 #AE appears to be missing the sJliteI! %omman . 4he sJliteI program =orks, an i$ you are use to poking aroun your tables using a %onsole inter$a%e, you are =el%ome to use it. -$ you pre$er something a little bit $rien lier, you %an al=ays %opy the #HLite atabase o$$ the evi%e onto your evelopment ma%hine, then use a #HLite2a=are %lient program to putter aroun . /ote, though, that you are =orking o$$ a %opy o$ the atabaseP i$ you =ant your %hanges to go ba%k to the evi%e, you =ill nee to trans$er the atabase ba%k over. 4o get the atabase o$$ the evi%e, you %an use the adb!pull %omman &or the e;uivalent in your -AI', =hi%h takes the path to the on2 evi%e atabase an the lo%al estination as parameters. 4o store a mo i$ie atabase on the evi%e, use adb!pus&, =hi%h takes the lo%al path to the atabase an the on2 evi%e estination as parameters. >ne o$ the most2a%%essible #HLite %lients is the #HLite Manager e:tension $or (ire$o:, as it =orks a%ross all plat$orms.

%%4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+anaging and (ccessing ocal /atabases

!igure 1$< the SG ite +anager !irefox extension

@ou %an $in

oMens o$ others on the #HLite Web site.

%%7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &6

everaging Cava ibraries

Gava has as many, i$ not more, thir 2party libraries than any other mo ern programming language. )ere, Qthir 2party librariesQ re$er to the innumerable GARs that you %an in%lu e in a server or esktop Gava appli%ation O the things that the Gava #AEs themselves o not provi e. -n the %ase o$ An roi , the Aalvik +M at its heart is not pre%isely Gava, an =hat it provi es in its #AE is not pre%isely the same as any tra itional Gava #AE. 4hat being sai , many Gava thir 2party libraries still provi e %apabilities that An roi la%ks natively an there$ore may be o$ use to you in your proNe%t, $or the ones you %an get =orking =ith An roi 6s $lavor o$ Gava. 4his %hapter e:plains =hat it =ill take $or you to leverage su%h libraries an the limitations on An roi 6s support $or arbitrary thir 2party %o e.

The ,uter imits


/ot all available Gava %o e, o$ %ourse, =ill =ork =ell =ith An roi . 4here are a number o$ $a%tors to %onsi er, in%lu ing*

.xpected Platform AP%s* Aoes the %o e assume a ne=er G+M than the one An roi is base onC >r, oes the %o e assume the e:isten%e o$ Gava A!-s that ship =ith G2#I but not =ith An roi , su%h as #=ingC

%%9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

everaging Cava ibraries

#iBe* I:isting Gava %o e esigne $or use on esktops or servers nee not =orry too mu%h about on2 isk siMe, or, to some e:tent, even in2 RAM siMe. An roi , o$ %ourse, is short on both. "sing thir 2party Gava %o e, parti%ularly =hen pre2pa%kage as GARs, may balloon the siMe o$ your appli%ation. Performance* Aoes the Gava %o e e$$e%tively assume a mu%h more po=er$ul C!" than =hat you may $in on many An roi evi%esC Gust be%ause a esktop %an run it =ithout issue oesn6t mean your average mobile phone =ill han le it =ell. %nterface* Aoes the Gava %o e assume a %onsole inter$a%eC >r is it a pure A!- that you %an =rap your o=n inter$a%e aroun C

>ne tri%k $or a ressing some o$ these %on%erns is to use open sour%e Gava %o e, an a%tually =ork =ith the %o e to make it more An roi 2$rien ly. (or e:ample, i$ you6re only using ,0J o$ the thir 2party library, maybe it6s =orth=hile to re%ompile the subset o$ the proNe%t to be only =hat you nee , or at least removing the unne%essary %lasses $rom the GAR. 4he $ormer approa%h is sa$er, in that you get %ompiler help to make sure you6re not is%ar ing some essential pie%e o$ %o e, though it may be more te ious to o.

(nts and Cars


@ou have t=o %hoi%es $or integrating thir 2party %o e into your proNe%t* use sour%e %o e, or use pre2pa%kage GARs. -$ you %hoose to use their sour%e %o e, all you nee to o is %opy it into your o=n sour%e tree &un er src/ in your proNe%t', so it %an sit alongsi e your e:isting %o e, then let the %ompiler per$orm its magi%. -$ you %hoose to use an e:isting GAR, perhaps one $or =hi%h you o not have the sour%e %o e, you =ill nee to tea%h your buil %hain ho= to use the GAR. -$ you are using an -AI, that6s a matter o$ telling it to re$eren%e the GAR. -$, on the other han , you are not using an -AI an are relying upon the build.xml Ant s%ript, put the GAR in the libs/ ire%tory %reate $or you by activity)reator, an the Ant buil pro%ess =ill pi%k it up.
%-;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

everaging Cava ibraries

(or e:ample, in a previous e ition o$ this book, =e ha a Mail.uMM proNe%t. Mail.uMM, as the name suggests, ealt =ith email. 4o a%%omplish that en , Mail.uMM leverage the GavaMail A!-s an nee s t=o GavaMail GARs* mail-?.O.jar an activation-?.?.jar. With both o$ those in the libs/! ire%tory, the classpat& tells javac to link against those GARs, so any GavaMail re$eren%es in the Mail.uMM %o e %an be %orre%tly resolve . 4hen, those GARs are liste , along =ith the Mail.uMM %ompile %lasses, in the task that invokes the dex tool to %onvert the Gava %o e into Aalvik +M instru%tions. Without this step, even though your %o e may %ompile, it =on6t $in the GavaMail %lasses at runtime an =ill $ail =ith an e:%eption. As it turne out, though, the Aalvik +M an %ompiler supplie =ith the An roi 0.0 #AE no longer supporte some Gava language $eatures use by GavaMail. An , =hile the GavaMail sour%e %o e is available, it is un er an open sour%e li%ense &CAAL' that...has issues.

!ollo)ing the Script


4he material in this se%tion is base on the author6s posts to the .uil ing 6Aroi s %olumn on An roi 7uys.%om. "nlike other mobile evi%e operating systems, An roi has no restri%tions on =hat you %an run on it, so long as you %an o it in Gava using the Aalvik +M. 4his in%lu es in%orporating your o=n s%ripting language into your appli%ation, something that is e:pressly prohibite on some other evi%es. >ne possible Gava s%ripting language is .eanshell. .eanshell gives you Gava2 %ompatible synta: =ith impli%it typing an no %ompilation re;uire . #o, to a .eanshell s%ripting, you nee to put the .eanshell interpreter6s GAR $ile in your libs/ ire%tory. 4he 2.0b< GAR available $or o=nloa $rom the .eanshell site, un$ortunately, oes not =ork out o$ the bo: =ith the An roi 0.0 #AE, perhaps ue to the %ompiler that =as use to buil it. -nstea , you shoul probably %he%k out the sour%e %o e $rom #ubversion an e:e%ute ant ! jarcore to buil it, then %opy the resulting GAR &in .eanshell6s dist/ ire%tory' to your o=n proNe%t6s libs/. >r, Nust use the
%-*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

everaging Cava ibraries

.eanshell GAR that a%%ompanies the sour%e %o e $or this book, up on the CommonsWare site. (rom there, using .eanshell on An roi is no i$$erent than using .eanshell in any other Gava environment* ,. Create an instan%e o$ the .eanshell .nterpreter %lass

2. #et any 5globals8 $or the s%riptWs use via .nterpreterDset:; ?. Call .nterpreterDeval:; to run the s%ript an , optionally, get the result o$ the last statement (or e:ample, here is the DML layout $or the =orl Ws smallest .eanshell -AI*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!android#orientation$%vertical% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%fill_parent% !!!!' "6utton !!!!android#id$%9Bid/eval% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content% !!!!android#text$%0oX%! !!!!/' "*dit-ext !!!!android#id$%9Bid/script% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent%! !!!!android#single+ine$%false% !!!!android#gravity$%top% !!!!/' "/+inear+ayout'

Couple that =ith the $ollo=ing a%tivity implementation*


pac age!com.commonsware.android.ands&ell5 import!android.app.Activity5 import!android.app.AlertDialog5 import!android.os.6undle5 import!android.view.7iew5 import!android.widget.6utton5 import!android.widget.*dit-ext5 import!android.widget.-oast5 import!bs&..nterpreter5

%-%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

everaging Cava ibraries

public!class!MainActivity!extends!Activity!8 !!private!.nterpreter!i$new!Interpreter:;5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!6utton!btn$:6utton;findViewById:R.id.eval;5 !!!!final!*dit-ext!script$:*dit-ext;findViewById:R.id.script;5 !!!! !!!!btn.setOnClickListener:new!7iew.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!view;!8 !!!!!!!!String!src$script.getText:;.toString:;5 !!!!!!!! !!!!!!!!try!8 !!!!!!!!!!i.set:%context%G!MainActivity.t&is;5 !!!!!!!!!!i.e al:src;5 !!!!!!!!< !!!!!!!!catc&!:bs&.*val*rror!e;!8 !!!!!!!!!!AlertDialog.6uilder!builder$ !!!!!!!!!!!!!!!!!!!!new!AlertDialog.Builder:MainActivity.t&is;5 !!!!!!!!!! !!!!!!!!!!builder !!!!!!!!!!!!.setTitle:%*xceptionX%; !!!!!!!!!!!!.set'essage:e.toString:;; !!!!!!!!!!!!.set(ositi eButton:%,M%G!null; !!!!!!!!!!!!.show:;5 !!!!!!!!< !!!!!!< !!!!<;5 !!< <

Compile an run it &in%lu ing in%orporating the .eanshell GAR as mentione above', an install it on the emulator. (ire it up, an you get a trivial -AI, =ith a large te:t area $or your s%ript an a big Q7o9Q button to e:e%ute it*

%-Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

everaging Cava ibraries

!igure 10< The (ndShell Beanshell 8/E import!android.widget.-oast5 -oast.makeText:contextG!%3elloG!worldX%G!L@@@;.show:;5

/ote the use o$ context to re$er to the a%tivity =hen making the -oast. 4hat is the global set by the a%tivity to re$eren%e ba%k to itsel$. @ou %oul %all this global variable anything you =ant, so long as the set:; %all an the s%ript %o e use the same name. 4hen, %li%k the 7o9 button, an you get*

%-$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

everaging Cava ibraries

!igure 11< The (ndShell Beanshell 8/E6 executing some code

An no=, some %aveats... (irst, not all s%ripting languages =ill =ork. (or e:ample, those that implement their o=n $orm o$ Nust2in2time &G-4' %ompilation, generating Gava byte%o es on the $ly, =oul probably have to be augmente to generate Aalvik +M byte%o es instea o$ those $or sto%k Gava implementations. #impler languages that e:e%ute o$$ o$ parse s%ripts, %alling Gava re$le%tion A!-s to %all ba%k into %ompile %lasses, =ill likely =ork better. Iven there, though, not every $eature o$ the language may =ork, i$ it relies upon some $a%ility in a tra itional Gava A!- that oes not e:ist in Aalvik O $or e:ample, there %oul be stu$$ hi en insi e .eanshell or the a 2on GARs that oes not =ork on to ayWs An roi . #e%on , s%ripting languages =ithout G-4 =ill inevitably be slo=er than %ompile Aalvik appli%ations. #lo=er may mean users e:perien%e sluggishness. #lo=er e$initely means more battery li$e is %onsume $or the same amount o$ =ork. #o, buil ing a =hole An roi appli%ation in .eanshell, simply be%ause you $eel it is easier to program in, may %ause your users to be unhappy.

%-0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

everaging Cava ibraries

4hir , s%ripting languages that e:pose the =hole Gava A!-, like .eanshell, %an pretty mu%h o anything the un erlying An roi se%urity mo el allo=s. #o, i$ your appli%ation has the R*AD_),/-A)-S permission, e:pe%t any .eanshell s%ripts your appli%ation runs to have the same permission. Last, but %ertainly not least, is that language interpreter GARs ten to be...portly. 4he .eanshell GAR use in this e:ample is 200E.. 4hat is not ri i%ulous, %onsi ering =hat it oes, but it =ill make appli%ations that use .eanshell that mu%h bigger to o=nloa , take up that mu%h more spa%e on the evi%e, et%.

%-1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &1

Communicating via the 8nternet

4he e:pe%tation is that most, i$ not all, An roi evi%es =ill have built2in -nternet a%%ess. 4hat %oul be Wi(i, %ellular ata servi%es &IA7I, ?7, et%.', or possibly something else entirely. Regar less, most people O or at least those =ith a ata plan or Wi(i a%%ess O =ill be able to get to the -nternet $rom their An roi phone. /ot surprisingly, the An roi plat$orm gives evelopers a =i e range o$ =ays to make use o$ this -nternet a%%ess. #ome o$$er high2level a%%ess, su%h as the integrate WebEit bro=ser %omponent =e sa= in an earlier %hapter. -$ you =ant, you %an rop all the =ay o=n to using ra= so%kets. >r, in bet=een, you %an leverage A!-s O both on2 evi%e an $rom ?r 2party GARs O that give you a%%ess to spe%i$i% proto%ols* )44!, DM!!, #M4!, an so on. 4he emphasis o$ this book is on the higher2level $orms o$ a%%ess* the WebEit %omponent an -nternet2a%%ess A!-s, as busy %o ers shoul be trying to reuse e:isting %omponents versus rolling one6s o=n on2the2=ire proto%ol =herever possible.

3EST and 3elaxation


An roi oes not have built2in #>A! or DML2R!C %lient A!-s. )o=ever, it oes have the Apa%he )ttpComponents library bake in. @ou %an either layer a #>A!UDML2R!C layer atop this library, or use it QstraightQ $or a%%essing RI#42style Web servi%es. (or the purposes o$ this book, QRI#42
%-4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Communicating via the 8nternet

style Web servi%esQ is e$ine as Qsimple )44! re;uests $or or inary "RLs over the $ull range o$ )44! verbs, =ith $ormatte payloa s &DML, G#>/, et%.' as responsesQ. More e:pansive tutorials, (AHs, an )>W4>s %an be $oun at the )ttpComponents Web site. )ere, =e6ll %over the basi%s, =hile %he%king the =eather.

HTTP 0per tions vi Ap che HttpComponents


4he $irst step to using )ttpClient is, not surprisingly, to %reate an 3ttp)lient! obNe%t. 4he %lient obNe%t han les all )44! re;uests upon your behal$. #in%e 3ttp)lient is an inter$a%e, you =ill nee to a%tually instantiate some implementation o$ that inter$a%e, su%h as Default3ttp)lient. 4hose re;uests are bun le up into 3ttpReJuest instan%es, =ith i$$erent 3ttpReJuest implementations $or ea%h i$$erent )44! verb &e.g., 3ttp0et $or )44! 0*- re;uests'. @ou %reate an 3ttpReJuest implementation instan%e, $ill in the "RL to retrieve an other %on$iguration ata &e.g., $orm values i$ you are oing an )44! 1,S- via 3ttp1ost', then pass the metho to the %lient to a%tually make the )44! re;uest via e:e%ute&'. What happens at this point %an be as simple or as %ompli%ate as you =ant. @ou %an get an 3ttpResponse obNe%t ba%k, =ith response %o e &e.g,. H@@ $or >E', )44! hea ers, an the like. >r, you %an use a $lavor o$ execute:; that takes a Response3andler"String' as a parameter O the net result there being that execute:; returns Nust the String representation o$ the re;uest bo y. -n pra%ti%e, this is not a re%ommen e approa%h, be%ause you really shoul be %he%king your )44! response %o es $or errors. )o=ever, $or trivial appli%ations, like book e:amples, the Response3andler"String' approa%h =orks Nust $ine. (or e:ample, let6s take a look at the Ceat&er sample proNe%t. 4his implements an a%tivity that retrieves =eather ata $or your %urrent lo%ation $rom the /ational Weather #ervi%e &>AT.* this probably only =orks in the "#'. 4hat ata is %onverte into an )4ML page, =hi%h is poure into a CebMit =i get
%-7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Communicating via the 8nternet

$or isplay. Rebuil ing this emo using a +ist7iew is le$t as an e:er%ise $or the rea er. Also, sin%e this sample is relatively long, =e =ill only sho= relevant pie%es o$ the Gava %o e here in this %hapter, though you %an al=ays o=nloa the $ull sour%e $rom the CommonsWare Web site. 4o make this a bit more interesting, =e use the An roi lo%ation servi%es to $igure out =here =e are...sort o$. 4he $ull etails o$ ho= that =orks is es%ribe in the %hapter on lo%ation servi%es. -n the onResume:; metho , =e toggle on in$orme =here =e are no= an =hen &,0km'. When a lo%ation is available O movement O =e retrieve the /ational updateEorecast:; metho * lo%ation up ates, so =e =ill be =e move a signi$i%ant istan%e either at the start or base on Weather #ervi%e ata via our

private!void!update"orecast:+ocation!loc;!8 !!String!url$String.format:formatG!loc.getLatitude:;G!loc.getLongitude:;;5 !!3ttp0et!getMet&od$new!,ttpGet:url;5 !!try!8 !!!!Response3andler"String'!response3andler!$!new!Basic$esponse,andler:;5 !!!!String!response6ody$client.execute:getMet&odG!response3andler;5 !!!!!uild"orecasts:response6ody;5 !!!!String!page$generate(age:;5 !!!!browser.loadData&ithBase)$L:nullG!pageG!%text/&tml%G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%2-E-A%G!null;5 !!< !!catc&!:-&rowable!t;!8 !!!!-oast !!!!!!.makeText:t&isG!%ReJuest!failed#!%Bt.toString:;G!O@@@; !!!!!!.show:;5 !!< <

4he updateEorecast:; metho takes a +ocation as a parameter, obtaine $rom the lo%ation up ate pro%ess. (or no=, all you nee to kno= is that +ocation sports get+atitude:; an get+ongitude:; metho s that return the latitu e an longitu e o$ the evi%e6s position, respe%tively.

%-9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Communicating via the 8nternet

We hol the "RL to the /ational Weather #ervi%e DML in a string resour%e, an pour in the latitu e an longitu e at runtime. 7iven our 3ttp)lient! obNe%t %reate in on)reate:;, =e populate an 3ttp0et =ith that %ustomiMe "RL, then e:e%ute that metho . 7iven the resulting DML $rom the RI#4 servi%e, =e buil the $ore%ast )4ML page &see belo=' an pour that into the CebMit =i get. -$ the 3ttp)lient blo=s up =ith an e:%eption, =e provi e that error as a -oast.

P rsin! Responses
4he response you get =ill be $ormatte using some system O )4ML, DML, G#>/, =hatever. -t is up to you, o$ %ourse, to pi%k out =hat in$ormation you nee an o something use$ul =ith it. -n the %ase o$ the Ceat&erDemo, =e nee to e:tra%t the $ore%ast time, temperature, an i%on &in i%ating sky %on itions an pre%ipitation' an generate an )4ML page $rom it. An roi in%lu es*

4hree DML parsers* the tra itional W?C A>M &org.wIc.dom', a #AD parser &org.xml.sax', an the DML pull parser is%usse in the %hapter on resour%es A G#>/ parser &org.json'

@ou are also =el%ome to use thir 2party Gava %o e, =here possible, to han le other $ormats, su%h as a e i%ate R##UAtom parser $or a $ee rea er. 4he use o$ thir 2party Gava %o e is is%usse in a separate %hapter. (or Ceat&erDemo, =e use the W?C A>M parser in our buildEorecasts:;! metho *
void!!uild"orecasts:String!raw;!t&rows!*xception!8 !!Document6uilder!builder$Document6uilderEactory !!!!!!!!!!!!!!!!!!!!!!!!!!!.newInstance:; !!!!!!!!!!!!!!!!!!!!!!!!!!!.newDocumentBuilder:;5 !!Document!doc$builder.parse:new!InputSource:new!String$eader:raw;;;5 !!/ode+ist!times$doc.get*lementsByTag%ame:%start-valid-time%;5 !!for!:int!i$@5i"times.getLength:;5iBB;!8 !!!!*lement!time$:*lement;times.item:i;5

%$;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Communicating via the 8nternet

!!!!Eorecast!forecast$new!"orecast:;5 !!!!forecasts.add:forecast;5 !!!!forecast.setTime:time.get"irstChild:;.get%odeValue:;;5 !!< !!/ode+ist!temps$doc.get*lementsByTag%ame:%value%;5 !!for!:int!i$@5i"temps.getLength:;5iBB;!8 !!!!*lement!temp$:*lement;temps.item:i;5 !!!!Eorecast!forecast$forecasts.get:i;5 !!!!forecast.setTemp:new!Integer:temp.get"irstChild:;.get%odeValue:;;;5 !!< !!/ode+ist!icons$doc.get*lementsByTag%ame:%icon-lin %;5 !!for!:int!i$@5i"icons.getLength:;5iBB;!8 !!!!*lement!icon$:*lement;icons.item:i;5 !!!!Eorecast!forecast$forecasts.get:i;5 !!!!forecast.setIcon:icon.get"irstChild:;.get%odeValue:;;5 !!< <

4he /ational Weather #ervi%e DML $ormat is...%uriously stru%ture , relying heavily on se;uential position in lists versus the more obNe%t2oriente style you $in in $ormats like R## or Atom. 4hat being sai , =e %an take a $e= liberties an simpli$y the parsing some=hat, taking a vantage o$ the $a%t that the elements =e =ant &start-valid-time $or the $ore%ast time, value $or the temperature, an icon-lin $or the i%on "RL' are all uni;ue =ithin the o%ument. 4he )4ML %omes in as an .nputStream an is $e into the A>M parser. (rom there, =e s%an $or the start-valid-time elements an populate a set o$ Eorecast mo els using those start times. 4hen, =e $in the temperature value elements an icon-lin "RLs an $ill those in to the Eorecast obNe%ts. -n turn, the generate1age:; metho %reates a ru imentary )4ML table =ith the $ore%asts*
String!generate(age:;!8 !!String6uffer!bufResult$new!StringBuffer:%"&tml'"body'"table'%;5 !!bufResult.append:%"tr'"t&!widt&$4%L@\4%'-ime"/t&'%B !!!!!!!!!!!!!!!!!!!!%"t&'-emperature"/t&'"t&'Eorecast"/t&'"/tr'%;5

%$*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Communicating via the 8nternet

!!for!:Eorecast!forecast!#!forecasts;!8 !!!!bufResult.append:%"tr'"td!align$4%center4%'%;5 !!!!bufResult.append:forecast.getTime:;;5 !!!!bufResult.append:%"/td'"td!align$4%center4%'%;5 !!!!bufResult.append:forecast.getTemp:;;5 !!!!bufResult.append:%"/td'"td'"img!src$4%%;5 !!!!bufResult.append:forecast.getIcon:;;5 !!!!bufResult.append:%4%'"/td'"/tr'%;5 !!< !!bufResult.append:%"/table'"/body'"/&tml'%;5 !!return:bufResult.toString:;;5 <

4he result looks like this*

!igure 14< The Weather/emo sample application

Stu,, To Consider
-$ you nee to use ##L, bear in min that the e$ault 3ttp)lient setup oes not in%lu e ##L support. Mostly, this is be%ause you nee to e%i e ho= to han le ##L %erti$i%ate presentation O o you blin ly a%%ept all %erti$i%ates,

%$%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Communicating via the 8nternet

even sel$2signe or e:pire onesC >r o you =ant to ask the user i$ they really =ant to use some strange %erti$i%atesC #imilarly, 3ttp)lient, by e$ault, is esigne $or single2threa e use. -$ you =ill be using 3ttp)lient $rom a servi%e or some other pla%e =here multiple threa s might be an issue, you %an rea ily set up 3ttp)lient to support multiple threa s. (or these sorts o$ topi%s, you are best serve by %he%king out the )ttpComponents Web site $or o%umentation an support.

%$Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

PART IV Intents

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &&

Creating 8ntent !ilters

"p to no=, the $o%us o$ this book has been on a%tivities opene ire%tly by the user $rom the evi%e6s laun%her. 4his, o$ %ourse, is the most obvious %ase $or getting your a%tivity up an visible to the user. An , in many %ases it is the primary =ay the user =ill start using your appli%ation. )o=ever, remember that the An roi system is base upon lots o$ loosely2 %ouple %omponents. What you might a%%omplish in a esktop 7"- via ialog bo:es, %hil =in o=s, an the like are mostly suppose to be in epen ent a%tivities. While one a%tivity =ill be Qspe%ialQ, in that it sho=s up in the laun%her, the other a%tivities all nee to be rea%he ...someho=. 4he Qho=Q is via intents. An intent is basi%ally a message that you pass to An roi saying, Q@o9 - =ant to o...er...something9 @eah9Q )o= spe%i$i% the QsomethingQ is epen s on the situation O sometimes you kno= e:a%tly =hat you =ant to o &e.g., open up one o$ your other a%tivities', an sometimes you on6t. -n the abstra%t, An roi is all about intents an re%eivers o$ those intents. #o, no= that =e are =ell2verse in %reating a%tivities, let6s ive into intents, so =e %an %reate more %omple: appli%ations =hile simultaneously being Qgoo An roi %itiMensQ.

%$4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating 8ntent !ilters

#ome o$ the material in this %hapter is base on the author6s posts to the .uil ing 6Aroi s %olumn on An roi 7uys.%om.

WhatAs .our 8ntent:


When #ir 4im .erners2Lee %ooke up the )yperte:t 4rans$er !roto%ol O )44! O he set up a system o$ verbs plus a resses in the $orm o$ "RLs. 4he a ress in i%ate a resour%e, su%h as a Web page, graphi%, or server2si e program. 4he verb in i%ate =hat shoul be one* 7I4 to retrieve it, !>#4 to sen $orm ata to it $or pro%essing, et%. -ntents are similar, in that they represent an a%tion plus %onte:t. 4here are more a%tions an more %omponents to the %onte:t =ith An roi intents than there are =ith )44! verbs an resour%es, but the %on%ept is still the same. Gust as a Web bro=ser kno=s ho= to pro%ess a verbZ"RL pair, An roi kno=s ho= to $in a%tivities or other appli%ation logi% that =ill han le a given intent.

Pieces o, Intents
4he t=o most important pie%es o$ an intent are the a%tion an =hat An roi re$ers to as the Q ataQ. 4hese are almost e:a%tly analogous to )44! verbs an "RLs O the a%tion is the verb, an the Q ataQ is a 2ri, su%h as content#//contacts/people/? representing a %onta%t in the %onta%ts atabase. A%tions are %onstants, su%h as A)-.,/_7.*C &to bring up a vie=er $or the resour%e', A)-.,/_*D.- &to e it the resour%e', or A)-.,/_1.)M &to %hoose an available item given a 2ri representing a %olle%tion, su%h as content#//contacts/people'. -$ you =ere to %reate an intent %ombining A)-.,/_7.*C =ith a %ontent "ri o$ an pass that intent to An roi , An roi =oul kno= to $in an open an a%tivity %apable o$ vie=ing that resour%e.
content#//contacts/people/?,

%$7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating 8ntent !ilters

4here are other %riteria you %an pla%e insi e an intent &represente as an -ntent obNe%t', besi es the a%tion an Q ataQ 2ri, su%h as*

A %ategory. @our QmainQ a%tivity =ill be in the +A2/)3*R %ategory, in i%ating it shoul sho= up on the laun%her menu. >ther a%tivities =ill probably be in the D*EA2+- or A+-*R/A-.7* %ategories. A M-MI type, in i%ating the type o$ resour%e you =ant to operate on, i$ you on6t kno= a %olle%tion 2ri. A %omponent, =hi%h is to say, the %lass o$ the a%tivity that is suppose to re%eive this intent. "sing %omponents this =ay obviates the nee $or the other properties o$ the intent. )o=ever, it oes make the intent more $ragile, as it assumes spe%i$i% implementations. QI:trasQ, =hi%h is a 6undle o$ other in$ormation you =ant to pass along to the re%eiver =ith the intent, that the re%eiver might =ant to take a vantage o$. What pie%es o$ in$ormation a given re%eiver %an use is up to the re%eiver an &hope$ully' is =ell2 o%umente .

@ou =ill $in rosters o$ the stan ar a%tions an %ategories in the An roi #AE o%umentation $or the .ntent %lass.

Intent Routin!
As note above, i$ you spe%i$y the target %omponent in your intent, An roi has no oubt =here the intent is suppose to be route to O it =ill laun%h the name a%tivity. 4his might be >E i$ the target intent is in your appli%ation. -t e$initely is not re%ommen e $or sen ing intents to other appli%ations. Component names, by an large, are %onsi ere private to the appli%ation an are subNe%t to %hange. Content 2ri templates an M-MI types are the pre$erre =ays o$ i enti$ying servi%es you =ish thir 2party %o e to supply. -$ you o not spe%i$y the target %omponent, then An roi has to $igure out =hat a%tivities &or other intent re%eivers' are eligible to re%eive the intent. /ote the use o$ the plural Qa%tivitiesQ, as a broa ly2=ritten intent might =ell resolve to several a%tivities. 4hat is the...ummm...intent &par on the pun', as
%$9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating 8ntent !ilters

you =ill see later in this %hapter. 4his routing approa%h is re$erre impli%it routing.

to as

.asi%ally, there are three rules, all o$ =hi%h must be true $or a given a%tivity to be eligible $or a given intent* ,. 4he a%tivity must support the spe%i$ie a%tion

2. 4he a%tivity must support the state M-MI type &i$ supplie ' ?. 4he a%tivity must support all o$ the %ategories name in the intent 4he upshot is that you =ant to make your intents spe%i$i% enough to $in the right re%eiver&s', an no more spe%i$i% than that. 4his =ill be%ome %learer as =e =ork through some e:amples later in this %hapter.

Stating .our 8ntent#ions&


All An roi %omponents that =ish to be noti$ie via intents must e%lare intent $ilters, so An roi kno=s =hi%h intents shoul go to that %omponent. 4o o this, you nee to a intent-filter elements to your AndroidManifest.xml $ile. All o$ the e:ample proNe%ts have intent $ilters e$ine , %ourtesy o$ the An roi appli%ation2buil ing s%ript &activity)reator.py or the -AI e;uivalent'. 4hey look something like this*
"manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!pac age$%com.commonsware.android.s eleton%' !!!!"application' !!!!!!!!"activity!android#name$%./ow%!android#label$%/ow%' !!!!!!!!!!!!"intent-filter' !!!!!!!!!!!!!!!!"action!android#name$%android.intent.action.MA./%!/' !!!!!!!!!!!!!!!!"category!android#name$%android.intent.category.+A2/)3*R%!/' !!!!!!!!!!!!"/intent-filter' !!!!!!!!"/activity' !!!!"/application' "/manifest'

%0;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating 8ntent !ilters

/ote the intent-filter element un er the a%tivity element. )ere, =e e%lare that this a%tivity*

-s the main a%tivity $or this appli%ation -t is in the +A2/)3*R %ategory, meaning it gets an i%on in the An roi main menu

.e%ause this a%tivity is the main one $or the appli%ation, An roi kno=s this is the %omponent it shoul laun%h =hen somebo y %hooses the appli%ation $rom the main menu. 4he intent $ilter also has a label & android#label!$!%)onsActivity%'. -n this %ase, this %ontrols the name asso%iate =ith the appli%ation6s i%on in the main menu. @ou are =el%ome to have more than one a%tion or more than one %ategory in your intent $ilters. 4hat in i%ates that the asso%iate %omponent &e.g., a%tivity' han les multiple i$$erent sorts o$ intents. More than likely, you =ill also =ant to have your se%on ary &non2MA./' a%tivities spe%i$y the M-MI type o$ ata they =ork on. 4hen, i$ an intent is targete $or that M-MI type O either ire%tly, or in ire%tly by the 2ri! re$eren%ing something o$ that type O An roi =ill kno= that the %omponent han les su%h ata. (or e:ample, you %oul have an a%tivity e%lare like this*
"activity!android#name$%.-our7iewActivity%' !!"intent-filter' !!!!"action!android#name$%android.intent.action.7.*C%!/' !!!!"category!android#name$%android.intent.category.D*EA2+-%!/' !!!!"data!android#mime-ype$%vnd.android.cursor.item/vnd.commonsware.tour%!/' !!"/intent-filter' "/activity'

4his a%tivity =ill get laun%he by an intent re;uesting to vie= a 2ri! representing a vnd.android.cursor.item/vnd.commonsware.tour pie%e o$ %ontent. 4hat intent %oul %ome $rom another a%tivity in the same appli%ation &e.g., the MA-/ a%tivity $or this appli%ation' or $rom another
%0*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating 8ntent !ilters

a%tivity in another An roi appli%ation that happens to kno= a 2ri that this a%tivity han les.

5arro) 3eceivers
-n the e:amples sho=n above, the intent $ilters =ere set up on a%tivities. #ometimes, tying intents to a%tivities is not e:a%tly =hat =e =ant*

#ome system events might %ause us to =ant to trigger something in a servi%e rather than an a%tivity #ome events might nee to laun%h i$$erent a%tivities in i$$erent %ir%umstan%es, =here the %riteria are not solely base on the intent itsel$, but some other state &e.g., i$ =e get intent D an the atabase has a @, then laun%h a%tivity MP i$ the atabase oes not have a @, then laun%h a%tivity /'

(or these %ases, An roi o$$ers the intent re%eiver, e$ine as a %lass implementing the 6roadcastReceiver inter$a%e. -ntent re%eivers are isposable obNe%ts esigne to re%eive intents O parti%ularly broa %ast intents O an take a%tion, typi%ally involving laun%hing other intents to trigger logi% in an a%tivity, servi%e, or other %omponent. 4he 6roadcastReceiver inter$a%e has only one metho * onReceive:;. -ntent re%eivers implement that metho , =here they o =hatever it is they =ish to o upon an in%oming intent. 4o e%lare an intent re%eiver, a an re%eiver element to your AndroidManifest.xml $ile*
"receiver!android#name$%.My.ntentReceiver)lass/ame%!/'

An intent re%eiver is only alive $or as long as it takes to pro%ess onReceive:; O as soon as that metho returns, the re%eiver instan%e is subNe%t to garbage %olle%tion an =ill not be reuse . 4his means intent re%eivers are some=hat limite in =hat they %an o, mostly to avoi anything that involves any sort o$ %allba%k. (or e:ample, they %annot bin to a servi%e, an they %annot open a ialog bo:.

%0%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating 8ntent !ilters

4he e:%eption is i$ the 6roadcastReceiver is implemente on some longer2 live %omponent, su%h as an a%tivity or servi%e O in that %ase, the intent re%eiver lives as long as its QhostQ oes &e.g., until the a%tivity is $roMen'. )o=ever, in this %ase, you %annot e%lare the intent re%eiver via AndroidManifest.xml. -nstea , you nee to %all registerReceiver:; on your Activity6s onResume:; %allba%k to e%lare interest in an intent, then %all unregisterReceiver:; $rom your Activity6s on1ause:; =hen you no longer nee those intents.

The Pause Caveat


4here is one hi%%up =ith using -ntent obNe%ts to pass arbitrary messages aroun * it only =orks =hen the re%eiver is a%tive. 4o ;uote $rom the o%umentation $or 6roadcastReceiver* If registering a receiver in your !ctivity.on"esume#$ imple mentation, you should unregister it in !ctivity.on%ause#$. #&ou won't receive intents when paused, and this will cut down on unnecessary system overhead$. (o not unregister in !ctivity.onSaveInstanceState#$, because this won't be called if the user moves back in the history stack. )en%e, you %an only really use the -ntent $rame=ork as an arbitrary message bus i$*

@our re%eiver oes not %are i$ it misses messages be%ause it =as not a%tive, or @ou provi e some means o$ getting the re%eiver Q%aught upQ on messages it misse =hile it =as ina%tive

-n the %hapters on %reating an using servi%es, you =ill see an e:ample o$ the $ormer %on ition, =here the re%eiver &servi%e %lient' =ill use .ntent2 base messages =hen they are available but oes not nee them i$ the %lient is not a%tive.

%0Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &'

aunching (ctivities and Sub" (ctivities

As is%usse previously, the theory behin the An roi "- ar%hite%ture is that evelopers shoul e%ompose their appli%ation into istin%t a%tivities, ea%h implemente as an Activity, ea%h rea%hable via intents, =ith one QmainQ a%tivity being the one laun%he by the An roi laun%her. (or e:ample, a %alen ar appli%ation %oul have a%tivities $or vie=ing the %alen ar, vie=ing a single event, e iting an event &in%lu ing a ing a ne= one', an so $orth. 4his, o$ %ourse, implies that one o$ your a%tivities has the means to start up another a%tivity. (or e:ample, i$ somebo y %li%ks on an event $rom the vie=2 %alen ar a%tivity, you might =ant to sho= the vie=2event a%tivity $or that event. 4his means that, someho=, you nee to be able to %ause the vie=2 event a%tivity to laun%h an sho= a spe%i$i% event &the one the user %li%ke upon'. 4his %an be $urther broken o=n into t=o s%enarios* ,. @ou kno= =hat a%tivity you =ant to laun%h, probably be%ause it is another a%tivity in your o=n appli%ation

2. @ou have a %ontent 2ri to...something, an you =ant your users to be able to o...something =ith it, but you o not kno= up $ront =hat the options are

%00
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

aunching (ctivities and Sub"(ctivities

4his %hapter %overs the $irst s%enarioP the ne:t %hapter han les the se%on .

Peers and Subs


>ne key ;uestion you nee to ans=er =hen you e%i e to laun%h an a%tivity is* oes your a%tivity nee to kno= =hen the laun%he a%tivity en sC (or e:ample, suppose you =ant to spa=n an a%tivity to %olle%t authenti%ation in$ormation $or some Web servi%e you are %onne%ting to O maybe you nee to authenti%ate =ith >pen-A in or er to use an >Auth servi%e. -n this %ase, your main a%tivity =ill nee to kno= =hen the authenti%ation is %omplete so it %an start to use the Web servi%e. >n the other han , imagine an email appli%ation in An roi . When the user ele%ts to vie= an atta%hment, neither you nor the user ne%essarily e:pe%t the main a%tivity to kno= =hen the user is one vie=ing that atta%hment. -n the $irst s%enario, the laun%he a%tivity is %learly subor inate to the laun%hing a%tivity. -n that %ase, you probably =ant to laun%h the %hil as a sub2a%tivity, =hi%h means your a%tivity =ill be noti$ie =hen the %hil a%tivity is %omplete. -n the se%on s%enario, the laun%he a%tivity is more a peer o$ your a%tivity, so you probably =ant to laun%h the 5%hil 8 Nust as a regular a%tivity. @our a%tivity =ill not be in$orme =hen the 5%hil 8 is one, but, then again, your a%tivity really oesn6t nee to kno=.

Start AEm >p


4he t=o pie%es $or starting an a%tivity are an intent an your %hoi%e o$ ho= to start it up.

%01
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

aunching (ctivities and Sub"(ctivities

% $e n Intent
As is%usse in a previous %hapter, intents en%apsulate a re;uest, ma e to An roi , $or some a%tivity or other intent re%eiver to o something. -$ the a%tivity you inten to laun%h is one o$ your o=n, you may $in it simplest to %reate an e:pli%it intent, naming the %omponent you =ish to laun%h. (or e:ample, $rom =ithin your a%tivity, you %oul %reate an intent like this*
new!Intent:t&isG!3elpActivity.class;5

4his =oul stipulate that you =ante to laun%h the 3elpActivity. 4his a%tivity =oul nee to be name in your AndroidManifest.xml $ile, though not ne%essarily =ith any intent $ilter, sin%e you are trying to re;uest it ire%tly. >r, you %oul put together an intent $or some 2ri, re;uesting a parti%ular a%tion*
2ri!uri$2ri.parse:%geo#%Blat.toString:;B%G%Blon.toString:;;5 .ntent!i$new!Intent:.ntent.A)-.,/_7.*CG!uri;5

)ere, given that =e have the latitu e an longitu e o$ some position &lat! an lon, respe%tively' o$ type Double, =e %onstru%t a geo s%heme 2ri an %reate an intent re;uesting to vie= this 2ri &A)-.,/_7.*C'.

% $e the C ll
>n%e you have your intent, you nee to pass it to An roi an get the %hil a%tivity to laun%h. @ou have $our %hoi%es* ,. 4he simplest option is to %all startActivity:; =ith the intent O this =ill %ause An roi to $in the best2mat%h a%tivity or intent re%eiver an pass the intent to it $or han ling. @our a%tivity =ill not be in$orme =hen the 5%hil 8 a%tivity is %omplete.

%04
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

aunching (ctivities and Sub"(ctivities

2. @ou %an %all startSubActivity:;, passing it the intent an a number &uni;ue to the %alling a%tivity'. An roi =ill $in the best2mat%h han ler an pass the intent over to it. )o=ever, your a%tivity =ill be noti$ie =hen the %hil a%tivity is %omplete via the onActivityResult:; %allba%k &see belo='. ?. @ou %an %all broadcast.ntent:;. -n this %ase, An roi =ill pass the intent to all registere a%tivities an intent re%eivers that %oul possibly =ant this intent, not Nust the best mat%h. <. @ou %an %all broadcast.ntentSeriali(ed:;. )ere, An roi =ill pass the intent to all %an i ate a%tivities an intent re%eivers one at a time O i$ any one 5%onsumes8 the intent, the rest o$ the %an i ates are not noti$ie . Most o$ the time, you =ill =in up using startActivity:; or startSubActivity:; O broa %ast intents are more typi%ally raise by the An roi system itsel$. With
startSubActivity:;, onActivityResult:; %allba%k

as note , you %an implement the to be noti$ie =hen the %hil a%tivity has %omplete its =ork. 4he %allba%k re%eives the uni;ue number supplie to startSubActivity:;, so you %an etermine =hi%h %hil a%tivity is the one that has %omplete . @ou also get*

A result %o e, $rom the %hil a%tivity %alling setResult:;. 4ypi%ally this is R*S2+-_,M or R*S2+-_)A/)*++*D, though you %an %reate your o=n return %o es &pi%k a number starting =ith R*S2+-_E.RS-_2S*R' An optional String %ontaining some result ata, possibly a "RL to some internal or e:ternal resour%e O $or e:ample, a A)-.,/_1.)M! intent typi%ally returns the sele%te bit o$ %ontent via this ata string An optional 6undle %ontaining a result %o e an ata string itional in$ormation beyon the

4o emonstrate laun%hing a peer a%tivity, take a peek at the +aunc& sample appli%ation. 4he DML layout is $airly straight$or=ar * t=o $iel s $or the latitu e an longitu e, plus a button*

%07
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

aunching (ctivities and Sub"(ctivities

">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"-able+ayout !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content% !!!!android#stretc&)olumns$%?GH% !!' !!!!"-ableRow' !!!!!!"-ext7iew !!!!!!!!android#layout_widt&$%wrap_content%! !!!!!!!!android#layout_&eig&t$%wrap_content% !!!!!!!!android#padding+eft$%Hdip% !!!!!!!!android#paddingRig&t$%Odip% !!!!!!!!android#text$%+ocation#% !!!!!!/' !!!!!!"*dit-ext!android#id$%9Bid/lat% !!!!!!!!android#layout_widt&$%fill_parent%! !!!!!!!!android#layout_&eig&t$%wrap_content% !!!!!!!!android#cursor7isible$%true% !!!!!!!!android#editable$%true% !!!!!!!!android#single+ine$%true% !!!!!!!!android#layout_weig&t$%?% !!!!!!/' !!!!!!"*dit-ext!android#id$%9Bid/lon% !!!!!!!!android#layout_widt&$%fill_parent%! !!!!!!!!android#layout_&eig&t$%wrap_content% !!!!!!!!android#cursor7isible$%true% !!!!!!!!android#editable$%true% !!!!!!!!android#single+ine$%true% !!!!!!!!android#layout_weig&t$%?% !!!!!!/' !!!!"/-ableRow' !!"/-able+ayout' !!"6utton!android#id$%9Bid/map% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content% !!!!android#text$%S&ow!MeX% !!/' "/+inear+ayout'

4he button6s ,n)lic +istener simply takes the latitu e an longitu e, pours them into a geo s%heme 2ri, then starts the a%tivity.
pac age!com.commonsware.android.activities5 import!android.app.Activity5 import!android.content..ntent5 import!android.net.2ri5

%09
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

aunching (ctivities and Sub"(ctivities

import!android.os.6undle5 import!android.view.7iew5 import!android.widget.6utton5 import!android.widget.*dit-ext5 public!class!+aunc&Demo!extends!Activity!8 !!private!*dit-ext!lat5 !!private!*dit-ext!lon5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!! !!!!6utton!btn$:6utton;findViewById:R.id.map;5 !!!!lat$:*dit-ext;findViewById:R.id.lat;5 !!!!lon$:*dit-ext;findViewById:R.id.lon;5 !!!! !!!!btn.setOnClickListener:new!7iew.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!view;!8 !!!!!!!!String!_lat$lat.getText:;.toString:;5 !!!!!!!!String!_lon$lon.getText:;.toString:;5 !!!!!!!!2ri!uri$2ri.parse:%geo#%B_latB%G%B_lon;5 !!!!!!!! !!!!!!!!start#cti ity:new!Intent:.ntent.A)-.,/_7.*CG!uri;;5 !!!!!!< !!!!<;5 !!< <

4he a%tivity is not mu%h to look at*

%1;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

aunching (ctivities and Sub"(ctivities

!igure 17< The aunch/emo sample application6 )ith a location filled in

-$ you $ill in a lo%ation &e.g., ?8.880, latitu e an 211.0<02 longitu e' an %li%k the button, the resulting map is more interesting. /ote that this is the built2in An roi map a%tivity O =e i not %reate our o=n a%tivity to isplay this map.

%1*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

aunching (ctivities and Sub"(ctivities

!igure 19< The map launched by aunch /emo6 sho)ing the incoln +emorial in Washington /C

-n a later %hapter, you =ill see ho= you %an %reate maps in your o=n a%tivities, in %ase you nee greater %ontrol over ho= the map is isplaye .

%1%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &(

!inding (vailable (ctions via 8ntrospection

#ometimes, you kno= Nust =hat you =ant to o, su%h as isplay one o$ your other a%tivities. #ometimes, you have a pretty goo i ea o$ =hat you =ant to o, su%h as vie= the %ontent represente by a 2ri, or have the user pi%k a pie%e o$ %ontent o$ some M-MI type. #ometimes, you6re lost. All you have is a %ontent 2ri, an you on6t really kno= =hat you %an o =ith it. (or e:ample, suppose you =ere %reating a %ommon tagging subsystem $or An roi , =here users %oul tag pie%es o$ %ontent O %onta%ts, Web "RLs, geographi% lo%ations, et%. @our subsystem =oul hol onto the 2ri o$ the %ontent plus the asso%iate tags, so other subsystems %oul , say, ask $or all pie%es o$ %ontent re$eren%ing some tag. 4hat6s all =ell an goo . )o=ever, you probably nee some sort o$ maintenan%e a%tivity, =here users %oul vie= all their tags an the pie%es o$ %ontent so tagge . 4his might even serve as a ;uasi2bookmark servi%e $or items on their phone. 4he problem is, the user is going to e:pe%t to be able to o use$ul things =ith the %ontent they $in in your subsystem, su%h as ial a %onta%t or sho= a map $or a lo%ation.

%1Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

!inding (vailable (ctions via 8ntrospection

4he problem is, you have absolutely no i ea =hat is all possible =ith any given %ontent 2ri. @ou probably %an vie= any o$ them, but %an you e it themC Can you ial themC #in%e ne= appli%ations =ith ne= types o$ %ontent %oul be a e by any user at any time, you %an6t even assume you kno= all possible %ombinations Nust by looking at the sto%k appli%ations shippe on all An roi evi%es. (ortunately, the An roi evelopers thought o$ this.

An roi o$$ers various means by =hi%h you %an present to your users a set o$ likely a%tivities to spa=n $or a given %ontent 2ri...even i$ you have no i ea =hat that %ontent 2ri really represents. 4his %hapter e:plores some o$ these 2ri a%tion introspe%tion tools.

Pick AEm
#ometimes, you kno= your %ontent 2ri represents a %olle%tion o$ some type, su%h as content#//contacts/people representing the list o$ %onta%ts in the sto%k An roi %onta%ts list. -n this %ase, you %an let the user pi%k a %onta%t that your a%tivity %an then use &e.g., tag it, ial it'. 4o o this, you nee to %reate an intent $or the A)-.,/_1.)M on the target 2ri, then start a sub a%tivity &via startSubActivity:;' to allo= the user to pi%k a pie%e o$ %ontent o$ the spe%i$ie type. -$ your onActivityResult:; %allba%k $or this re;uest gets a R*S2+-_,M result %o e, your ata string %an be parse into a 2ri representing the %hosen pie%e o$ %ontent. (or e:ample, take a look at 1ic in the sample appli%ations. 4his a%tivity gives you a $iel $or a %olle%tion 2ri &=ith content#//contacts/people pre2 $ille in $or your %onvenien%e', plus a really big 57imme98 button*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent% !!' !!"*dit-ext!android#id$%9Bid/type%

%1$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

!inding (vailable (ctions via 8ntrospection

!!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content% !!!!android#cursor7isible$%true% !!!!android#editable$%true% !!!!android#single+ine$%true% !!!!android#text$%content#//contacts/people% !!/' !!"6utton !!!!android#id$%9Bid/pic % !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent% !!!!android#text$%0immeX% !!!!android#layout_weig&t$%?% !!/' "/+inear+ayout'

"pon being %li%ke , the button %reates the A)-.,/_1.)M on the user2supplie %olle%tion 2ri an starts the sub2a%tivity. When that sub2a%tivity %ompletes =ith R*S2+-_,M, the A)-.,/_7.*C is invoke on the resulting %ontent 2ri.
public!class!1ic Demo!extends!Activity!8 !!static!final!int!1.)M_R*T2*S-$?IIV5 !!private!*dit-ext!type5 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!type$:*dit-ext;findViewById:R.id.type;5 !!!! !!!!6utton!btn$:6utton;findViewById:R.id.pic ;5 !!!! !!!!btn.setOnClickListener:new!7iew.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!view;!8 !!!!!!!!.ntent!i$new!Intent:.ntent.A)-.,/_1.)MG !!!!!!!!!!!!!!!!!!!!2ri.parse:type.getText:;.toString:;;;5 !!!!!!!!start#cti ity"or$esult:iG!1.)M_R*T2*S-;5 !!!!!!< !!!!<;5 !!< !!9,verride !!protected!void!on#cti ity$esult:int!reJuest)odeG!int!result)odeG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!.ntent!data;!8 !!!!if!:reJuest)ode$$1.)M_R*T2*S-;!8 !!!!!!if!:result)ode$$R*S2+-_,M;!8 !!!!!!!!!!start#cti ity:new!Intent:.ntent.A)-.,/_7.*CG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!data.getData:;;;5 !!!!!!< !!!!<

%10
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

!inding (vailable (ctions via 8ntrospection

!!< <

4he result* the user %hooses a %olle%tion, pi%ks a pie%e o$ %ontent, an vie=s it.

!igure 4;< The Pick/emo sample application6 as initially launched

%11
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

!inding (vailable (ctions via 8ntrospection

!igure 4*< The same application6 after clicking the ='imme!= button6 sho)ing the list of available people

!igure 4%< ( vie) of a contact6 launched by Pick/emo after choosing one of the people from the pick list

%14
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

!inding (vailable (ctions via 8ntrospection

>ne $la= in this appli%ation is that it may not have permission to vie= =hatever %ontent %olle%tion the user entere . (or the sample, =e ha to spe%i$i%ally re;uest permission to rea the user6s %onta%ts, via a uses2 permission element in AndroidManifest.xml. We6ll %over more about re;uesting &an re;uiring' permissions later in this book.

Would .ou ike to See the +enu:


Another =ay to give the user =ays to take a%tions on a pie%e o$ %ontent, =ithout you kno=ing =hat a%tions are possible, is to inNe%t a set o$ menu %hoi%es into the options menu via add.ntent,ptions:;. 4his metho , available on Menu, takes an .ntent an other parameters an $ills in a set o$ menu %hoi%es on the Menu instan%e, ea%h representing one possible a%tion. Choosing one o$ those menu %hoi%es spa=ns the asso%iate a%tivity. 4he %anoni%al e:ample o$ using add.ntent,ptions:; illustrates another $lavor o$ having a pie%e o$ %ontent an not kno=ing the a%tions that %an be taken. -n the previous e:ample, sho=ing ActivityAdapter, the %ontent =as $rom some other An roi appli%ation, an =e kno= nothing about it. -t is also possible, though, that =e kno= $ull =ell =hat the %ontent is O it6s ours. )o=ever, An roi appli%ations are per$e%tly %apable o$ a ing ne= a%tions to e:isting %ontent types, so even though you =rote your appli%ation an kno= =hat you e:pe%t to be one =ith your %ontent, there may be other options you are una=are o$ that are available to users. (or e:ample, imagine the tagging subsystem mentione in the intro u%tion to this %hapter. -t =oul be very annoying to users i$, every time they =ante to tag a pie%e o$ %ontent, they ha to go to a separate tagging tool, then turn aroun an pi%k the %ontent they Nust ha been =orking on &i$ that is even te%hni%ally possible' be$ore asso%iating tags =ith it. -nstea , they =oul probably pre$er a menu %hoi%e in the %ontent6s o=n 5home8 a%tivity =here they %an in i%ate they =ant to tag it, =hi%h lea s them to the set2a2tag a%tivity an tells that a%tivity =hat %ontent shoul get tagge . 4o a%%omplish this, the tagging subsystem shoul set up an intent $ilter, supporting any pie%e o$ %ontent, =ith their o=n a%tion &e.g., A)-.,/_-A0' an
%17
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

!inding (vailable (ctions via 8ntrospection

a %ategory o$ A+-*R/A-*_)A-*0,RF. 4he %ategory A+-*R/A-*_)A-*0,RF is the %onvention $or one appli%ation a ing a%tions to another appli%ation6s %ontent. -$ you =ant to =rite a%tivities that are a=are o$ possible a 2ons like tagging, you shoul use add.ntent,ptions:; to a those a 2ons6 a%tions to your options menu, su%h as the $ollo=ing*
.ntent!intent!$!new!Intent:nullG!my)ontent2ri;5 intent.addCategory:.ntent.A+-*R/A-.7*_)A-*0,RF;5 menu.addIntentOptions:Menu.A+-*R/A-.7*G!@G !!!!!!!!!!!!!!!!!!!!!new!Component%ame:t&isG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!MyActivity.class;G !!!!!!!!!!!!!!!!!!!!!nullG!intentG!@G!null;5

)ere, my)ontent2ri is the %ontent 2ri o$ =hatever is being vie=e by the user in this a%tivity, MyActivity is the name o$ the a%tivity %lass, an menu is the menu being mo i$ie . -n this %ase, the .ntent =e are using to pi%k a%tions $rom re;uires that appropriate intent re%eivers support the A+-*R/A-.7*_)A-*0,RF. 4hen, =e a the options to the menu =ith add.ntent,ptions:; an the $ollo=ing parameters*

4he sort position $or this set o$ menu %hoi%es, typi%ally set to @! &appear in the or er a e to the menu' or A+-*R/A-.7* &appear a$ter other menu %hoi%es' A uni;ue number $or this set o$ menu %hoi%es, or @ i$ you o not nee a number A )omponent/ame instan%e representing the a%tivity that is populating its menu O this is use to $ilter out the a%tivity6s o=n a%tions, so the a%tivity %an han le its o=n a%tions as it sees $it An array o$ .ntent instan%es that are the 5spe%i$i%8 mat%hes O any a%tions mat%hing those intents are sho=n $irst in the menu be$ore any other possible a%tions 4he .ntent $or =hi%h you =ant the available a%tions

%19
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

!inding (vailable (ctions via 8ntrospection

A set o$ $lags. 4he only one o$ likely relevan%e is represente as MA-)3_D*EA2+-_,/+F, =hi%h means mat%hing a%tions must also implement the D*EA2+-_)A-*0,RF %ategory. -$ you o not nee this, use a value o$ @ $or the $lags. An array o$ Menu..tem, =hi%h =ill hol the menu items mat%hing the array o$ .ntent instan%es supplie as the 5spe%i$i%s8, or null i$ you o not nee those items &or are not using 5spe%i$i%s8'

(sking (round
the ActivityAdapter $amily an add.ntent,ptions:; use Juery.ntentActivity,ptions:; $or the 5heavy li$ting8 o$ $in ing possible a%tions. 4he Juery.ntentActivity,ptions:; metho is implemente on 1ac ageManager, =hi%h is available to your a%tivity via get1ac ageManager:;. 4he Juery.ntentActivity,ptions:; metho takes some o$ the same parameters as oes add.ntent,ptions:;, notably the %aller )omponent/ame, the 5spe%i$i%s8 array o$ .ntent instan%es, the overall .ntent representing the a%tions you are seeking, an the set o$ $lags. -t returns a +ist o$ .ntent! instan%es mat%hing the state %riteria, =ith the 5spe%i$i%s8 ones $irst. -$ you =oul like to o$$er alternative a%tions to users, but by means other add.ntent,ptions:;, you %oul %all Juery.ntentActivity,ptions:;, get the .ntent instan%es, then use them to populate some other user inter$a%e &e.g., a toolbar'. .oth

%4;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

PART V Content Providers and Services

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &)

>sing a Content Provider

Any 2ri in An roi that begins =ith the content#// s%heme represents a resour%e serve up by a %ontent provi er. Content provi ers o$$er ata en%apsulation using 2ri instan%es as han les O you neither kno= nor %are =here the ata represente by the 2ri %omes $rom, so long as it is available to you =hen nee e . 4he ata %oul be store in a #HLite atabase, or in $lat $iles, or retrieve o$$ a evi%e, or be store on some $ar2o$$ server a%%esse over the -nternet. 7iven a 2ri, you %an per$orm basi% CR"A &%reate, rea , up ate, elete' operations using a %ontent provi er. 2ri instan%es %an represent either %olle%tions or in ivi ual pie%es o$ %ontent. 7iven a %olle%tion 2ri, you %an %reate ne= pie%es o$ %ontent via insert operations. 7iven an instan%e 2ri, you %an rea ata represente by the 2ri, up ate that ata, or elete the instan%e outright. An roi lets you use e:isting %ontent provi ers, plus %reate your o=n. 4his %hapter %overs using %ontent provi ersP the ne:t %hapter =ill e:plain ho= you %an serve up your o=n ata using the %ontent provi er $rame=ork.

Pieces of +e
4he simpli$ie mo el o$ the %onstru%tion o$ a %ontent 2ri is the s%heme, the namespa%e o$ ata, an , optionally, the instan%e i enti$ier, all separate by

%4Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing a Content Provider

slashes in "RL2style notation. 4he s%heme o$ a %ontent "ri is al=ays content#//. #o, a %ontent 2ri o$ content#//constants/L represents the %onstants instan%e =ith an i enti$ier o$ L. 4he %ombination o$ the s%heme an the namespa%e is kno=n as the 5base "ri8 o$ a %ontent provi er, or a set o$ ata supporte by a %ontent provi er. -n the e:ample above, content#//constants is the base 2ri $or a %ontent provi er that serves up in$ormation about 5%onstants8 &in this %ase, physi%al %onstants'. 4he base 2ri %an be more %ompli%ate . (or e:ample, the base 2ri $or %onta%ts is content#//contacts/people, as the %onta%ts %ontent provi er may serve up other ata using other base 2ri values. 4he base 2ri represents a %olle%tion o$ instan%es. 4he base 2ri %ombine =ith an instan%e i enti$ier &e.g., B' represents a single instan%e. Most o$ the An roi A!-s e:pe%t these to be 2ri obNe%ts, though in %ommon is%ussion, it is simpler to think o$ them as strings. 4he 2ri.parse:; stati% metho %reates a 2ri out o$ the string representation.

'etting a Dandle
#o, =here o these 2ri instan%es %ome $romC 4he most popular starting point, i$ you kno= the type o$ ata you =ant to =ork =ith, is to get the base 2ri $rom the %ontent provi er itsel$ in %o e. (or e:ample, android.provider.),/-*/-_2R. is the base 2ri $or %onta%ts represente as people O this maps to content#//contacts/people. -$ you Nust nee the %olle%tion, this 2ri =orks as2isP i$ you nee an instan%e an kno= its i enti$ier, you %an %all add.d:; on the 2ri to inNe%t it, so you have a 2ri $or the instan%e.

%4$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing a Content Provider

@ou might also get 2ri instan%es han e to you $rom other sour%es. -n the pre%e ing %hapter, =e sa= ho= you got 2ri han les $or %onta%ts via sub2 a%tivities respon ing to A)-.,/_1.)M intents. -n this %ase, the 2ri is truly an opa;ue han le...unless you e%i e to pi%k it apart using the various getters on the 2ri %lass. @ou %an also har 2=ire literal String obNe%ts an %onvert them into 2ri! instan%es via 2ri.parse:;. (or e:ample, in the pre%e ing %hapter, the sample %o e use an *dit7iew =ith content#//contacts/people pre2$ille in. 4his isn6t an i eal solution, as the base 2ri values %oul %on%eivably %hange over time.

+akinA Gueries
7iven a base 2ri, you %an run a ;uery to return ata out o$ the %ontent provi er relate to that 2ri. 4his has mu%h o$ the $eel o$ #HL* you spe%i$y the 5%olumns8 to return, the %onstraints to etermine =hi%h 5ro=s8 to return, a sort or er, et%. 4he i$$eren%e is that this re;uest is being ma e o$ a %ontent provi er, not ire%tly o$ some atabase &e.g., #HLite'. 4he ne:us o$ this is the managedTuery:; metho available to your a%tivity. 4his metho takes $ive parameters* ,. 4he base 2ri o$ the %ontent provi er to ;uery, or the instan%e 2ri o$ a spe%i$i% obNe%t to ;uery

2. An array o$ properties o$ instan%es $rom that %ontent provi er that you =ant returne by the ;uery ?. A %onstraint statement, $un%tioning like a #HL C3*R* %lause <. An optional set o$ parameters to bin repla%ing any > that appear there into the %onstraint %lause,

B. An optional sort statement, $un%tioning like a #HL ,RD*R!6F %lause 4his metho returns a )ursor obNe%t, =hi%h you %an use to retrieve the ata returne by the ;uery.

%40
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing a Content Provider

5!roperties8 is to %ontent provi ers as %olumns are to atabases. -n other =or s, ea%h instan%e &ro=' returne by a ;uery %onsists o$ a set o$ properties &%olumns', ea%h representing some pie%e o$ ata. 4his =ill hope$ully make more sense given an e:ample. >ur %ontent provi er e:amples %ome $rom the Constants sample appli%ation, spe%i$i%ally the )onstants6rowser %lass*
constants)ursor$managed/uery:1rovider.)onstants.),/-*/-_2R.G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!1R,=*)-.,/G!nullG!nullG!null;5

-n the %all to managedTuery:;, =e provi e*

4he 2ri passe into the a%tivity by the %aller &),/-*/-_2R.', in this %ase representing the %olle%tion o$ physi%al %onstants manage by the %ontent provi er A list o$ properties to retrieve &see %o e belo=' 4hree null values, in i%ating that =e o not nee a %onstraint %lause &the 2ri represents the instan%e =e nee ', nor parameters $or the %onstraint, nor a sort or er &=e shoul only get one entry ba%k'

private!static!final!StringPQ!1R,=*)-.,/!$!new!StringPQ!8 !!!!1rovider.)onstants._.DG!1rovider.)onstants.-.-+*G !!!!1rovider.)onstants.7A+2*<5

4he biggest 5magi%8 here is the list o$ properties. 4he lineup o$ =hat properties are possible $or a given %ontent provi er shoul be provi e by the o%umentation &or sour%e %o e' $or the %ontent provi er itsel$. -n this %ase, =e e$ine logi%al values on the 1rovider %ontent provi er implementation %lass that represent the various properties &namely, the uni;ue i enti$ier, the isplay name or title, an the value o$ the %onstant'.

%41
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing a Content Provider

(dapting to the Circumstances


/o= that =e have a )ursor via managedTuery:;, =e have a%%ess to the ;uery results an %an o =hatever =e =ant =ith them. @ou might, $or e:ample, manually e:tra%t ata $rom the )ursor to populate =i gets or other obNe%ts. )o=ever, i$ the goal o$ the ;uery =as to return a list $rom =hi%h the user shoul %hoose an item, you probably shoul %onsi er using Simple)ursorAdapter. 4his %lass bri ges bet=een the )ursor an a sele%tion =i get, su%h as a +ist7iew or Spinner. !our the )ursor into a Simple)ursorAdapter, han the a apter o$$ to the =i get, an you6re set O your =i get =ill sho= the available options. (or e:ample, here is the on)reate:; metho $rom )onstants6rowser, =hi%h gives the user a list o$ physi%al %onstants*
9,verride public!void!onCreate:6undle!saved.nstanceState;!8 !!super.onCreate:saved.nstanceState;5 !!constants)ursor$managed/uery:1rovider.)onstants.),/-*/-_2R.G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1R,=*)-.,/G!nullG!nullG!null;5 !!+istAdapter!adapter$new!SimpleCursor#dapter:t&isG !!!!!!!!!!!!!!!!!!!!!!!R.layout.rowG!constants)ursorG !!!!!!!!!!!!!!!!!!!!!!!new!StringPQ!81rovider.)onstants.-.-+*G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1rovider.)onstants.7A+2*<G !!!!!!!!!!!!!!!!!!!!!!!new!intPQ!8R.id.titleG!R.id.value<;5 !!setList#dapter:adapter;5 !!register"orContext'enu:getListView:;;5 <

A$ter e:e%uting the managedTuery:; an getting the )ursor, )onstants6rowser! %reates a Simple)ursorAdapter =ith the $ollo=ing parameters*

4he a%tivity &or other )ontext' %reating the a apterP in this %ase, the )onstants6rowser itsel$ 4he i enti$ier $or a layout to be use $or ren ering the list entries &R.layout.row' 4he %ursor &constants)ursor'
%44

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

>sing a Content Provider

4he properties to pull out o$ the %ursor an use $or %on$iguring the list entry +ie= instan%es &-.-+* an 7A+2*' 4he %orrespon ing i enti$iers o$ -ext7iew =i gets in the list entry layout that those properties shoul go into &R.id.title an R.id.value'

A$ter that, =e put the a apter into the +ist7iew, an =e get*

!igure 4-< ConstantsBro)ser6 sho)ing a list of physical constants

-$ you nee more %ontrol over the vie=s than you %an reasonably a%hieve =ith the sto%k vie= %onstru%tion logi%, sub%lass Simple)ursorAdapter an overri e get7iew:; to %reate your o=n =i gets to go into the list, as emonstrate earlier in this book.

/oing 8t By Dand
>$ %ourse, you %an al=ays o it the 5har =ay8 O pulling ata out o$ the )ursor by han . 4he )ursor inter$a%e is similar in %on%ept to other atabase a%%ess A!-s o$$ering %ursors as obNe%ts, though, as al=ays, the evil is in the etails.
%47
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing a Content Provider

Position
)ursor

instan%es have a built2in notion o$ position, akin to the Gava .terator! inter$a%e. 4o get to the various ro=s, you %an use*
move-oEirst:; to move to the $irst ro= in the move-o+ast:; to move to the last ro= in the result set move-o/ext:;

result set or

to move to the ne:t ro= an etermine i$ there is yet another ro= to pro%ess &move-o/ext:; returns true i$ it points to another ro= a$ter moving, false other=ise'
move-o1revious:; move-o/ext:;

to move to the previous ro=, as the opposite to

move-o1osition:; to move to a spe%i$i% in e:, or move:; to move to a relative position plus or minus $rom your %urrent position get1osition:; to return your %urrent in

e:

a =hole host o$ %on ition metho s, in%lu ing isEirst:;, is+ast:;, is6eforeEirst:;, an isAfter+ast:;

Gettin! Properties
>n%e you have the )ursor positione at a ro= o$ interest, you have a variety o$ metho s to retrieve properties $rom that ro=, =ith i$$erent metho s supporting i$$erent types &getString:;, get.nt:;, getEloat:;, et%.'. Ia%h metho takes the Mero2base in e: o$ the property you =ant to retrieve. -$ you =ant to see i$ a given property has a value, you %an use is/ull:; to test it $or null2ness.

'ive and Take


>$ %ourse, %ontent provi ers =oul be astonishingly =eak i$ you %oul n6t a or remove ata $rom them, only up ate =hat is there. (ortunately, %ontent provi ers o$$er these abilities as =ell.

%49
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing a Content Provider

4o insert ata into a %ontent provi er, you have t=o options available on the )ontent1rovider inter$a%e &available through get)ontent1rovider:; to your a%tivity'* ,. "se insert:; =ith a %olle%tion 2ri an a )ontent7alues stru%ture es%ribing the initial set o$ ata to put in the ro=

2. "se bul .nsert:; =ith a %olle%tion 2ri an an array o$ )ontent7alues! stru%tures to populate several ro=s at on%e 4he insert:; metho returns a 2ri $or you to use $or $uture operations on that ne= obNe%t. 4he bul .nsert:; metho returns the number o$ %reate ro=sP you =oul nee to o a ;uery to get ba%k at the ata you Nust inserte . (or e:ample, here is a snippet o$ %o e $rom )onstants6rowser to insert a ne= %onstant into the %ontent provi er, given a DialogCrapper that %an provi e a%%ess to the title an value o$ the %onstant*
private!void!process#dd:DialogCrapper!wrapper;!8 !!)ontent7alues!values$new!ContentValues:H;5 !!values.put:1rovider.)onstants.-.-+*G!wrapper.getTitle:;;5 !!values.put:1rovider.)onstants.7A+2*G!wrapper.getValue:;;5 !!getContent$esol er:;.insert:1rovider.)onstants.),/-*/-_2R.G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!values;5 !!constants)ursor.re.uery:;5 <

-n this %ase, all =e o is populate the title. #in%e =e get a 2ri ba%k, =e %an turn aroun an get a )ursor on that 2ri &via managedTuery:uriG!1R,=*)-.,/G! nullG!null;' an reuse our e:isting up ate logi% to a in any a itional ata beyon the title itsel$. Also, i$ =e alrea y have an outstan ing )ursor $or the %ontent provi er6s %ontents, %all reJuery:; on that to up ate )ursor. 4his, in turn, =ill up ate any Simple)ursorAdapter you may have =rapping the )ursor O an that =ill up ate any sele%tion =i gets &e.g., +ist7iew' you have using the a apter.

%7;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

>sing a Content Provider

4o elete one or more ro=s $rom the %ontent provi er, use the delete:;! metho on )ontentResolver. 4his =orks akin to a #HL D*+*-* statement an takes three parameters* ,. A 2ri representing the %olle%tion &or instan%e' you =ish to up ate

2. A %onstraint statement, $un%tioning like a #HL C3*R* %lause, to etermine =hi%h ro=s shoul be up ate ?. An optional set o$ parameters to bin repla%ing any > that appear there into the %onstraint %lause,

Be)are of the B ,B!


.inary large obNe%ts O .L>.s O are supporte in many atabases, in%lu ing #HLite. )o=ever, the An roi mo el is more aime at supporting su%h hunks o$ ata via their o=n separate %ontent 2ri values. A %ontent provi er, there$ore, oes not provi e ire%t a%%ess to binary ata, like photos, via a )ursor. Rather, a property in the %ontent provi er =ill give you the %ontent 2ri $or that parti%ular .L>.. @ou %an use get.nputStream:; an get,utputStream:; on your )ontent1rovider to rea an =rite the binary ata. Huite possibly, the rationale is to minimiMe unne%essary ata %opying. (or e:ample, the primary use o$ a photo in An roi is to isplay it to the user. 4he .mage7iew =i get %an o Nust that, via a %ontent 2ri to a G!I7. .y storing the photo in a manner that has its o=n 2ri, you o not nee to %opy ata out o$ the %ontent provi er into some temporary hol ing area Nust to be able to isplay it O Nust use the 2ri. 4he e:pe%tation, presumably, is that $e= An roi appli%ations =ill o mu%h more than uploa binary ata an use =i gets or built2in a%tivities to isplay that ata.

%7*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &*

Building a Content Provider

.uil ing a %ontent provi er is probably the most %ompli%ate an te ious task in all o$ An roi evelopment. 4here are many re;uirements o$ a %ontent provi er, in terms o$ metho s to implement an publi% ata members to supply. An , until you try using it, you have no great =ay o$ telling i$ you i any o$ it %orre%tly &versus, say, buil ing an a%tivity an getting vali ation errors $rom the resour%e %ompiler'. 4hat being sai , buil ing a %ontent provi er is o$ huge importan%e i$ your appli%ation =ishes to make ata available to other appli%ations. -$ your appli%ation is keeping its ata solely to itsel$, you may be able to avoi %reating a %ontent provi er, Nust a%%essing the ata ire%tly $rom your a%tivities. .ut, i$ you =ant your ata to possibly be use by others O $or e:ample, you are buil ing a $ee rea er an you =ant other programs to be able to a%%ess the $ee s you are o=nloa ing an %a%hing O then a %ontent provi er is right $or you.

!irst6 Some /issection


As =as is%usse in the previous %hapter, the %ontent 2ri is the lin%hpin behin a%%essing ata insi e a %ontent provi er. When using a %ontent provi er, all you really nee to kno= is the provi er6s base 2riP $rom there you %an run ;ueries as nee e , or %onstru%t a 2ri to a spe%i$i% instan%e i$ you kno= the instan%e i enti$ier.

%7Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

When buil ing a %ontent provi er, though, you nee to kno= a bit more about the innar s o$ the %ontent 2ri. A %ontent 2ri has t=o to $our pie%es, epen ing on situation*

-t al=ays has a s%heme &content#//', in i%ating it is a %ontent 2ri! instea o$ a 2ri to a Web resour%e &&ttp#//'. -t al=ays has an authority, =hi%h is the $irst path segment a$ter the s%heme. 4he authority is a uni;ue string i enti$ying the %ontent provi er that han les the %ontent asso%iate =ith this 2ri. -t may have a ata type path, =hi%h is the list o$ path segments a$ter the authority an be$ore the instan%e i enti$ier &i$ any'. 4he ata type path %an be empty, i$ the %ontent provi er only han les one type o$ %ontent. -t %an be a single path segment &foo' or a %hain o$ path segments &foo/bar/goo' as nee e to han le =hatever ata a%%ess s%enarios the %ontent provi er re;uires. -t may have an instan%e i enti$ier, =hi%h is an integer i enti$ying a spe%i$i% pie%e o$ %ontent. A %ontent 2ri =ithout an instan%e i enti$ier re$ers to the %olle%tion o$ %ontent represente by the authority &an , =here provi e , the ata path'.

(or e:ample, a %ontent 2ri %oul be as simple as content#//se rits, =hi%h =oul re$er to the %olle%tion o$ %ontent hel by =hatever %ontent provi er =as tie to the se rits authority &e.g., Secrets1rovider'. >r, it %oul be as %omple: as content#//se rits/card/pin/?V, =hi%h =oul re$er to a pie%e o$ %ontent &i enti$ie as ?V' manage by the se rits %ontent provi er that is o$ the ata type card/pin.

5ext6 Some Typing


/e:t, you nee to %ome up =ith some M-MI types %orrespon ing =ith the %ontent your %ontent provi er =ill provi e. An roi uses both the %ontent 2ri an the M-MI type as =ays to i enti$y %ontent on the evi%e. A %olle%tion %ontent 2ri O or, more a%%urately, the %ombination authority an ata type path O shoul map to a pair o$ M-MI
%7$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

types. >ne M-MI type =ill represent the %olle%tionP the other =ill represent an instan%e. 4hese map to the 2ri patterns above $or no2i enti$ier an i enti$ier, respe%tively. As you sa= earlier in this book, you %an $ill in a M-MI type into an .ntent to route the .ntent to the proper a%tivity &e.g., A)-.,/_1.)M on a %olle%tion M-MI type to %all up a sele%tion a%tivity to pi%k an instan%e out o$ that %olle%tion'. 4he %olle%tion M-MI type shoul be o$ the $orm vnd.U.cursor.dir/F, =here U is the name o$ your $irm, organiMation, or proNe%t, an F is a ot2 elimite type name. #o, $or e:ample, you might use vnd.tlagency.cursor.dir/se rits.card.pin as the M-MI type $or your %olle%tion o$ se%rets. 4he instan%e M-MI type shoul be o$ the $orm vnd.U.cursor.item/F, usually $or the same values o$ U an F as you use $or the %olle%tion M-MI type &though that is not stri%tly re;uire '.

Step J*H Create a Provider Class


Gust as an a%tivity an intent re%eiver are both Gava %lasses, so is a %ontent provi er. #o, the big step in %reating a %ontent provi er is %ra$ting its Gava %lass, =ith a base %lass o$ )ontent1rovider. -n your sub%lass o$ )ontent1rovider, you are responsible $or implementing si: metho s that, =hen %ombine , per$orm the servi%es that a %ontent provi er is suppose to o$$er to a%tivities =ishing to %reate, rea , up ate, or elete %ontent.

onCre te89
As =ith an a%tivity, the main entry point to a %ontent provi er is on)reate:;. )ere, you %an o =hatever initialiMation you =ant. -n parti%ular, here is =here you shoul laMy2initialiMe your ata store. (or e:ample, i$ you plan on storing your ata in su%h2an 2so ire%tory on an #A %ar , =ith an DML $ile serving as a Qtable o$ %ontentsQ, you shoul %he%k an see i$ that ire%tory

%70
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

an DML $ile are there an , i$ not, %reate them so the rest o$ your %ontent provi er kno=s they are out there an available $or use. #imilarly, i$ you have re=ritten your %ontent provi er su$$i%iently to %ause the ata store to shi$t stru%ture, you shoul %he%k to see =hat stru%ture you have no= an a Nust it i$ =hat you have is out o$ ate. @ou on6t =rite your o=n QinstallerQ program an so have no great =ay o$ etermining i$, =hen on)reate:; is %alle , i$ this is the $irst time ever $or the %ontent provi er, the $irst time $or a ne= release o$ a %ontent provi er that =as upgra e in2pla%e, or i$ this is Nust a normal startup. -$ your %ontent provi er uses #HLite $or storage, you %an ete%t to see i$ your tables e:ist by ;uerying on the sJlite_master table. 4his is use$ul $or laMy2 %reating a table your %ontent provi er =ill nee . (or e:ample, here is the on)reate:; metho $or 1rovider, $rom the Constants sample appli%ation*
9,verride public!boolean!onCreate:;!8 !!db$:new!Data!ase,elper:getContext:;;;.get&rita!leData!ase:;5 !!return!:db!$$!null;!>!false!#!true5 <

While that

Database3elper obNe%t,

oesn6t seem all that spe%ial, the Qmagi%Q is in the private es%ribe in the %hapter on atabase a%%ess.

=uery89
As one might e:pe%t, the Juery:; metho is =here your %ontent provi er gets etails on a ;uery some a%tivity =ants to per$orm. -t is up to you to a%tually pro%ess sai ;uery. 4he ;uery metho gets, as parameters*

A 2ri representing the %olle%tion or instan%e being ;uerie

%71
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

A StringPQ representing the list o$ properties that shoul returne

be

A String representing =hat amounts to a #HL C3*R* %lause, %onstraining =hi%h instan%es shoul be %onsi ere $or the ;uery results A StringPQ representing values to Qpour intoQ the C3*R* %lause, repla%ing any > $oun there A String representing =hat amounts to a #HL ,RD*R!6F %lause

@ou are responsible $or interpreting these parameters ho=ever they make sense an returning a )ursor that %an be use to iterate over an a%%ess the ata. As you %an imagine, these parameters are aime to=ar s people using a #HLite atabase $or storage. @ou are =el%ome to ignore some o$ these parameters &e.g., you ele%t not to try to roll your o=n #HL C3*R* %lause parser', but you nee to o%ument that $a%t so a%tivities only attempt to ;uery you by instan%e 2ri an not using parameters you ele%t not to han le. (or #HLite2ba%ke storage provi ers, ho=ever, the Juery:; metho implementation shoul be largely boilerplate. "se a ST+iteTuery6uilder to %onvert the various parameters into a single #HL statement, then use Juery:; on the buil er to a%tually invoke the ;uery an give you a )ursor! ba%k. 4he )ursor is =hat your Juery:; metho then returns. (or e:ample, here is Juery:; $rom 1rovider*
9,verride public!)ursor!.uery:2ri!urlG!StringPQ!projectionG!String!selectionG !!!!!!!!!!!!!!!!!!!!!StringPQ!selectionArgsG!String!sort;!8 !!ST+iteTuery6uilder!Jb$new!S/Lite/ueryBuilder:;5 !!Jb.setTa!les:getTa!le%ame:;;5 !!if!:isCollection)ri:url;;!8 !!!!Jb.set(ro0ection'ap:getDefault(ro0ection:;;5 !!< !!else!8 !!!!Jb.append&here:getIdColumn%ame:;B%$%Burl.get(athSegments:;.get:?;;5

%74
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

!!< !!String!order6y5 !!if!:-ext2tils.is*mpty:sort;;!8 !!!!order6y$getDefaultSortOrder:;5 !!<!else!8 !!!!order6y$sort5 !!< !!)ursor!c$Jb..uery:dbG!projectionG!selectionG!selectionArgsG !!!!!!!!!!!!!!!!!!!!nullG!nullG!order6y;5 !!c.set%otification)ri:getContext:;.getContent$esol er:;G!url;5 !!return!c5

We %reate a ST+iteTuery6uilder an pour the ;uery etails into the buil er. /ote that the ;uery %oul be base aroun either a %olle%tion or an instan%e 2ri O in the latter %ase, =e nee to a the instan%e -A to the ;uery. When one, =e use the Juery:; metho on the buil er to get a )ursor $or the results.

insert89
@our insert&' metho =ill re%eive a 2ri representing the %olle%tion an a )ontent7alues stru%ture =ith the initial ata $or the ne= instan%e. @ou are responsible $or %reating the ne= instan%e, $illing in the supplie ata, an returning a 2ri to the ne= instan%e. -$ this is a #HLite2ba%ke %ontent provi er, on%e again, the implementation is mostly boilerplate* vali ate that all re;uire values =ere supplie by the a%tivity, merge your o=n notion o$ e$ault values =ith the supplie ata, an %all insert:; on the atabase to a%tually %reate the instan%e. (or e:ample, here is insert:; $rom 1rovider*
9,verride public!2ri!insert:2ri!urlG!)ontent7alues!initial7alues;!8 !!long!row.D5 !!)ontent7alues!values5 !!if!:initial7aluesX$null;!8 !!!!values$new!ContentValues:initial7alues;5 !!<!else!8

%77
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

!!!!values$new!ContentValues:;5 !!< !!if!:XisCollection)ri:url;;!8 !!!!t&row!new!Illegal#rgument*xception:%2n nown!2R+!%!B!url;5 !!< !!for!:String!col/ame!#!get$e.uiredColumns:;;!8 !!!!if!:values.contains1ey:col/ame;!$$!false;!8 !!!!!!t&row!new!Illegal#rgument*xception:%Missing!column#!%Bcol/ame;5 !!!!< !!< !!populateDefaultValues:values;5 !!row.D$db.insert:getTa!le%ame:;G!get%ullColumn,ack:;G!values;5 !!if!:row.D!'!@;!8 !!!!2ri!uri$)ontent2ris.with#ppendedId:getContent)ri:;G!row.D;5 !!!!getContext:;.getContent$esol er:;.notifyChange:uriG!null;5 !!!!return!uri5 !!< !!t&row!new!S/L*xception:%Eailed!to!insert!row!into!%!B!url;5 <

4he pattern is the same as be$ore* use the provi er parti%ulars plus the ata to be inserte to a%tually o the insertion. >$ note*

@ou %an only insert into a %olle%tion 2ri, so =e vali ate that by %alling is)ollection2ri:; 4he provi er also kno=s =hat %olumns are re;uire &getReJuired)olumns:;', so =e iterate over those an %on$irm our supplie values %over the re;uirements 4he provi er is also responsible $or $illing in any e$ault values &populateDefault7alues:;' $or %olumns not supplie in the insert:;! %all an not automati%ally han le by the #HLite table e$inition

upd te89
@our update:; metho gets the 2ri o$ the instan%e or %olle%tion to %hange, a )ontent7alues stru%ture =ith the ne= values to apply, a #tring $or a #HL C3*R* %lause, an a StringPQ =ith parameters to use to repla%e > $oun in the C3*R* %lause. @our responsibility is to i enti$y the instan%e&s' to be mo i$ie

%79
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

&base on the 2ri an C3*R* %lause', then repla%e those instan%es6 %urrent property values =ith the ones supplie . 4his =ill be annoying, unless you6re using #HLite $or storage. 4hen, you %an pretty mu%h pass all the parameters you re%eive to the update:; %all to the atabase, though the update:; %all =ill vary slightly epen ing on =hether you are up ating one instan%e or several. (or e:ample, here is update:; $rom 1rovider*
9,verride public!int!update:2ri!urlG!)ontent7alues!valuesG!String!w&ereG!StringPQ! w&ereArgs;!8 !!int!count5 !!if!:isCollection)ri:url;;!8 !!!!count$db.update:getTa!le%ame:;G!valuesG!w&ereG!w&ereArgs;5 !!< !!else!8 !!!!String!segment$url.get(athSegments:;.get:?;5 !!!!count$db !!!!!!!!.update:getTa!le%ame:;G!valuesG!getIdColumn%ame:;B%$% !!!!!!!!!!!!B!segment !!!!!!!!!!!!B!:X-ext2tils.is*mpty:w&ere;!>!%!A/D!:%!B!w&ere !!!!!!!!!!!!!!!!B![;[!#!%%;G!w&ereArgs;5 !!< !!getContext:;.getContent$esol er:;.notifyChange:urlG!null;5 !!return!count5 <

-n this %ase, up ates %an either be to a spe%i$i% instan%e or applie a%ross the entire %olle%tion, so =e %he%k the 2ri &is)ollection2ri:;' an , i$ it is an up ate $or the %olle%tion, Nust per$orm the up ate. -$ =e are up ating a single instan%e, =e nee to a a %onstraint to the C3*R* %lause to only up ate $or the re;ueste ro=.

delete89
As =ith update:;, delete:; re%eives a 2ri representing the instan%e or %olle%tion to =ork =ith an a C3*R* %lause an parameters. -$ the a%tivity is eleting a single instan%e, the 2ri shoul represent that instan%e an the C3*R* %lause may be null. .ut, the a%tivity might be re;uesting to elete an
%9;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

open2en e set o$ instan%es, using the C3*R* %lause to %onstrain =hi%h ones to elete. As =ith update:;, though, this is simple i$ you are using #HLite $or atabase storage &sense a themeC'. @ou %an let it han le the i iosyn%rasies o$ parsing an applying the C3*R* %lause O all you have to o is %all delete:; on the atabase. (or e:ample, here is delete:; $rom 1rovider*
9,verride public!int!delete:2ri!urlG!String!w&ereG!StringPQ!w&ereArgs;!8 !!int!count5 !!long!row.d$@5 !!if!:isCollection)ri:url;;!8 !!!!count$db.delete:getTa!le%ame:;G!w&ereG!w&ereArgs;5 !!< !!else!8 !!!!String!segment$url.get(athSegments:;.get:?;5 !!!!row.d$+ong.parseLong:segment;5 !!!!count$db !!!!!!!!.delete:getTa!le%ame:;G!getIdColumn%ame:;B%$% !!!!!!!!!!!!B!segment !!!!!!!!!!!!B!:X-ext2tils.is*mpty:w&ere;!>!%!A/D!:%!B!w&ere !!!!!!!!!!!!!!!!B![;[!#!%%;G!w&ereArgs;5 !!< !!getContext:;.getContent$esol er:;.notifyChange:urlG!null;5 !!return!count5 <

4his is almost a %lone o$ the update:; implementation es%ribe above O either elete a subset o$ the entire %olle%tion or elete a single instan%e &i$ it also satis$ies the supplie C3*R* %lause'.

!etType89
4he last metho you nee returns the M-MI type %olle%tion or an instan%e an return the %orrespon to implement is get-ype:;. 4his takes a 2ri an asso%iate =ith that 2ri. 4he 2ri %oul be a 2riP you nee to etermine =hi%h =as provi e ing M-MI type.

%9*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

(or e:ample, here is get-ype:; $rom 1rovider*


9,verride public!String!getType:2ri!url;!8 !!if!:isCollection)ri:url;;!8 !!!!return:getCollectionType:;;5 !!< !!return:getSingleType:;;5 <

As you %an see, most o$ the logi% elegates to private get)ollection-ype:;! an getSingle-ype:; metho s*
private!String!getCollectionType:;!8 !!return:%vnd.android.cursor.dir/vnd.commonsware.constant%;5 < private!String!getSingleType:;!8 !!return:%vnd.android.cursor.item/vnd.commonsware.constant%;5 <

Step J%H Supply a >ri


@ou also nee to a a publi% stati% member...some=here, %ontaining the 2ri $or ea%h %olle%tion your %ontent provi er supports. 4ypi%ally, this is a publi% stati% $inal 2ri put on the %ontent provi er %lass itsel$*
public!static!final!2ri!),/-*/-_2R.$ !!2ri.parse:%content#//com.commonsware.android.tourit.1rovider/tours%;5

@ou may =ish to use the same namespa%e $or the %ontent 2ri that you use $or your Gava %lasses, to re u%e the %han%e o$ %ollision =ith others.

Step J-H /eclare the Properties


Remember those properties you re$eren%e =hen you =ere using a %ontent provi er, in the previous %hapterC Well, you nee to have those too $or your o=n %ontent provi er.

%9%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

#pe%i$i%ally, you =ant a publi% stati% %lass implementing 6ase)olumns that %ontains your property names, su%h as this e:ample $rom 1rovider*
public!static!final!class!)onstants!implements!6ase)olumns!8 !!public!static!final!2ri!),/-*/-_2R. !!!!!!$2ri.parse:%content#//com.commonsware.android.constants.1rovider/constants %;5 !!public!static!final!String!D*EA2+-_S,R-_,RD*R$%title%5 !!public!static!final!String!-.-+*$%title%5 !!public!static!final!String!7A+2*$%value%5 <

-$ you are using #HLite as a ata store, the values $or the property name %onstants shoul be the %orrespon ing %olumn name in the table, so you %an Nust pass the proNe%tion &array o$ properties' to #HLite on a Juery:;, or pass the )ontent7alues on an insert:; or update:;. /ote that nothing in here stipulates the types o$ the properties. 4hey %oul be strings, integers, or =hatever. 4he biggest limitation is =hat a )ursor %an provi e a%%ess to via its property getters. 4he $a%t that there is nothing in %o e that en$or%es type sa$ety means you shoul o%ument the property types =ell, so people attempting to use your %ontent provi er kno= =hat they %an e:pe%t.

Step J$H >pdate the +anifest


4he glue tying the %ontent provi er implementation to the rest o$ your appli%ation resi es in your AndroidManifest.xml $ile. #imply a a "provider'! element as a %hil o$ the "application' element*
"provider !!android#name$%.1rovider% !!android#aut&orities$%com.commonsware.android.tourit.1rovider%!/'

4he android#name property is the name o$ the %ontent provi er %lass, =ith a lea ing ot to in i%ate it is in the sto%k namespa%e $or this appli%ation6s %lasses &Nust like you use =ith a%tivities'.

%9Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

4he android#aut&orities property shoul be a semi%olon2 elimite list o$ the authority values supporte by the %ontent provi er. Re%all, $rom earlier in this %hapter, that ea%h %ontent 2ri is ma e up o$ a s%heme, authority, ata type path, an instan%e i enti$ier. Ia%h authority $rom ea%h ),/-*/-_2R.! value shoul be in%lu e in the android#aut&orities list. /o=, =hen An roi en%ounters a %ontent 2ri, it %an si$t through the provi ers registere through mani$ests to $in a mat%hing authority. 4hat tells An roi =hi%h appli%ation an %lass implements the %ontent provi er, an $rom there An roi %an bri ge bet=een the %alling a%tivity an the %ontent provi er being %alle .

5otify",n"Change Support
An optional $eature your %ontent provi er to its %lients is noti$y2on2%hange support. 4his means that your %ontent provi er =ill let %lients kno= i$ the ata $or a given %ontent 2ri %hanges. (or e:ample, suppose you have %reate a %ontent provi er that retrieves R## an Atom $ee s $rom the -nternet base on the user6s $ee subs%riptions &via >!ML, perhaps'. 4he %ontent provi er o$$ers rea 2only a%%ess to the %ontents o$ the $ee s, =ith an eye to=ar s several appli%ations on the phone using those $ee s versus everyone implementing their o=n $ee poll2$et%h2 an 2%a%he system. @ou have also implemente a servi%e that =ill get up ates to those $ee s asyn%hronously, up ating the un erlying ata store. @our %ontent provi er %oul alert appli%ations using the $ee s that su%h2an 2so $ee =as up ate , so appli%ations using that spe%i$i% $ee %an re$resh an get the latest ata. >n the %ontent provi er si e, to o this, %all notify)&ange:; on your )ontentResolver instan%e &available in your %ontent provi er via get)ontext:;.get)ontentResolver:;'. 4his takes t=o parameters* the 2ri o$ the pie%e o$ %ontent that %hange an the )ontent,bserver that initiate the %hange. -n many %ases, the latter =ill be nullP a non2null value simply means that observer =ill not be noti$ie o$ its o=n %hanges.

%9$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Building a Content Provider

%onsumer si e, an a%tivity %an %all register)ontent,bserver:; on its )ontentResolver &via get)ontentResolver:;'. 4his ties a )ontent,bserver instan%e to a supplie 2ri O the observer =ill be noti$ie =henever notify)&ange:; is %alle $or that spe%i$i% 2ri. When the %onsumer is one =ith the 2ri, unregister)ontent,bserver:; releases the %onne%tion.

>n

the

%ontent

%90
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &-

3equesting and 3equiring Permissions

-n the late ,0006s, a =ave o$ viruses sprea through the -nternet, elivere via email, using %onta%t in$ormation %ulle $rom Mi%roso$t >utlook. A virus =oul simply email %opies o$ itsel$ to ea%h o$ the >utlook %onta%ts that ha an email a ress. 4his =as possible be%ause, at the time, >utlook i not take any steps to prote%t ata $rom programs using the >utlook A!-, sin%e that A!- =as esigne $or or inary evelopers, not virus authors. /o=a ays, many appli%ations that hol onto %onta%t ata se%ure that ata by re;uiring that a user e:pli%itly grant rights $or other programs to a%%ess the %onta%t in$ormation. 4hose rights %oul be grante on a %ase2by2%ase basis or a on%e at install time. An roi is no i$$erent, in that it re;uires permissions $or appli%ations to rea or =rite %onta%t ata. An roi 6s permission system is use$ul =ell beyon %onta%t ata, an $or %ontent provi ers an servi%es beyon those supplie by the An roi $rame=ork. @ou, as an An roi eveloper, =ill $re;uently nee to ensure your appli%ations have the appropriate permissions to o =hat you =ant to o =ith other appli%ations6 ata. @ou may also ele%t to re;uire permissions $or other appli%ations to use your ata or servi%es, i$ you make those available to other An roi %omponents. 4his %hapter %overs ho= to a%%omplish both these en s.
%94
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

3equesting and 3equiring Permissions

+other6 +ay 8:
Re;uesting the use o$ other appli%ations6 ata or servi%es re;uires the usespermission element to be a e to your AndroidManifest.xml $ile. @our mani$est may have Mero or more uses-permission elements, all as ire%t %hil ren o$ the root manifest element. 4he uses-permission element takes a single attribute, android#name, =hi%h is the name o$ the permission your appli%ation re;uires*
"uses-permission !!android#name$%android.permission.A))*SS_+,)A-.,/%!/'

4he sto%k system permissions all begin =ith android.permission an are liste in the An roi #AE o%umentation $or Manifest.permission. 4hir 2 party appli%ations may have their o=n permissions, =hi%h hope$ully they have o%umente $or you. )ere are some o$ the more important built2in permissions*
A))*SS_M,)M_+,)A-.,/,

provi er

i$ you are using the built2in mo%k lo%ation

./-*R/*-,

i$ your appli%ation =ishes to a%%ess the -nternet through any means, $rom ra= Gava so%kets through the Ceb7iew =i get
R*AD_)A+*/DAR, R*AD_),/-A)-S,

built2in %ontent provi ers

an the like $or rea ing ata out o$ the an the like $or mo i$ying ata in

CR.-*_)A+*/DAR, CR.-*_),/-A)-S,

the built2in %ontent provi ers !ermissions are %on$irme at the time the appli%ation is installe O the user =ill be prompte to %on$irm it is >E $or your appli%ation to o =hat the permission %alls $or. 4his prompt is not available in the %urrent emulator, ho=ever. -$ you o not have the esire permission an try to o something that nee s it, you may get a Security*xception in$orming you o$ the missing permission, but this is not a guarantee O $ailures may %ome in other $orms,

%97
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

3equesting and 3equiring Permissions

epen ing on i$ something else is %at%hing an e:%eption.

trying to han le that

4o see the e$$e%ts o$ permissions, go ba%k to the 1ic e:ample proNe%t. -$ you look at the AndroidManifest.xml $ile, you =ill see it re;uests the R*AD_),/-A)-S permission. 4his is =hat allo=s you to vie= the %onta%t in$ormation. Comment out the uses-permission element in the mani$est, re%ompile, an try out the ne= version in the emulator. @ou shoul get a Security*xception. >AT.* you may nee to restart the emulator, i$ you =ere using the 1ic Demo be$ore uring this same emulator session.

Dalt! Who 'oes There:


4he other si e o$ the %oin, o$ %ourse, is to se%ure your o=n appli%ation. -$ your appli%ation is merely a%tivities an intent re%eivers, se%urity may be Nust an 5outboun 8 thing, =here you re;uest permission to use resour%es o$ other appli%ations. -$, on the other han , you put %ontent provi ers or servi%es in your appli%ation, you =ill =ant to implement 5inboun 8 se%urity to %ontrol =hi%h appli%ations %an o =hat =ith the ata. /ote that the issue here is less about =hether other appli%ations might 5mess up8 your ata, but rather about priva%y o$ the user6s in$ormation or use o$ servi%es that might in%ur e:pense. 4hat is =here the sto%k permissions $or built2in An roi appli%ations are $o%use O %an you rea or mo i$y %onta%ts, %an you sen #M#, et%. -$ your appli%ation oes not store in$ormation that might be %onsi ere private, se%urity is less an issue. -$, on the other han , your appli%ation stores private ata, su%h as me i%al in$ormation, se%urity is mu%h more important. 4he $irst step to se%uring your o=n appli%ation using permissions is to e%lare sai permissions, on%e again in the AndroidManifest.xml $ile. -n this %ase, instea o$ uses-permission, you a permission elements. >n%e again, you %an have Mero or more permission elements, all as ire%t %hil ren o$ the root manifest element.

%99
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

3equesting and 3equiring Permissions

Ae%laring a permission is slightly more %ompli%ate than using a permission. 4here are three pie%es o$ in$ormation you nee to supply* ,. 4he symboli% name o$ the permission. 4o keep your permissions $rom %olli ing =ith those $rom other appli%ations, you shoul use your appli%ation6s Gava namespa%e as a pre$i: be

2. A label $or the permission* something short that =oul un erstan able by users

?. A es%ription $or the permission* something a =ee bit longer that is un erstan able by your users
"permission !!android#name$%vnd.tlagency.se rits.S**_S*MR.-S% !!android#label$%9string/see_se rits_label% !!android#description$%9string/see_se rits_description%!/'

4his oes not en$or%e the permission. Rather, it in i%ates that it is a possible permissionP your appli%ation must still $lag se%urity violations as they o%%ur.

En,orcin! Permissions vi the % ni,est


4here are t=o =ays $or your appli%ation to en$or%e permissions, i%tating =here an un er =hat %ir%umstan%es they are re;uire . 4he easier one is to in i%ate in the mani$est =here permissions are re;uire . A%tivities, servi%es, an intent re%eivers %an all e%lare an attribute name android#permission, =hose value is the name o$ the permission that is re;uire to a%%ess those items*
"activity !!android#name$%.Se ritApp% !!android#label$%-op!Se rit% !!android#permission$%vnd.tlagency.se rits.S**_S*MR.-S%' !!"intent-filter' !!!!"action!android#name$%android.intent.action.MA./%!/' !!!!"category !!!!!!android#name$%android.intent.category.+A2/)3*R%!/' !!"/intent-filter' "/activity'

-;;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

3equesting and 3equiring Permissions

>nly appli%ations that have re;ueste your in i%ate permission =ill be able to a%%ess the se%ure %omponent. -n this %ase, 5a%%ess8 means*

A%tivities %annot be starte =ithout the permission #ervi%es %annot be starte , stoppe , or boun to an a%tivity =ithout the permission -ntent re%eivers ignore messages sent via broadcast.ntent:; unless the sen er has the permission istin%t attributes* read1ermission an

Content provi ers o$$er t=o write1ermission*

"provider !!android#name$%.Se rit1rovider% !!android#aut&orities$%vnd.tla.se rits.Se rit1rovider% !!android#read1ermission$%vnd.tla.se rits.S**_S*MR.-S% !!android#write1ermission$%vnd.tla.se rits.M,D_S*MR.-S%!/'

-n this %ase, read1ermission %ontrols a%%ess to ;uerying the %ontent provi er, =hile write1ermission %ontrols a%%ess to insert, up ate, or elete ata in the %ontent provi er.

En,orcin! Permissions Else#here


-n your %o e, you have t=o a @our servi%es %an itional =ays to en$or%e permissions.

%he%k permissions on a per2%all basis via c&ec )alling1ermission:;. 4his returns 1*RM.SS.,/_0RA/-*D or 1*RM.SS.,/_D*/.*D epen ing on =hether the %aller has the permission you spe%i$ie . (or e:ample, i$ your servi%e implements separate rea an =rite metho s, you %oul get the e$$e%t o$ read1ermission an write1ermission in %o e by %he%king those metho s $or the permissions you nee $rom Gava. Also, you %an in%lu e a permission =hen you %all send6roadcast:;. 4his means that eligible re%eivers must hol that permissionP those =ithout the permission are ineligible to re%eive it. (or e:ample, the An roi subsystem presumably in%lu es the R*)*.7*_SMS permission =hen it broa %asts that an
-;*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

3equesting and 3equiring Permissions

#M# message has arrive O this =ill restri%t the re%eivers o$ that intent to be only those authoriMe to re%eive #M# messages.

+ay 8 See .our /ocuments:


4here is no automati% is%overy o$ permissions at %ompile timeP all permission $ailures o%%ur at runtime. )en%e, it is important that you o%ument the permissions re;uire $or your publi% A!-s, in%lu ing %ontent provi ers, servi%es, an a%tivities inten e $or laun%hing $rom other a%tivities. >ther=ise, the programmers attempting to inter$a%e =ith your appli%ation =ill have to $in out the permission rules by trial an error. (urthermore, you shoul e:pe%t that users o$ your appli%ation =ill be prompte to %on$irm any permissions your appli%ation says it nee s. )en%e, you nee to o%ument $or your users =hat they shoul e:pe%t, lest they get %on$use by the ;uestion pose by the phone an ele%t to not install or use your appli%ation.

-;%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &/

Creating a Service

As note previously, An roi servi%es are $or long2running pro%esses that may nee to keep running even =hen e%ouple $rom any a%tivity. I:amples in%lu e playing musi% even i$ the QplayerQ a%tivity gets garbage2%olle%te , polling the -nternet $or R##UAtom $ee up ates, an maintaining an online %hat %onne%tion even i$ the %hat %lient loses $o%us ue to an in%oming phone %all. #ervi%es are %reate =hen manually starte &via an A!- %all' or =hen some a%tivity tries %onne%ting to the servi%e via inter2pro%ess %ommuni%ation &-!C'. #ervi%es =ill live until no longer nee e an i$ RAM nee s to be re%laime . Running $or a long time isn6t =ithout its %osts, though, so servi%es nee to be %are$ul not to use too mu%h C!" or keep ra ios a%tive too mu%h o$ the time, lest the servi%e %ause the evi%e6s battery to get use up too ;ui%kly. 4his %hapter %overs ho= you %an %reate your o=n servi%esP the ne:t %hapter %overs ho= you %an use su%h servi%es $rom your a%tivities or other %onte:ts. .oth %hapters =ill analyMe the Weather!lus sample appli%ation, =ith this %hapter $o%using mostly on the Ceat&er1lusService implementation. Ceat&er1lusService e:ten s the =eather2$et%hing logi% o$ the original Weather sample, by bun ling it in a servi%e that monitors %hanges in lo%ation, so the =eather is up ate as the emulator is Qmove Q.

-;Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Service

Service )ith Class


Creating a servi%e implementation shares many %hara%teristi%s =ith buil ing an a%tivity. @ou inherit $rom an An roi 2supplie base %lass, overri e some li$e%y%le metho s, an hook the servi%e into the system via the mani$est. #o, the $irst step in %reating a servi%e is to e:ten the Service %lass, in our %ase =ith our o=n Ceat&er1lusService sub%lass. Gust as a%tivities have on)reate:;, onResume:;, on1ause:; an kin, Service! implementations %an overri e three i$$erent li$e%y%le metho s* ,.
on)reate:;,

=hi%h, as =ith servi%es, is %alle pro%ess is %reate

=hen the servi%e

2. onStart:;, =hi%h is %alle =hen a servi%e is manually starte by some other pro%ess, versus being impli%itly starte as the result o$ an -!C re;uest & is%usse more in the ne:t %hapter' ?. onDestroy:; =hi%h is %alle as the servi%e is being shut o=n Common startup an shut o=n logi% shoul go in on)reate:; an onDestroy:;P onStart:; is mostly i$ your servi%e nee s ata passe into it $rom the starting pro%ess an you on6t =ish to use -!C. (or e:ample, here is the on)reate:; metho $or Ceat&er1lusService*
9,verride public!void!onCreate:;!8 !!super.onCreate:;5 !!client$new!Default,ttpClient:;5 !!format$getString:R.string.url;5 !!bac ground$new!Thread:new!$unna!le:;!8 !!!!public!void!run:;!8 !!!!!!try!8 !!!!!!!!,bject!event$null5 !!!!!!!!w&ile!:true;!8 !!!!!!!!!!event$Jueue.poll:;5

-;$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Service

!!!!!!!!!!if!:event$$S32-D,C/;!8 !!!!!!!!!!!!brea 5 !!!!!!!!!!< !!!!!!!!!!else!8 !!!!!!!!!!!!update"orecast::+ocation;event;5 !!!!!!!!!!< !!!!!!!!< !!!!!!< !!!!!!catc&!:-&rowable!t;!8 !!!!!!!!//!just!end!t&e!bac ground!t&read !!!!!!< !!!!< !!<;5 !!my+ocationManager$:+ocationManager;getSystemSer ice:)ontext.+,)A-.,/_S*R7.)*;5 !!init'ock(ro ider:;5 !!bac ground.start:;5 !!ena!leLocation(oll:;5 <

(irst, =e %hain up=ar to the super%lass, so An roi %an o any setup =ork it nee s to have one. 4hen =e initialiMe our 3ttp)lient an $ormat string as =e i in the Weather emo. /e:t, =e set up a ba%kgroun threa to monitor a )oncurrent+in edTueue, looking $or ne= events. As =e6ll see, the ;ueue allo=s us to o the a%tual retrieval o$ =eather in a separate threa than those use $or the in%oming -!C metho %alls $rom the Ceat&er1lus! a%tivity. 4he on)reate:; metho =raps up by preparing the lo%ation2monitoring logi%, =hi%h =ill be is%usse in greater etail in the %hapter on lo%ation2 base servi%es. 4he onDestroy:; metho is mu%h simpler*
9,verride public!void!onDestroy:;!8 !!super.onDestroy:;5 !!disa!leLocation(oll:;5 !!Jueue.add:S32-D,C/;5 !!moc ery.close:;5 <

-;0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Service

)ere, =e Nust shut o=n the timer an lo%ation2monitoring logi%, in a ition to %haining up=ar to the super%lass $or any An roi internal bookkeeping that might be nee e . -n a ition to those li$e%y%le metho s, though, your servi%e also nee s to implement on6ind:;. 4his metho returns an .6inder, =hi%h is the lin%hpin behin the -!C me%hanism. -$ you6re %reating a servi%e %lass =hile rea ing this %hapter, Nust have this metho return null $or no=, an =e6ll $ill in the $ull implementation in the ne:t se%tion.

When 8PC (ttacks!


#ervi%es =ill ten to o$$er inter2pro%ess %ommuni%ation &-!C' as a means o$ intera%ting =ith a%tivities or other An roi %omponents. Ia%h servi%e e%lares =hat metho s it is making available over -!CP those metho s are then available $or other %omponents to %all, =ith An roi han ling all the messy etails involve =ith making metho %alls a%ross %omponent or pro%ess boun aries. 4he guts o$ this, $rom the stan point o$ the eveloper, is e:presse in A-AL* the An roi -nter$a%e Aes%ription Language. -$ you have use -!C me%hanisms like C>M, C>R.A, or the like, you =ill re%ogniMe the notion o$ -AL. A-AL spells out the publi% -!C inter$a%e, an An roi supplies tools to buil the %lient an server si e o$ that inter$a%e. With that in min , let6s take a look at A-AL an -!C.

7rite the AID>


-ALs are $re;uently =ritten in a Qlanguage2neutralQ synta:. A-AL, on the other han , looks a lot like a Gava inter$a%e. (or e:ample, here is the A-AL $or the .Ceat&er*
pac age!com.commonsware.android.service5 //!Declare!t&e!interface.

-;1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Service

interface!.Ceat&er!8 !!String!get"orecast(age:;5 <

As =ith a Gava inter$a%e, you e%lare a pa%kage at the top. As =ith a Gava inter$a%e, the metho s are =rappe in an inter$a%e e%laration &interface! .Ceat&er!8!...!<'. An , as =ith a Gava inter$a%e, you list the metho s you are making available. 4he i$$eren%es, though, are %riti%al. (irst, not every Gava type %an be use as a parameter. @our %hoi%es are*

!rimitive values &int, float, double, boolean, et%.'


String an )&arSeJuence +ist an Map

&$rom java.util'

Any other A-AL2 e$ine inter$a%es Any Gava %lasses that implement the 1arcelable inter$a%e, =hi%h is An roi 6s $lavor o$ serialiMation &see belo='

-n the %ase o$ the latter t=o %ategories, you nee to in%lu e import! statements re$eren%ing the names o$ the %lasses or inter$a%es that you are using &e.g., import!com.commonsware.android..Somet&ing'. 4his is true even i$ these %lasses are in your o=n pa%kage O you have to import them any=ay. /e:t, parameters %an be %lassi$ie as in, out, or inout. +alues that are out or inout %an be %hange by the servi%e an those %hanges =ill be propagate ba%k to the %lient. !rimitives &e.g., int' %an only be inP =e in%lu e in $or the A-AL $or enable:; Nust $or illustration purposes. Also, you %annot thro= any e:%eptions. @ou =ill nee to %at%h all e:%eptions in your %o e, eal =ith them, an return $ailure in i%ations some other =ay &e.g., error %o e return values'. /ame your A-AL $iles =ith the .aidl e:tension an pla%e them in the proper ire%tory base on the pa%kage name.
-;4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Service

When you buil your proNe%t, either via an -AI or via Ant, the aidl utility $rom the An roi #AE =ill translate your A-AL into a server stub an a %lient pro:y.

Implement the Inter, ce


7iven the A-AL2%reate server stub, no= you nee to implement the servi%e, either ire%tly in the stub, or by routing the stub implementation to other metho s you have alrea y =ritten. 4he me%hani%s o$ this are $airly straight$or=ar *

Create a private instan%e o$ the A-AL2generate .Ceat&er.Stub'

.Stub

%lass &e.g.,

-mplement metho s mat%hing up =ith ea%h o$ the metho s you pla%e in the A-AL Return this private instan%e $rom your on6ind:; metho Service sub%lass in the

(or e:ample, here is the .Ceat&er.Stub instan%e*


private!final!.Ceat&er.Stub!binder$new!.Ceat&er.Stu!:;!8 !!public!String!get"orecast(age:;!8 !!!!return:get"orecast(ageImpl:;;5 !!< <5

-n this %ase, the stub %alls the %orrespon ing metho on the servi%e itsel$. 4hat metho , =hi%h simply returns the %a%he most2re%ent =eather $ore%ast $or the %urrent lo%ation, is sho=n belo=*
sync&roni(ed!private!String!get"orecast(ageImpl:;!8 !!return:forecast;5 <

/ote that A-AL -!C %alls are syn%hronous, an so the %aller is blo%ke until the -!C metho returns. )en%e, your servi%es nee to be ;ui%k about their =ork.
-;7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Service

+anifest /estiny
(inally, you nee to a the servi%e to your AndroidManifest.xml $ile, $or it to be re%ogniMe as an available servi%e $or use. 4hat is simply a matter o$ a ing a service element as a %hil o$ the application element, provi ing android#name to re$eren%e your servi%e %lass. (or e:ample, here is the AndroidManifest.xml $ile $or Weather!lus*
">xml!version$%?.@%!encoding$%utf-A%>' "manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!pac age$%com.commonsware.android.service%' !!"uses-permission!android#name$%android.permission.7.6RA-*%!/' !!"uses-permission!android#name$%android.permission../-*R/*-%!/' !!"uses-permission!android#name$%android.permission.A))*SS_+,)A-.,/%!/' !!"uses-permission!android#name$%android.permission.A))*SS_M,)M_+,)A-.,/%!/' !!"application!android#label$%9string/app_name%' !!!!"activity!android#name$%.Ceat&er1lus%!android#label$%9string/app_name%' !!!!!!"intent-filter' !!!!!!!!"action!android#name$%android.intent.action.MA./%!/' !!!!!!!!"category!android#name$%android.intent.category.+A2/)3*R%!/' !!!!!!"/intent-filter' !!!!"/activity' !!!!"service!android#name$%.Ceat&er1lusService%!/' !!"/application' "/manifest'

#in%e the servi%e %lass is in the same Gava namespa%e as everything else in this appli%ation, =e %an use the shorthan ot2notation &%.Ceat&er1lusService%' to re$eren%e our %lass. -$ you =ish to re;uire some permission o$ those =ho =ish to start or bin to the servi%e, a an android#permission attribute naming the permission you are man ating O see the %hapter on permissions $or more etails.

obbing ,ne ,ver the !ence


Classi% -!C is one2=ay* the %lient %alls $un%tions on the servi%e. -t is possible, through the %reative use o$ A-AL, to allo= the servi%e to %all ba%k into an a%tivity. )o=ever, this is a bit $ragile, as the servi%e may not kno= i$ the a%tivity is still aroun or i$ it has been kille o$$ to $ree up some memory.
-;9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Service

An alternative approa%h, $irst mentione in the %hapter on .ntent $ilters, is to have the servi%e sen a broa %ast .ntent that %an be pi%ke up by the a%tivity...assuming the a%tivity is still aroun an is not pause . We =ill e:amine the %lient si e o$ this e:%hange in the ne:t %hapterP $or no=, let us e:amine ho= the servi%e %an sen a broa %ast. 4he theory behin the Ceat&er1lusService implementation is that the servi%e gets Qti%kle Q =hen the evi%e &or emulator' position %hanges. At that point, the servi%e %alls out to the Web servi%e an generates a ne= $ore%ast Web page $or the a%tivity to isplay. At the same time, though, the servi%e also sen s a broa %ast, to alert the a%tivity that there is a page up ate available i$ it =ants it. )ere is the high2level implementation o$ the a$orementione $lo=*
private!void!update"orecast:+ocation!loc;!8 !!String!url$String.format:formatG!loc.getLatitude:;G !!!!!!!!!!!!!!!!!!!!!!!!!!!loc.getLongitude:;;5 !!3ttp0et!getMet&od$new!,ttpGet:url;5 !!try!8 !!!!Response3andler"String'!response3andler$new!Basic$esponse,andler:;5 !!!!String!response6ody$client.execute:getMet&odG!response3andler;5 !!!!String!page$generate(age:!uild"orecasts:response6ody;;5 !!!!sync&roni(ed:t&is;!8 !!!!!!forecast$page5 !!!!< !!!!sendBroadcast:broadcast;5 !!< !!catc&!:-&rowable!t;!8 !!!!android.util.+og.e:%Ceat&er1lus%G !!!!!!!!!!!!!!!!!!!!!!!%*xception!in!updateEorecast:;%G!t;5 !!< <

Mu%h o$ this is similar to the e;uivalent pie%e o$ the original Weather emo O per$orm the )44! re;uest, %onvert that into a set o$ Eorecast obNe%ts, an turn those into a Web page. 4he $irst i$$eren%e is that the Web page is simply %a%he in the servi%e, sin%e the servi%e %annot ire%tly put the page into the a%tivity6s Ceb7iew. 4he se%on i$$eren%e is that =e %all send6roadcast:;, =hi%h takes an -ntent an sen s it out to all intereste parties. 4hat .ntent is e%lare up $ront in the %lass prologue*
-*;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Creating a Service

private!.ntent!broadcast$new!Intent:6R,AD)AS-_A)-.,/;5

)ere, 6R,AD)AS-_A)-.,/ is simply a stati% String =ith a value that =ill istinguish this .ntent $rom all others*
public!static!final!String!6R,AD)AS-_A)-.,/$ !!!!!!!!!!%com.commonsware.android.service.Eorecast2pdate*vent%5

WhereAs the 3emote: (nd the 3est of the Code:


-n An roi , servi%es %an either be lo%al or remote. Lo%al servi%es run in the same pro%ess as the laun%hing a%tivityP remote servi%es run in their o=n pro%ess. A etaile is%ussion o$ remote servi%es =ill be a e to a $uture e ition o$ this book. We =ill return to this servi%e in the %hapter on lo%ation2base servi%es, at =hi%h point =e =ill $lesh out ho= lo%ations are tra%ke &an , in this %ase, mo%ke up'.

-**
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER &2

8nvoking a Service

#ervi%es %an be use by any appli%ation %omponent that Qhangs aroun Q $or a reasonable perio o$ time. 4his in%lu es a%tivities, %ontent provi ers, an other servi%es. /otably, it oes not in%lu e pure intent re%eivers &i.e., intent re%eivers that are not part o$ an a%tivity', sin%e those =ill get garbage %olle%te imme iately a$ter ea%h instan%e pro%esses one in%oming .ntent. 4o use a servi%e, you nee to get an instan%e o$ the A-AL inter$a%e $or the servi%e, then %all metho s on that inter$a%e as i$ it =ere a lo%al obNe%t. When one, you %an release the inter$a%e, in i%ating you no longer nee the servi%e. -n this %hapter, =e =ill look at the %lient si e o$ the Weather!lus sample appli%ation &Ceat&er1lus'. 4he Weather!lus a%tivity looks an a=$ul lot like the original Weather appli%ation O Nust a Web page sho=ing a =eather $ore%ast*

-*Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

8nvoking a Service

!igure 4$< The WeatherPlus service client

4he i$$eren%e is that, as the emulator QmovesQ, the =eather $ore%ast %hanges, base on up ates provi e by the servi%e.

Bound for Success


4o use a servi%e, you $irst nee to %reate an instan%e o$ your o=n Service)onnection %lass. Service)onnection, as the name suggests, represents your %onne%tion to the servi%e $or the purposes o$ making -!C %alls. (or e:ample, here is the Service)onnection $rom the Ceat&er1lus %lass in the Ceat&er1lus proNe%t*
private!Service)onnection!svc)onn$new!Ser iceConnection:;!8 !!public!void!onSer iceConnected:)omponent/ame!class/ameG !!!!!!!!!!!!!!!!!!.6inder!binder;!8 !!!!service$.Ceat&er.Stub.asInterface:binder;5 !!!!browser.postDelayed:new!$unna!le:;!8 !!!!!!public!void!run:;!8 !!!!!!!!update"orecast:;5 !!!!!!< !!!!<G!?@@@;5 !!<

-*$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

8nvoking a Service

!!public!void!onSer iceDisconnected:)omponent/ame!class/ame;!8 !!!!service$null5 !!< <5

@our Service)onnection sub%lass nee s to implement t=o metho s* ,.


onService)onnected:;,

the servi%e

=hi%h is %alle on%e your a%tivity is boun to

2. onServiceDisconnected:;, =hi%h is %alle i$ your %onne%tion en s normally, su%h as you unbin ing your a%tivity $rom the servi%e Ia%h o$ those metho s re%eives a )omponent/ame, =hi%h simply i enti$ies the servi%e you %onne%te to. More importantly, onService)onnected:; re%eives an .6inder instan%e, =hi%h is your gate=ay to the -!C inter$a%e. @ou =ill =ant to %onvert the .6inder into an instan%e o$ your A-AL inter$a%e %lass, so you %an use -!C as i$ you =ere %alling regular metho s on a regular Gava %lass &.Ceat&er.Stub.as.nterface:binder;'. 4o a%tually hook your a%tivity to the servi%e, %all bindService:; on the a%tivity*
!indSer ice:service.ntentG!svc)onnG!6./D_A2-,_)R*A-*;5

4he bindService:; metho takes three parameters* ,. An .ntent representing the servi%e you =ish to invoke O $or your o=n servi%e, it6s easiest to use an intent re$eren%ing the servi%e %lass ire%tly &new!.ntent:t&isG!Ceat&er1lusService.class;'

2. @our Service)onnection instan%e ?. A set o$ $lags O most times, you =ill =ant to pass in 6./D_A2-,_)R*A-*, =hi%h =ill start up the servi%e i$ it is not alrea y running A$ter your bindService:; %all, your onService)onnected:; %allba%k in the Service)onnection =ill eventually be invoke , at =hi%h time your %onne%tion is rea y $or use.

-*0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

8nvoking a Service

3equest for Service


>n%e your servi%e inter$a%e obNe%t is rea y &.Ceat&er.Stub.as.nterface:binder;', you %an start %alling metho s on it as you nee to. -n $a%t, i$ you isable some =i gets a=aiting the %onne%tion, no= is a $ine time to re2enable them. )o=ever, you =ill =ant to trap t=o e:%eptions. >ne is Dead,bject*xception O i$ this is raise , your servi%e %onne%tion terminate une:pe%te ly. -n this %ase, you shoul un=in your use o$ the servi%e, perhaps by %alling onServiceDisconnected:; manually, as sho=n above. 4he other is Remote*xception, =hi%h is a more general2purpose e:%eption in i%ating a %ross2pro%ess %ommuni%ations problem. Again, you shoul probably un=in your use o$ the servi%e.

Prometheus >nbound
When you are one =ith the -!C inter$a%e, %all unbindService:;, passing in the Service)onnection. Iventually, your %onne%tion6s onServiceDisconnected:; %allba%k =ill be invoke , at =hi%h point you shoul null out your inter$a%e obNe%t, isable relevant =i gets, or other=ise $lag yoursel$ as no longer being able to use the servi%e. (or obNe%t. @ou %an al=ays re%onne%t to the servi%e, via bindService:;, i$ you nee to use it again. e:ample, in the Weather!lus implementation o$ sho=n above, =e null out the .Ceat&er servi%e

onServiceDisconnected:;

+anual Transmission
-n a ition to bin ing to the servi%e $or the purposes o$ -!C, you %an manually start an stop the servi%e. 4his is parti%ularly use$ul in %ases =here you =ant the servi%e to keep running in epen ently o$ your a%tivities O
-*1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

8nvoking a Service

other=ise, on%e you unbin the servi%e, your servi%e %oul =ell be %lose o=n. 4o start a servi%e, simply %all startService:;, provi ing t=o parameters* ,. 4he .ntent spe%i$ying the servi%e to start &again, the easiest =ay is probably to spe%i$y the servi%e %lass, i$ its your o=n servi%e'

2. A 6undle provi ing %on$iguration ata, =hi%h eventually gets passe to the servi%e6s onStart:; metho Conversely, to stop the servi%e, %all stopService:; =ith the .ntent you use in the %orrespon ing startService:; %all.

Catching the ob
-n the pre%e ing %hapter, =e sho=e ho= the servi%e sen s a broa %ast to let the Ceat&er1lus a%tivity kno= a %hange =as ma e to the $ore%ast base on movement. /o=, =e %an see ho= the a%tivity re%eives an uses that broa %ast. )ere are the implementations o$ onResume:; an on1ause:; $or Ceat&er1lus*
9,verride public!void!on$esume:;!8 !!super.on$esume:;5 !!register$ecei er:receiverG !!!!!!!!new!Intent"ilter:Ceat&er1lusService.6R,AD)AS-_A)-.,/;;5 < 9,verride public!void!on(ause:;!8 !!super.on(ause:;5 !!unregister$ecei er:receiver;5 <

-n onResume:;, =e register a stati% 6roadcastReceiver to re%eive .ntents mat%hing the a%tion e%lare by the servi%e. -n on1ause:;, =e isable that

-*4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

8nvoking a Service

6roadcastReceiver,

sin%e =e =ill not be re%eiving any su%h .ntents =hile

pause , any=ay. 4he 6roadcastReceiver, in turn, simply arranges to up ate the $ore%ast on the "- threa *
private!6roadcastReceiver!receiver$new!Broadcast$ecei er:;!8 !!public!void!on$ecei e:)ontext!contextG!.ntent!intent;!8 !!!!runOn)iThread:new!$unna!le:;!8 !!!!!!public!void!run:;!8 !!!!!!!!update"orecast:;5 !!!!!!< !!!!<;5 !!< <5

An updateEorecast:; uses the inter$a%e stub to %all into the servi%e an retrieve the latest $ore%ast page, also han ling the %ase =here the $ore%ast is not yet rea y &null'*
private!void!update"orecast:;!8 !!try!8 !!!!String!page$service.get"orecast(age:;5 !!!!if!:page$$null;!8 !!!!!!browser.postDelayed:new!$unna!le:;!8 !!!!!!!!public!void!run:;!8 !!!!!!!!!!update"orecast:;5 !!!!!!!!< !!!!!!<G!O@@@;5 !!!!!!-oast !!!!!!!!.makeText:t&isG!%/o!forecast!available%G!HL@@; !!!!!!!!.show:;5 !!!!< !!!!else!8 !!!!!!browser.loadData&ithBase)$L:nullG!pageG!%text/&tml%G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%2-E-A%G!null;5 !!!!< !!< !!catc&!:final!-&rowable!t;!8 !!!!svc)onn.onSer iceDisconnected:null;5 !!!!runOn)iThread:new!$unna!le:;!8 !!!!!!public!void!run:;!8 !!!!!!!!goBlooey:t;5 !!!!!!< !!!!<;5

-*7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

8nvoking a Service

!!< <

-*9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER '6

(lerting >sers Fia 5otifications

!op2up messages. 4ray i%ons an their asso%iate QbubbleQ messages. .oun%ing o%k i%ons. @ou are no oubt use to programs trying to get your attention, sometimes $or goo reason. @our phone also probably %hirps at you $or more than Nust in%oming %alls* lo= battery, alarm %lo%ks, appointment noti$i%ations, in%oming te:t message or email, et%. /ot surprisingly, An roi has a =hole $rame=ork $or ealing =ith these sorts o$ things, %olle%tively %alle Qnoti$i%ationsQ.

Types of Pestering
A servi%e, running in the ba%kgroun , nee s a =ay to users kno= something o$ interest has o%%urre , su%h as =hen email has been re%eive . Moreover, the servi%e may nee some =ay to steer the user to an a%tivity =here they %an a%t upon the event O rea ing a re%eive message, $or e:ample. (or this, An roi supplies status bar i%ons, $lashing lights, an other in i%ators %olle%tively kno=n as Qnoti$i%ationsQ. @our %urrent phone may =ell have su%h i%ons, to in i%ate battery li$e, signal strength, =hether .luetooth is enable , an the like. With An roi , appli%ations %an a their o=n status bar i%ons, =ith an eye to=ar s having them appear only =hen nee e &e.g., a message has arrive '.
-%*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(lerting >sers Fia 5otifications

-n An roi , you %an raise noti$i%ations via the /otificationManager. 4he /otificationManager is a system servi%e. 4o use it, you nee to get the servi%e obNe%t via getSystemService:/,-.E.)A-.,/_S*R7.)*; $rom your a%tivity. 4he /otificationManager gives you three metho s* one to pester &notify:;' an t=o to stop pestering &cancel:; an cancelAll:;'. 4he notify:; metho takes a /otification, =hi%h is a ata stru%ture that spells out =hat $orm your pestering shoul take. )ere is =hat is at your isposal &bearing in min that not all evi%es =ill ne%essarily support all o$ these'*

H rd# re "oti,ic tions


@ou %an $lash LIAs on the evi%e by setting lights to true, also spe%i$ying the %olor &as an DAR06 value in ledAR06' an =hat pattern the light shoul blink in &by provi ing o$$Uon urations in millise%on s $or the light via led,nMS an led,ffMS'. @ou %an play a soun , using a 2ri to a pie%e o$ %ontent hel , perhaps, by a )ontentManager &sound'. 4hink o$ this as a QringtoneQ $or your appli%ation. @ou %an vibrate the evi%e, %ontrolle via a longPQ in i%ating the onUo$$ patterns &in millise%on s' $or the vibration &vibrate'. @ou might o this by e$ault, or you might make it an option the user %an %hoose =hen %ir%umstan%es re;uire a more subtle noti$i%ation than a ringtone.

Icons
While the $lashing lights, soun s, an vibrations are aime at getting somebo y to look at the evi%e, i%ons are esigne to take them the ne:t step an tell them =hat6s so important. 4o set up an i%on $or a /otification, you nee to set icon, =here you provi e the i enti$ier o$ a Drawable resour%e representing the i%on, an
-%%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(lerting >sers Fia 5otifications

content.ntent, =here you supply an 1ending.ntent to be raise is %li%ke . @ou shoul be sure the 1ending.ntent =ill

=hen the i%on be %aught by something, perhaps your o=n appli%ation %o e, to take appropriate steps to let the user eal =ith the event triggering the noti$i%ation. @ou %an also supply a te:t blurb to appear =hen the i%on is put on the status bar &tic er-ext'. -$ you =ant all three, the simpler approa%h is to %all set+atest*vent.nfo:;, =hi%h =raps all three o$ those in a single %all.

Seeing Pestering in (ction


Let us no= take a peek at the /oti$y, sample proNe%t, in parti%ular the /otifyDemo %lass*
public!class!/otifyDemo!extends!Activity!8 !!private!static!final!int!/,-.EF_M*_.D$?IIV5 !!private!-imer!timer$new!Timer:;5 !! !!9,verride !!public!void!onCreate:6undle!saved.nstanceState;!8 !!!!super.onCreate:saved.nstanceState;5 !!!!setContentView:R.layout.main;5 !!!! !!!!6utton!btn$:6utton;findViewById:R.id.notify;5 !!!! !!!!btn.setOnClickListener:new!7iew.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!view;!8 !!!!!!!!-imer-as !tas $new!TimerTask:;!8 !!!!!!!!!!public!void!run:;!8 !!!!!!!!!!!!notify'e:;5 !!!!!!!!!!< !!!!!!!!<5 !!!! !!!!!!!!timer.schedule:tas G!L@@@;5 !!!!!!< !!!!<;5 !!!! !!!!btn$:6utton;findViewById:R.id.cancel;5 !!!! !!!!btn.setOnClickListener:new!7iew.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!view;!8 !!!!!!!!/otificationManager!mgr$ !!!!!!!!!!:/otificationManager;getSystemSer ice:/,-.E.)A-.,/_S*R7.)*;5

-%Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(lerting >sers Fia 5otifications

!!!!!!!!!! !!!!!!!!mgr.cancel:/,-.EF_M*_.D;5 !!!!!!< !!!!<;5 !!< !! !!private!void!notify'e:;!8 !!!!final!/otificationManager!mgr$ !!!!!!:/otificationManager;getSystemSer ice:/,-.E.)A-.,/_S*R7.)*;5 !!!!/otification!note$new!%otification:R.drawable.red_ballG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!%Status!messageX%G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!System.currentTime'illis:;;5 !!!!1ending.ntent!i$1ending.ntent.get#cti ity:t&isG!@G !!!!!!!!!!!!!!!!!!!!!!!!!!!new!Intent:t&isG!/otifyMessage.class;G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!@;5 !!!! !!!!note.setLatest* entInfo:t&isG!%/otification!-itle%G !!!!!!!!!!!!!!!!!!!!!!!!!!!%-&is!is!t&e!notification!message%G!i;5 !!!! !!!!mgr.notify:/,-.EF_M*_.DG!note;5 !!< <

4his a%tivity sports t=o large buttons, one to ki%k o$$ a noti$i%ation a$ter a $ive2se%on elay, an one to %an%el that noti$i%ation &i$ it is a%tive'*

!igure 40< The 5otify/emo activity main vie)

Creating the noti$i%ation, in notifyMe:;, is a%%omplishe in $ive steps*


-%$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(lerting >sers Fia 5otifications

,.

7et a%%ess to the /otificationManager instan%e

2. Create a /otification obNe%t =ith our i%on &re ball', a message to $lash on the status bar as the noti$i%ation is raise , an the time asso%iate =ith this event ?. Create a 1ending.ntent that =ill trigger the isplay o$ another a%tivity &/otifyMessage' <. "se set+atest*vent.nfo:; to spe%i$y that, =hen the noti$i%ation is %li%ke on, =e are to isplay a %ertain title an message, an i$ that is %li%ke on, =e laun%h the 1ending.ntent B. 4ell the /otificationManager to isplay the noti$i%ation )en%e, i$ =e %li%k the top button, a$ter $ive se%on s, our re ball i%on =ill appear in the status bar, brie$ly along =ith our status message*

!igure 41< ,ur notification as it appears on the status bar6 )ith our status message

-$ you %li%k on the re ball, a ra=er =ill appear beneath the status bar. Arag that ra=er all the =ay to the bottom o$ the s%reen to sho= the outstan ing noti$i%ations, in%lu ing our o=n*

-%0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(lerting >sers Fia 5otifications

!igure 44< The notifications dra)er6 fully expanded6 )ith our notification

-$ you %li%k on the noti$i%ation entry in the ra=er, you6ll be taken to a trivial a%tivity isplaying a message O though in a real appli%ation, this a%tivity =oul o something use$ul base upon the event that o%%urre &e.g., take users to the ne=ly2arrive mail messages'. Cli%king on the %an%el button, or %li%king on the Clear /oti$i%ations button in the ra=er, =ill remove the re ball $rom the status bar.

-%1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

PART VI Other Android Capabilities

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER '1

(ccessing ocation"Based Services

A popular $eature on %urrent2era mobile evi%es is 7!# %apability, so the evi%e %an tell you =here you are at any point in time. While the most popular use o$ 7!# servi%e is mapping an ire%tions, there are other things you %an o i$ you kno= your lo%ation. (or e:ample, you might set up a ynami% %hat appli%ation =here the people you %an %hat =ith are base on physi%al lo%ation, so you6re %hatting =ith those you are nearest. >r, you %oul automati%ally QgeotagQ posts to 4=itter or similar servi%es. 7!# is not the only =ay a mobile Alternatives in%lu e*

evi%e %an i enti$y your lo%ation.

4he Iuropean e;uivalent to 7!#, %alle 7alileo, =hi%h is still un er evelopment at the time o$ this =riting Cell to=er triangulation, =here your position is etermine base on signal strength to nearby %ell to=ers !ro:imity to publi% Wi(i QhotspotsQ that have kno=n geographi% lo%ations

An roi evi%es may have one or more o$ these servi%es available to them. @ou, as a eveloper, %an ask the evi%e $or your lo%ation, plus etails on =hat provi ers are available. 4here are even =ays $or you to simulate your lo%ation in the emulator, $or use in testing your lo%ation2enable appli%ations.

-%9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

ocation ProvidersH They @no) Where .ouAre Diding


An roi evi%es %an have a%%ess to several i$$erent means o$ etermining your lo%ation. #ome =ill have better a%%ura%y than others. #ome may be $ree, =hile others may have a %ost asso%iate =ith them. #ome may be able to tell you more than Nust your %urrent position, su%h as your elevation over sea level, or your %urrent spee . An roi , there$ore, has abstra%te all this out into a set o$ +ocation1rovider! obNe%ts. @our An roi environment =ill have Mero or more +ocation1rovider! instan%es, one $or ea%h istin%t lo%ating servi%e that is available on the evi%e. !rovi ers kno= not only your lo%ation, but their o=n %hara%teristi%s, in terms o$ a%%ura%y, %ost, et%. @ou, as a eveloper, =ill use a +ocationManager, =hi%h hol s the set, to $igure out =hi%h +ocation1rovider is right $or your parti%ular %ir%umstan%e. @ou =ill also nee the A))*SS_+,)A-.,/ permission in your appli%ation, or the various lo%ation A!-s =ill $ail ue to a se%urity violation. Aepen ing on =hi%h lo%ation provi ers you =ish to use, you may nee other permissions as =ell, su%h as A))*SS_01S, A))*SS_ASS.S-*D_01S, A))*SS_)*++_.D, or, as the Weather!lus sample re;uires, A))*SS_M,)M_+,)A-.,/.
+ocation1rovider

!inding .ourself
4he obvious thing to o =ith a lo%ation servi%e is to $igure out =here you are right no=. 4o o that, you nee to get a +ocationManager O %all $rom your a%tivity or servi%e an %ast it

getSystemService:+,)A-.,/_S*R7.)*; to be a +ocationManager.

4he ne:t step to $in

+ocation1rovider you =ant to use.

out =here you are is to get the name o$ the )ere, you have t=o main options*

--;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

,.

Ask the user to pi%k a provi er

2. (in the best2mat%h provi er base on a set o$ %riteria -$ you =ant the user to pi%k a provi er, %alling get1roviders:; on the +ocationManager =ill give you a +ist o$ provi ers, =hi%h you %an then present to the user $or sele%tion. >r, you %an %reate an populate a )riteria obNe%t, stating the parti%ulars o$ =hat you =ant out o$ a +ocation1rovider, su%h as*
setAltitudeReJuired:;

not
setAccuracy:;

to in i%ate i$ you nee the %urrent altitu e or

to set a minimum level o$ a%%ura%y, in meters, $or the

position

to %ontrol i$ the provi er must be $ree or i$ it %an in%ur a %ost on behal$ o$ the evi%e user
set)ostAllowed:;

7iven a $ille 2in )ritieria obNe%t, %all get6est1rovider:; on your +ocationManager, an An roi =ill si$t through the %riteria an give you the best ans=er. /ote that not all o$ your %riteria =ill be met O all but the monetary %ost %riterion might be rela:e i$ nothing mat%hes. (or e:ample, here is ho= Weather!lus#ervi%e $in s its lo%ation provi er*
void!ena!leLocation(oll:;!8 !!)riteria!criteria$new!Criteria:;5 !!criteria.set#ccuracy:)riteria.A))2RA)F_),ARS*;5 !!criteria.set#ltitude$e.uired:false;5 !!criteria.setCost#llowed:true;5 !!criteria.set(ower$e.uirement:)riteria.1,C*R_+,C;5 !!criteria.setSpeed$e.uired:false;5 !!String!provider$my+ocationManager.getBest(ro ider:criteriaG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!true;5 !!my+ocationManager.re.uestLocation)pdates:providerG!?@@@@G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!?@@@@.@fG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!on+ocation)&ange;5 <

--*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

>n%e you kno= the name o$ the +ocation1rovider, you %an %all get+astMnown1osition:; to $in out =here you =ere re%ently. /ote, ho=ever, that Qre%entlyQ might be $airly out o$ ate &e.g., phone =as turne o$$ ' or even null i$ there has been no lo%ation re%or e $or that provi er yet. >n the other han , get+astMnown1osition:; in%urs no monetary or po=er %ost, sin%e the provi er oes not nee to be a%tivate to get the value. 4hese metho s return a +ocation obNe%t, =hi%h %an give you the latitu e an longitu e o$ the evi%e in egrees as a Gava double. -$ the parti%ular lo%ation provi er o$$ers other ata, you %an get at that as =ell*

(or altitu e, &asAltitude:; =ill tell you i$ there is an altitu e value, an getAltitude:; =ill return the altitu e in meters. (or bearing &i.e., %ompass2style ire%tion', &as6earing:; =ill tell you i$ there is a bearing available, an get6earing:; =ill return it as egrees east o$ true north. (or spee , &asSpeed:; =ill tell you i$ the spee is kno=n an getSpeed:; =ill return the spee in meters per se%on .

A more likely approa%h to getting the +ocation $rom a +ocation1rovider, though, is to register $or up ates, as es%ribe in the ne:t se%tion.

,n the +ove
/ot all lo%ation provi ers are ne%essarily imme iately responsive. 7!#, $or e:ample, re;uires a%tivating a ra io an getting a $i: $rom the satellites be$ore you get a lo%ation. 4hat is =hy An roi oes not o$$er a getMeMy)urrent+ocation/ow:; metho . Combine that =ith the $a%t that your users may =ell =ant their movements to be re$le%te in your appli%ation, an you are probably best o$$ registering $or lo%ation up ates an using that as your means o$ getting the %urrent lo%ation. 4he %o e sample sho=n in the pre%e ing se%tion not only sho=s $in ing the best2available provi er via a set o$ )riteria, but it also sho=s ho= to register $or up ates O %all reJuest+ocation2pdates:; on your +ocationManager! instan%e. 4his takes $our parameters*
--%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

,.

4he name o$ the lo%ation provi er you =ish to use

2. )o= long, in millise%on s, must have elapse be$ore =e might get a lo%ation up ate ?. )o= $ar, in meters, must the evi%e have move be$ore =e might get a lo%ation up ate <. A +ocation+istener that =ill be noti$ie events, as sho=n belo=* o$ key lo%ation2relate

+ocation+istener!on+ocation)&ange$new!LocationListener:;!8 !!public!void!onLocationChanged:+ocation!location;!8 !!!!update"orecast:location;5 !!< !!public!void!on(ro iderDisa!led:String!provider;!8 !!!!//!reJuired!for!interfaceG!not!used !!< !!public!void!on(ro ider*na!led:String!provider;!8 !!!!//!reJuired!for!interfaceG!not!used !!< !!public!void!onStatusChanged:String!providerG!int!statusG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!6undle!extras;!8 !!!!//!reJuired!for!interfaceG!not!used !!< <5

)ere, all =e o is %all updateEorecast:; =ith the +ocation supplie to the on+ocation)&anged:; %allba%k metho . 4he updateEorecast:;! implementation, as sho=n in the %hapter on %reating servi%es, buil s a Web page =ith the %urrent $ore%ast $or the lo%ation an sen s a broa %ast so the a%tivity kno=s an up ate is available. When you no longer nee the up ates, %all remove2pdates:; =ith the +ocation+istener you registere .

(re We There .et: (re We There .et: (re We There .et:


#ometimes, you =ant to kno= not =here you are no=, or even =hen you move, but =hen you get to =here you6re going. 4his %oul be an en
--Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

estination, or it %oul be getting to the ne:t step on a set o$ ire%tions, so you %an give the user the ne:t turn. 4o a%%omplish this, +ocationManager o$$ers add1roximityAlert:;. 4his registers an 1ending.ntent, =hi%h =ill be $ire o$$ =hen the evi%e gets =ithin a %ertain istan%e o$ a %ertain lo%ation. 4he add1roximityAlert:;! metho takes, as parameters*

4he latitu e an longitu e o$ the position that you are intereste in A ra ius, spe%i$ying ho= %lose you shoul be to that position $or the .ntent to be raise A uration $or the registration, in millise%on s O a$ter this perio , the registration automati%ally lapses. A value o$ -? means the registration lasts until you manually remove it via remove1roximityAlert:;. 4he 1ending.ntent to be raise =hen the evi%e is =ithin the Qtarget MoneQ e:presse by the position an ra ius

/ote that it is not guarantee that you =ill a%tually re%eive an .ntent, i$ there is an interruption in lo%ation servi%es, or i$ the evi%e is not in the target Mone uring the perio o$ time the pro:imity alert is a%tive. (or e:ample, i$ the position is o$$ by a bit, an the ra ius is a little too tight, the evi%e might only skirt the e ge o$ the target Mone, or go by so ;ui%kly that the evi%e6s lo%ation isn6t sample =hile in the target Mone. -t is up to you to arrange $or an a%tivity or intent re%eiver to respon to the .ntent you register =ith the pro:imity alert. What you then o =hen the .ntent arrives is up to you* set up a noti$i%ation &e.g., vibrate the evi%e', log the in$ormation to a %ontent provi er, post a message to a Web site, et%. /ote that you =ill re%eive the .ntent =henever the position is sample an you are =ithin the target Mone O not Nust upon entering the Mone. )en%e, you =ill get the .ntent several times, perhaps ;uite a $e= times epen ing on the siMe o$ the target Mone an the spee o$ the evi%e6s movement.

--$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

Testing<<<Testing<<<
4he An roi emulator oes not have the ability to get a $i: $rom 7!#, triangulate your position $rom %ell to=ers, or i enti$y your lo%ation by some nearby Wi(i signal. #o, i$ you =ant to simulate a moving evi%e, you =ill nee to %reate an use a mo%k lo%ation provi er. 4his basi%ally allo=s you to a in your o=n sour%e o$ lo%ation in$ormation an use that in testing your appli%ations. As part o$ the Weather!lus appli%ation, you =ill $in a $rame=ork $or mo%k lo%ation provi ers, %alle Moc ery. 4his se%tion =ill e:plain ho= Moc ery! =orks an ho= Weather!lus integrates =ith it to simulate a moving evi%e.

:eed %e? See %ore?


.e$ore =e get into Moc ery, though, =e $irst nee $ee s. to talk about lo%ation

When you think about it, a lo%ation provi er shoul really supplying a stea y $ee o$ lo%ations. @ou ask the provi er $or a lo%ation, an it tells you =here you are. /o=, the pra%ti%alities o$ 7!# an %ell to=er triangulation mean that +ocation1rovider %annot be =ritten that =ay. .ut, $or our lo%ation mo%king $rame=ork, =e %an sa$ely avoi reality. )en%e, the Moc ery $rame=ork has the notion o$ a lo%ation $ee , e$ine via the ._+ocationEeed inter$a%e*
pac age!com.commonsware.android.service5 import!android.location.+ocation5 public!interface!._+ocationEeed!8 !!+ocation!get%extLocation:;5 <

A Moc ery =ill use a lo%ation $ee to $in out the lo%ations it shoul pour into the An roi mo%k lo%ation provi er system. .y using an inter$a%e, =e

--0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

%oul , in prin%iple %reate $ee s that pull $rom $iles, $rom an array o$ +ocations har =ire in %o e, or =herever else =e %hoose. -n Weather!lus, =e have a +inear+ocationEeed. 4his %lass takes a beginning an en ing position, plus a length o$ time it shoul take to move bet=een them. 4he $ee oles out lo%ations base on elapse time, in a straight line $rom beginning to en . >n%e the en is rea%he , it $lips ire%tion an starts to $ee ba%k the other =ay. 4his bears little resemblan%e to any real2=orl movements, but all it re;uires is t=o latitu eUlongitu e pairs, an so re;uires very little =ork.
class!+inear+ocationEeed!implements!._+ocationEeed!8 !!+ocation!start$null5 !!+ocation!end$null5 !!long!duration$@5 !!double!latDelta$@.@d5 !!double!lonDelta$@.@d5 !!long!timeStart$@5 !! !!LinearLocation"eed:+ocation!startG!+ocation!endG !!!!!!!!!!!!!!!!!!!!!long!duration;!8 !!!!t&is.start$start5 !!!!t&is.end$end5 !!!!t&is.duration$duration5 !!!! !!!!latDelta$end.getLatitude:;-start.getLatitude:;5 !!!!lonDelta$end.getLongitude:;-start.getLongitude:;5 !!< !! !!public!+ocation!get%extLocation:;!8 !!!!if!:timeStart$$@;!8 !!!!!!timeStart$System.currentTime'illis:;5 !!!!< !!!! !!!!long!now$System.currentTime'illis:;5 !!!!long!time*lapsed$now-timeStart5 !!!! !!!!w&ile!:time*lapsed'duration;!8 !!!!!!timeStart$timeStartBduration5 !!!!!!time*lapsed$now-timeStart5 !!!!!! !!!!!!+ocation!tmp$start5 !!!!!! !!!!!!start$end5 !!!!!!end$tmp5 !!!!!!latDelta$-?.@dRlatDelta5 !!!!!!lonDelta$-?.@dRlonDelta5 !!!!< !!!!

--1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

!!!!double!pct)omplete$:double;time*lapsed/:double;duration5 !!!! !!!!+ocation!result$new!Location:start;5 !!!! !!!!result.setLatitude:start.getLatitude:;B:pct)ompleteRlatDelta;;5 !!!!result.setLongitude:start.getLongitude:;B:pct)ompleteRlonDelta;;5 !!!!result.setTime:now;5 !!!! !!!!return:result;5 !!< <

% $in!

%oc$ery o, the Situ tion

7iven that =e have isolate the pro%ess o$ etermining the %urrent +ocation! in the lo%ation $ee %lasses, Moc ery itsel$ is $airly straight$or=ar *

the test lo%ation provi er to An roi i$ it is not there alrea y

Inable sai provi er >n a perio i% basis, ask the lo%ation $ee $or the %urrent lo%ation an pass that into An roi as the %urrent position o$ the test lo%ation provi er the

(or the perio i% up ates, =e use a -imer an a -imer-as , to avoi hea a%he o$ setting up our o=n ba%kgroun threa *
class!Moc ery!8 !!private!-imer!timer$null5 !!private!._+ocationEeed!feed$null5 !!private!+ocationManager!locMgr$null5 !!private!String!moc $null5 !! !!'ockery:._+ocationEeed!feedG!long!time6etween2pdatesG !!!!!!!!!!String!moc G!+ocationManager!locMgr;!8 !!!!t&is.feed$feed5 !!!!t&is.moc $moc 5 !!!!t&is.locMgr$locMgr5 !!!! !!!!timer$new!Timer:;5 !!!! !!!!if!:locMgr.get(ro ider:moc ;$$null;!8 !!!!!!locMgr.addTest(ro ider:moc G!falseG!falseG!falseG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!falseG!falseG!falseG!falseG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)riteria.1,C*R_+,CG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)riteria.A))2RA)F_),ARS*;5 !!!!<

--4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

(ccessing ocation"Based Services

!!!! !!!! !!!!locMgr.setTest(ro ider*na!led:moc G!true;5 !!!! !!!!-imer-as !tas $new!TimerTask:;!8 !!!!!!public!void!run:;!8 !!!!!!!!update:;5 !!!!!!< !!!!<5 !!!! !!!!timer.schedule#t"ixed$ate:tas G!@G!time6etween2pdates;5 !!< !! !!void!close:;!8 !!!!timer.cancel:;5 !!!!timer$null5 !!!!locMgr.setTest(ro ider*na!led:moc G!false;5 !!< !! !!private!void!update:;!8 !!!!+ocation!loc$feed.get%extLocation:;5 !!!! !!!!locMgr.setTest(ro iderLocation:moc G!loc;5 !!< <

Ch n!in! 7e ther P tterns


#o no= =e have a Moc ery %lass, to =hi%h =e %an han a lo%ation $ee , that =ill up ate a test lo%ation provi er in An roi . 4o use this $rom Ceat&er1lusService or any=here else, =e nee to both %reate our Moc ery! instan%e &to get the up ates starte ' an use that same test lo%ation provi er.
Ceat&er1lusService has an initMoc 1rovider:; metho , %alle startup, that han les the $irst part o$ this O initialiMing our Moc ery*
void!init'ock(ro ider:;!8 !!+ocation!start$new!Location:M,)M;5 !!+ocation!end$new!Location:M,)M;5 !!start.setLatitude:O@.VH;5 !!start.setLongitude:-VO.@;5 !!end.setLatitude:IO.@L;5 !!end.setLongitude:-??A.HL;5 !!._+ocationEeed!feed$new!LinearLocation"eed:startG!endG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!IN@@@@@;5 --7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

uring

(ccessing ocation"Based Services

!!moc ery$new!'ockery:feedG!L@@@G!M,)MG!my+ocationManager;5 <

)ere, =e %ra$t t=o lo%ations, one $or /e= @ork City an one $or Los Angeles, an have our +inear+ocationEeed set up to move bet=een them every hour &a.k.a., Qa brisk pa%eQ'. We then =ire in a Moc ery to have it pass the $ee 6s ata to the An roi test provi er system. 4he Ceat&er1lusService %lass6 enable+ocation1oll:; metho shoul , in theory, Nust use the M,)M test lo%ation provi er, to ensure =e use the same provi er that =e have mo%ke =ith the Moc ery. (or the purposes o$ illustration, though, enable+ocation1oll:; uses a )riteria obNe%t an $in s the best mat%h, using the same values as Moc ery uses to e$ine the test provi er.

--9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER '&

+apping )ith +apFie) and +ap(ctivity

>ne o$ 7oogle6s most popular servi%es O a$ter sear%h, o$ %ourse O is 7oogle Maps, =here you %an $in everything $rom the nearest piMMa parlor to ire%tions $rom /e= @ork City to #an (ran%is%o &only 2,00B miles9' to street vie=s an satellite imagery. An roi , not surprisingly, integrates 7oogle Maps. 4here is a mapping a%tivity available to users straight o$$ the main An roi laun%her. More relevant to you, as a eveloper, are Map7iew an MapActivity, =hi%h allo= you to integrate maps into your o=n appli%ations. /ot only %an you isplay maps, %ontrol the Moom level, an allo= people to pan aroun , but you %an tie in An roi 6s lo%ation2base servi%es to sho= =here the evi%e is an =here it is going. (ortunately, integrating basi% mapping $eatures into your An roi proNe%t is $airly easy. )o=ever, there is a $air bit o$ po=er available to you, i$ you =ant to get $an%y.

The Bare Bones


(ar an a=ay the simplest =ay to get a map into your appli%ation is to %reate your o=n sub%lass o$ MapActivity. Like +istActivity, =hi%h =raps up some o$ the smarts behin having an a%tivity ominate by a +ist7iew,
-$*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+apping )ith +apFie) and +ap(ctivity

MapActivity

han les some o$ the nuan%es o$ setting up an a%tivity ominate by a Map7iew.

-n your layout $or the MapActivity sub%lass, you nee to a an element name , at the time o$ this =riting, com.google.android.maps.Map7iew. 4his is the Qlonghan Q =ay to spell out the names o$ =i get %lasses, by in%lu ing the $ull pa%kage name along =ith the %lass name. 4his is ne%essary be%ause Map7iew is not in the com.google.android.widget namespa%e. @ou %an give the Map7iew =i get =hatever android#id attribute value you =ant, plus han le all the layout etails to have it ren er properly alongsi e your other =i gets. )o=ever, you o nee to have*
android#apiMey,

=hi%h in pro u%tion =ill nee to be a 7oogle Maps A!- key. (or no=, though, you %an substitute =hatever string you like here.
android#clic able!$!%true%,

pan through your map

i$ you =ant users to be able to %li%k an

(or e:ample, $rom the /oo@a=k sample appli%ation, here is the main layout*
">xml!version$%?.@%!encoding$%utf-A%>' "Relative+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#layout_widt&$%fill_parent% !!android#layout_&eig&t$%fill_parent%' !!"com.google.android.maps.Map7iew!android#id$%9Bid/map% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%fill_parent% !!!!android#apiMey$%/ooFaw % !!!!android#clic able$%true%!/' !!"+inear+ayout!android#id$%9Bid/(oom% !!!!android#layout_widt&$%wrap_content% !!!!android#layout_&eig&t$%wrap_content% !!!!android#layout_align1arent6ottom$%true% !!!!android#layout_align1arent+eft$%true%!/' "/Relative+ayout'

We6ll %over that mysterious (oom +inear+ayout in the ne:t se%tion. -n a ition, you =ill AndroidManifest.xml $ile* nee a %ouple o$ e:tra things in your

-$%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+apping )ith +apFie) and +ap(ctivity

4he ./-*R/*- an A))*SS_),ARS*_+,)A-.,/ permissions -nsi e your "application', a "uses-library' element android#name!$!%com.google.android.maps%, to in i%ate you are one o$ the optional An roi A!-s =ith using

)ere is the AndroidManifest.xml $ile $or /oo@a=k*


">xml!version$%?.@%!encoding$%utf-A%>' "manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!pac age$%com.commonsware.android.maps%' !!"uses-permission!android#name$%android.permission../-*R/*-%!/' !!"uses-permission!android#name$%android.permission.A))*SS_),ARS*_+,)A-.,/%!/' !! !!"application!android#label$%9string/app_name%' !!!!"uses-library!android#name$%com.google.android.maps%!/' !!!!"activity!android#name$%./ooFaw %!android#label$%9string/app_name%' !!!!!!"intent-filter' !!!!!!!!"action!android#name$%android.intent.action.MA./%!/' !!!!!!!!"category!android#name$%android.intent.category.+A2/)3*R%!/' !!!!!!"/intent-filter' !!!!"/activity' !!"/application' "/manifest'

4hat is pretty mu%h all you nee $or starters, plus to sub%lass your a%tivity $rom MapActivity. -$ you =ere to o nothing else, an built that proNe%t an tosse it in the emulator, you6 get a ni%e map o$ the =orl . /ote, ho=ever, that MapA%tivity is abstra%t O you nee to implement isRouteDisplayed:; to in i%ate i$ you are supplying some sort o$ riving ire%tions or not. -n theory, the user %oul pan aroun the map using the ire%tional pa . )o=ever, that6s not terribly use$ul =hen the user has the =hole =orl in her han s. #in%e a map o$ the =orl is not mu%h goo by itsel$, =e nee to a things... a $e=

Exercising .our Control


@ou %an $in your Map7iew =i get by find7iew6y.d:;, no i$$erent than any other =i get. 4he =i get itsel$ then o$$ers a getMap)ontroller:; metho .
-$Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+apping )ith +apFie) and +ap(ctivity

.et=een the Map7iew an Map)ontroller, you have a $air bit o$ %apability to etermine =hat the map sho=s an ho= it behaves. )ere are some likely $eatures you =ill =ant to use*

@oom
4he map o$ the =orl you start =ith is rather broa . "sually, people looking at a map on a phone =ill be e:pe%ting something a bit narro=er in s%ope, su%h as a $e= %ity blo%ks. @ou %an %ontrol the Moom level ire%tly via the setKoom:; metho on the Map)ontroller. 4his takes an integer representing the level o$ Moom, =here , is the =orl vie= an 2, is the tightest Moom you %an get. Ia%h level is a oubling o$ the e$$e%tive resolution* , has the e;uator measuring 2B3 pi:els =i e, =hile 2, has the e;uator measuring 238,<?B,<B3 pi:els =i e. #in%e the phone6s isplay probably oesn6t have 238,<?B,<B3 pi:els in either imension, the user sees a small map $o%use on one tiny %orner o$ the globe. A level o$ ,3 =ill sho= you several %ity blo%ks in ea%h imension an is probably a reasonable starting point $or you to e:periment =ith. -$ you =ish to allo= users to %hange the Moom level, you =ill nee to o a $e= things*

(irst, pi%k a spot on the s%reen =here you =ant the Moom %ontrols to appear. 4hese are not huge, an they only appear =hen being use , so they %an overlay the a%tual map itsel$ i$ you %hoose. -n the layout sho=n above, $or e:ample, the Moom %ontrols are pla%e over the map, in the lo=er2le$t %orner o$ the s%reen. @ou shoul use a +inear+ayout or other simple %ontainer $or the Moom %ontrols6 position in your layout. -n your a%tivity6s on)reate:; metho , get your Moom %ontrols6 %ontainer via find7iew6y.d:; A the result o$ map.getKoom)ontrols:; to that %ontainer a%tivity6s on)reate:;!

(or e:ample, here are the lines $rom the /ooFaw metho that a%%omplish the latter points*
-$$
Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

+apping )ith +apFie) and +ap(ctivity

7iew0roup!(oom$:7iew0roup;findViewById:R.id.(oom;5 (oom.addView:map.get2oomControls:;;5

4hen, you %an manually get the Moom %ontrols to appear by %alling displayKoom)ontrols:; on your Map7iew, or they =ill automati%ally appear =hen the user pans the map.

!igure 47< +ap )ith Koom indicator

Center
4ypi%ally, you =ill nee to %ontrol =hat the map is sho=ing, beyon the Moom level, su%h as the user6s %urrent lo%ation, or a lo%ation save =ith some ata in your a%tivity. 4o %hange the map6s position, %all set)enter:; on the Map)ontroller. 4his takes a 0eo1oint as a parameter. A 0eo1oint represents a lo%ation, via latitu e an longitu e. 4he %at%h is that the !oint stores latitu e an longitu e as integers representing the a%tual latitu e an longitu e multiplie by ?*N. 4his saves a bit o$ memory versus storing a float or double, an it probably spee s up some internal %al%ulations An roi nee s
-$0
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+apping )ith +apFie) and +ap(ctivity

to o to %onvert the 0eo1oint into a map position. )o=ever, it oes mean you have to remember to multiple the Qreal =orl Q latitu e an longitu e by ?*N.

3ugged Terrain
Gust as the 7oogle Maps you use on your $ull2siMe %omputer %an isplay satellite imagery, so too %an An roi maps. o$$ers toggleSatellite:;, =hi%h, as the names suggest, toggle on an o$$ this perspe%tive on the area being vie=e . @ou %an have the user trigger these via an options menu or, in the %ase o$ /ooFaw , via keypresses*
Map7iew
!9,verride !!public!boolean!on1eyDown:int! ey)odeG!Mey*vent!event;!8 !!!!if!: ey)ode!$$!Mey*vent.M*F),D*_S;!8 !!!!!!map.setSatellite:Xmap.isSatellite:;;5 !!!!!!return:true;5 !!!!< !!!!else!if!: ey)ode!$$!Mey*vent.M*F),D*_K;!8 !!!!!!map.display2oomControls:true;5 !!!!!!return:true;5 !!!!< !!!! !!!!return:super.on1eyDown: ey)odeG!event;;5 !!<

ayers >pon ayers


-$ you have ever use the $ull2siMe e ition o$ 7oogle Maps, you are probably use to seeing things overlai atop the map itsel$, su%h as Qpush2pinsQ in i%ating businesses near the lo%ation being sear%he . -n map parlan%e O an , $or that matter, in many serious graphi% e itors O the push2pins are on a separate layer than the map itsel$, an =hat you are seeing is the %omposition o$ the push2pin layer atop the map layer. An roi 6s mapping allo=s you to %reate layers as =ell, so you %an mark up the maps as you nee to base on user input an your appli%ation6s purpose. (or e:ample, /ooFaw uses a layer to sho= =here sele%t buil ings are lo%ate in the islan o$ Manhattan.

-$1
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+apping )ith +apFie) and +ap(ctivity

0verl y Cl sses
Any overlay you =ant to a to your map nee s to be implemente as a sub%lass o$ ,verlay. 4here is an .temi(ed,verlay sub%lass available i$ you are looking to a push2pins or the likeP .temi(ed,verlay simpli$ies this pro%ess. 4o atta%h an overlay %lass to your map, Nust %all get,verlays:; on your Map7iew an add:; your ,verlay instan%e to it*
Drawable!mar er$get$esources:;.getDrawa!le:R.drawable.mar er;5 mar er.setBounds:@G!@G!mar er.getIntrinsic&idth:;G !!!!!!!!!!!!!!!!!!!!!!!mar er.getIntrinsic,eight:;;5 map.getO erlays:;.add:new!SitesO erlay:mar er;;5

We =ill e:plain that mar er in Nust a bit.

Dr #in! the ItemiAed0verl y


As the name suggests, .temi(ed,verlay allo=s you to supply a list o$ points o$ interest to be isplaye on the map O spe%i$i%ally, instan%es o$ ,verlay.tem. 4he overlay, then, han les mu%h o$ the ra=ing logi% $or you. )ere are the minimum steps to make this =ork*

(irst, overri e .temi(ed,verlay",verlay.tem' as your o=n sub%lass &in this e:ample, Sites,verlay' -n the %onstru%tor, buil your roster o$ ,verlay.tem instan%es, an %all populate:; =hen they are rea y $or use by the overlay -mplement si(e:; to return the number o$ items to be han le by the overlay >verri e create.tem:; to return ,verlay.tem instan%es given an in e: When you instantiate your .temi(ed,verlay sub%lass, provi e it =ith a Drawable that represents the e$ault i%on &e.g., push2pin' to isplay $or ea%h item

-$4
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+apping )ith +apFie) and +ap(ctivity

4he marker $rom the /oo@a=k %onstru%tor is the Drawable use $or the $ourth bullet above O it sho=s a push2pin, as illustrate in the s%reen shot sho=n earlier in this %hapter. @ou may also =ish to overri e draw:; to o a better Nob o$ han ling the sha o= $or your markers. While the map =ill han le %asting a sha o= $or you, it appears you nee to provi e a bit o$ assistan%e $or it to kno= =here the QbottomQ o$ your i%on is, so it %an ra= the sha o= appropriately. (or e:ample, here is Sites,verlay*
private!class!Sites,verlay!extends!.temi(ed,verlay",verlay.tem'!8 !!private!+ist",verlay.tem'!items$new!Array+ist",verlay.tem':;5 !!private!Drawable!mar er$null5 !!public!SitesO erlay:Drawable!mar er;!8 !!!!super:mar er;5 !!!!t&is.mar er$mar er5 !!!!items.add:new!O erlayItem:get(oint:O@.VOASNIAOVI?N@IOG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-VI.SNA@V?SIVLN?@O;G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!%2/%G!%2nited!/ations%;;5 !!!!items.add:new!O erlayItem:get(oint:O@.VNANNHSSSVOIAVG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-VI.SAHNAON?HHVO?V;G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!%+incoln!)enter%G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!%3ome!of!=a((!at!+incoln!)enter%;;5 !!!!items.add:new!O erlayItem:get(oint:O@.VNL?INOILI?NVLLG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-VI.SVSASL??OASANA;G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!%)arnegie!3all%G !!!!!!!!!!!!%C&ere!you!go!wit&!practiceG!practiceG!practice%;;5 !!!!items.add:new!O erlayItem:get(oint:O@.V@NANO?VOS?VSSG !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!-VO.@?LVHSOHVIIVNL;G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!%-&e!Downtown!)lub%G !!!!!!!!!!!!!!!!!!!!!%,riginal!&ome!of!t&e!3eisman!-rop&y%;;5 !!!!populate:;5 !!< !!9,verride !!protected!,verlay.tem!createItem:int!i;!8 !!!!return:items.get:i;;5 !!< !!9,verride !!public!void!draw:)anvas!canvasG!Map7iew!map7iewG !!!!!!!!!!!!!!!!!!!!boolean!s&adow;!8 !!!!super.draw:canvasG!map7iewG!s&adow;5 !!!!!oundCenterBottom:mar er;5

-$7
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

+apping )ith +apFie) and +ap(ctivity

!!< !!9,verride !!protected!boolean!onTap:int!i;!8 !!!!-oast.makeText:/ooFaw .t&isG !!!!!!!!!!!!!!!!!!!!items.get:i;.getSnippet:;G !!!!!!!!!!!!!!!!!!!!-oast.+*/0-3_S3,R-;.show:;5 !!!!return:true;5 !!< !!9,verride !!public!int!si+e:;!8 !!!!return:items.si+e:;;5 !!< <

H ndlin! Screen T ps
An ,verlay sub%lass %an also implement on-ap:;, to be noti$ie =hen the user taps on the map, so the overlay %an a Nust =hat it ra=s. (or e:ample, in $ull2siMe 7oogle Maps, %li%king on a push2pin pops up a bubble =ith in$ormation about the business at that pin6s lo%ation. With on-ap:;, you %an o mu%h the same in An roi . 4he on-ap:; metho $or .temi(ed,verlay re%eives the in e: o$ the ,verlay.tem that =as %li%ke . -t is up to you to o something =orth=hile =ith this event. -n the %ase o$ Sites,verlay, as sho=n above, on-ap:; looks like this*
9,verride protected!boolean!onTap:int!i;!8 !!-oast.makeText:/ooFaw .t&isG !!!!!!!!!!!!!!!!!!items.get:i;.getSnippet:;G !!!!!!!!!!!!!!!!!!-oast.+*/0-3_S3,R-;.show:;5 !!return:true;5 <

)ere, =e Nust toss up a short -oast =ith the QsnippetQ $rom the ,verlay.tem, returning true to in i%ate =e han le the tap.

-$9
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER ''

Dandling Telephone Calls

Many, i$ not most, An roi evi%es =ill be phones. As su%h, not only =ill users be e:pe%ting to pla%e an re%eive %alls using An roi , but you =ill have the opportunity to help them pla%e %alls, i$ you =ish. Why might you =ant toC

Maybe you are =riting an An roi inter$a%e to a sales management appli%ation &a la #ales$or%e.%om' an you =ant to o$$er users the ability to %all prospe%ts =ith a single button %li%k, an =ithout them having to keep those %onta%ts both in your appli%ation an in the phone6s %onta%ts appli%ation Maybe you are =riting a so%ial net=orking appli%ation, an the roster o$ phone numbers that you %an a%%ess shi$ts %onstantly, so rather than try to Qsyn%Q the so%ial net=ork %onta%ts =ith the phone6s %onta%t atabase, you let people pla%e %alls ire%tly $rom your appli%ation Maybe you are %reating an alternative inter$a%e to the e:isting %onta%ts system, perhaps $or users =ith re u%e motor %ontrol &e.g., the el erly', sporting big buttons an the like to make it easier $or them to pla%e %alls

Whatever the reason, An roi has the means to let you manipulate the phone Nust like any other pie%e o$ the An roi system.

-0*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Dandling Telephone Calls

3eport To The +anager


4o get at mu%h o$ the phone A!-, you use the -elep&onyManager. 4hat %lass lets you o things like*

Aetermine i$ the phone is in use via get)allState:;, =ith return values o$ )A++_S-A-*_.D+* &phone not in use', )A++_S-A-*_R./0./0! &%all re;ueste but still being %onne%te ', an )A++_S-A-*_,EE3,,M! &%all in progress' (in out the #-M -A &-M#-' via getSubscriber.d:; (in out the phone type &e.g., 7#M' via get1&one-ype:; or $in out the ata %onne%tion type &e.g., 7!R#, IA7I' via get/etwor -ype:;

.ou +ake the Call!


@ou %an also initiate a %all $rom your appli%ation, su%h as $rom a phone number you obtaine through your o=n Web servi%e. 4o o this, simply %ra$t an A)-.,/_D.A+ .ntent =ith a 2ri o$ the $orm tel#///// &=here ///// is the phone number to ial' an use that .ntent =ith startActivity:;. 4his =ill not a%tually ial the phoneP rather, it a%tivates the ialer a%tivity, $rom =hi%h the user %an then press a button to pla%e the %all. (or e:ample, let6s look at the Dialer sample appli%ation. )ere6s the %ru e2 but2e$$e%tive layout*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!android#orientation$%vertical% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%fill_parent% !!!!' !!"+inear+ayout! !!!!android#orientation$%&ori(ontal% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!!!' !!!!"-ext7iew!! !!!!!!android#layout_widt&$%wrap_content%! !!!!!!android#layout_&eig&t$%wrap_content%! !!!!!!android#text$%/umber!to!dial#% !!!!!!/'

-0%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Dandling Telephone Calls

!!!!"*dit-ext!android#id$%9Bid/number% !!!!!!android#layout_widt&$%fill_parent%! !!!!!!android#layout_&eig&t$%wrap_content% !!!!!!android#cursor7isible$%true% !!!!!!android#editable$%true% !!!!!!android#single+ine$%true% !!!!/' !!"/+inear+ayout' !!"6utton!android#id$%9Bid/dial% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%wrap_content% !!!!android#layout_weig&t$%?% !!!!android#text$%Dial!.tX% !!/' "/+inear+ayout'

We have a labele $iel $or typing in a phone number, plus a button $or ialing sai number. 4he Gava %o e simply laun%hes the ialer using the phone number $rom the $iel *
pac age!com.commonsware.android.dialer5 import!android.app.Activity5 import!android.content..ntent5 import!android.net.2ri5 import!android.os.6undle5 import!android.view.7iew5 import!android.widget.6utton5 import!android.widget.*dit-ext5 public!class!DialerDemo!extends!Activity!8 !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !! !!!!final!*dit-ext!number$:*dit-ext;findViewById:R.id.number;5 !!!!6utton!dial$:6utton;findViewById:R.id.dial;5 !! !!!!dial.setOnClickListener:new!6utton.OnClickListener:;!8 !!!!!!public!void!onClick:7iew!v;!8 !!!!!!!!String!toDial$%tel#%Bnumber.getText:;.toString:;5 !!!!!!!! !!!!!!!!start#cti ity:new!Intent:.ntent.A)-.,/_D.A+G !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!2ri.parse:toDial;;;5 !!!!!!< !!!!<;5 !!< < -0Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Dandling Telephone Calls

4he a%tivity6s o=n "- is not that impressive*

!igure 49< The /ialer/emo sample application6 as initially launched

)o=ever, the ialer you get $rom %li%king the ial button is better, sho=ing you the number you are about to ial*

-0$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Dandling Telephone Calls

!igure 7;< The (ndroid /ialer activity6 as launched from /ialer/emo

-00
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

CHAPTER '(

Searching )ith Search+anager

>ne o$ the $irms behin the >pen )an set Allian%e O 7oogle O has a teeny =eeny Web sear%h servi%e, one you might have hear o$ in passing. 7iven that, it6s not surprising that An roi has some amount o$ built2in sear%h %apabilities. #pe%i$i%ally, An roi has Qbake inQ the notion o$ sear%hing not only on the evi%e $or ata, but over the air to -nternet sour%es o$ ata. @our appli%ations %an parti%ipate in the sear%h pro%ess, by triggering sear%hes or perhaps by allo=ing your appli%ation6s ata to be sear%he . /ote that this is $airly ne= to the An roi plat$orm, an so some shi$ting in the A!-s is likely. #tay tune $or up ates to this %hapter.

Dunting Season
4here are t=o types o$ sear%h in An roi * lo%al an global. Lo%al sear%h sear%hes =ithin the %urrent appli%ationP global sear%h sear%hes the Web via 7oogle6s sear%h engine. @ou %an initiate either type o$ sear%h in a variety o$ =ays, in%lu ing*

@ou %an %all onSearc&ReJuested:; $rom a button or menu %hoi%e, =hi%h =ill initiate a lo%al sear%h &unless you overri e this metho in your a%tivity'
-04

Subscribe to updates at http://commonsware.com

Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

@ou %an ire%tly %all startSearc&:; to initiate a lo%al or global sear%h, in%lu ing optionally supplying a sear%h string to use as a starting point @ou %an ele%t to have keyboar entry ki%k o$$ a sear%h via setDefaultMeyMode:;, $or either lo%al sear%h &setDefaultMeyMode:D*EA2+-_M*FS_S*AR)3_+,)A+;' or global sear%h &setDefaultMeyMode:D*EA2+-_M*FS_S*AR)3_0+,6A+;'

-n either %ase, the sear%h appears as a set o$ "- %omponents a%ross the top o$ the s%reen, =ith your a%tivity blurre un erneath it.

!igure 7*< The (ndroid local search popup

-07
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

!igure 7%< The (ndroid global search popup6 sho)ing a drop"do)n )ith previous searches

Search .ourself
>ver the long haul, there =ill be t=o $lavors o$ sear%h available via the An roi sear%h system* ,. Huery2style sear%h, =here the user6s sear%h string is passe to an a%tivity =hi%h is responsible $or %on u%ting the sear%h an isplaying the results

2. (ilter2style sear%h, =here the user6s sear%h string is passe to an a%tivity on every keypress, an the a%tivity is responsible $or up ating a isplaye list o$ mat%hes #in%e the latter approa%h is un er heavy evelopment right no= by the An roi team, let6s $o%us on the $irst one.

-09
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

Cr ,t the Se rch Activity


4he $irst thing you are going to =ant to o i$ you =ant to support ;uery2style sear%h in your appli%ation is to %reate a sear%h a%tivity. While it might be possible to have a single a%tivity be both opene $rom the laun%her an opene $rom a sear%h, that might prove some=hat %on$using to users. Certainly, $or the purposes o$ learning the te%hni;ues, having a separate a%tivity is %leaner. 4he sear%h a%tivity %an have any look you =ant. -n $a%t, other than =at%hing $or ;ueries, a sear%h a%tivity looks, =alks, an talks like any other a%tivity in your system. All the sear%h a%tivity nee s to o i$$erently is %he%k the intents supplie to on)reate:; &via get.ntent:;' an on/ew.ntent:; to see i$ one is a sear%h, an , i$ so, to o the sear%h an isplay the results. (or e:ample, let6s look at the +orem sample appli%ation. 4his starts o$$ as a %lone o$ the list2o$2lorem2ipsum2=or s appli%ation that =e $irst built ba%k =hen sho=ing o$$ the +ist7iew %ontainer, then later =ith DML resour%es. /o=, =e up ate it to support sear%hing the list o$ =or s $or ones %ontaining the sear%h string. 4he main a%tivity an the sear%h a%tivity both share a %ommon layout* a +ist7iew plus a -ext7iew sho=ing the sele%te entry*
">xml!version$%?.@%!encoding$%utf-A%>' "+inear+ayout!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!android#orientation$%vertical% !!android#layout_widt&$%fill_parent%! !!android#layout_&eig&t$%fill_parent%!' !!"-ext7iew !!!!android#id$%9Bid/selection% !!!!android#layout_widt&$%fill_parent% !!!!android#layout_&eig&t$%wrap_content% !!/' !!"+ist7iew !!!!android#id$%9android#id/list% !!!!android#layout_widt&$%fill_parent%! !!!!android#layout_&eig&t$%fill_parent% !!!!android#drawSelector,n-op$%false%

-1;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

!!/' "/+inear+ayout'

-n terms o$ Gava %o e, most o$ the guts o$ the a%tivities are poure into an abstra%t +orem6ase %lass*
abstract!public!class!+orem6ase!extends!+istActivity!8 !!abstract!+istAdapter!make'e#n#dapter:.ntent!intent;5 !! !!private!static!final!int!+,)A+_S*AR)3_.D!$!Menu.E.RS-B?5 !!private!static!final!int!0+,6A+_S*AR)3_.D!$!Menu.E.RS-BH5 !!private!static!final!int!)+,S*_.D!$!Menu.E.RS-BI5 !!-ext7iew!selection5 !!Array+ist"String'!items$new!Array+ist"String':;5 !! !!9,verride !!public!void!onCreate:6undle!icicle;!8 !!!!super.onCreate:icicle;5 !!!!setContentView:R.layout.main;5 !!!!selection$:-ext7iew;findViewById:R.id.selection;5 !!!! !!!!try!8 !!!!!!Uml1ull1arser!xpp$get$esources:;.get-ml:R.xml.words;5 !!!!!! !!!!!!w&ile!:xpp.get* entType:;X$Uml1ull1arser.*/D_D,)2M*/-;!8 !!!!!!!!if!:xpp.get* entType:;$$Uml1ull1arser.S-AR-_-A0;!8 !!!!!!!!!!if!:xpp.get%ame:;.e.uals:%word%;;!8 !!!!!!!!!!!!items.add:xpp.get#ttri!uteValue:@;;5 !!!!!!!!!!< !!!!!!!!< !!!!!!!! !!!!!!!!xpp.next:;5 !!!!!!< !!!!< !!!!catc&!:-&rowable!t;!8 !!!!!!-oast !!!!!!!!.makeText:t&isG!%ReJuest!failed#!%Bt.toString:;G!O@@@; !!!!!!!!.show:;5 !!!!< !!!! !!!!setDefault1ey'ode:D*EA2+-_M*FS_S*AR)3_+,)A+;5 !!!! !!!!on%ewIntent:getIntent:;;5 !!< !! !!9,verride !!public!void!on%ewIntent:.ntent!intent;!8 !!!!+istAdapter!adapter$make'e#n#dapter:intent;5! !!!! !!!!if!:adapter$$null;!8 !!!!!!finish:;5 !!!!<

-1*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

!!!!else!8 !!!!!!setList#dapter:adapter;5 !!!!< !!< !! !!public!void!onListItemClick:+ist7iew!parentG!7iew!vG!int!positionG !!!!!!!!!!!!!!!!!!long!id;!8 !!!!selection.setText:items.get:position;.toString:;;5 !!< !!!! !!9,verride !!public!boolean!onCreateOptions'enu:Menu!menu;!8 !!!!menu.add:Menu./,/*G!+,)A+_S*AR)3_.DG!Menu./,/*G!%+ocal!Searc&%; !!!!!!!!!!!!.setIcon:android.R.drawable.ic_searc&_category_default;5 !!!!menu.add:Menu./,/*G!0+,6A+_S*AR)3_.DG!Menu./,/*G!%0lobal!Searc&%; !!!!!!!!!!!!.setIcon:R.drawable.searc&; !!!!!!!!!!!!.set#lpha!eticShortcut:Searc&Manager.M*/2_M*F;5 !!!!menu.add:Menu./,/*G!)+,S*_.DG!Menu./,/*G!%)lose%; !!!!!!!!!!!!.setIcon:R.drawable.eject; !!!!!!!!!!!!.set#lpha!eticShortcut:[c[;5 !! !!!!return:super.onCreateOptions'enu:menu;;5 !!< !!9,verride !!public!boolean!onOptionsItemSelected:Menu.tem!item;!8 !!!!switc&!:item.getItemId:;;!8 !!!!!!case!+,)A+_S*AR)3_.D# !!!!!!!!onSearch$e.uested:;5! !!!!!!!!return:true;5 !!!!!! !!!!!!case!0+,6A+_S*AR)3_.D# !!!!!!!!startSearch:nullG!falseG!nullG!true;5! !!!!!!!!return:true;5 !!!!!! !!!!!!case!)+,S*_.D# !!!!!!!!finish:;5 !!!!!!!!return:true;5 !!!!< !!!!return:super.onOptionsItemSelected:item;;5 !!< <

4his a%tivity takes %are o$ everything relate to sho=ing a list o$ =or s, even loa ing the =or s out o$ the DML resour%e. What it oes not o is %ome up =ith the +istAdapter to put into the +ist7iew O that is elegate to the sub%lasses. 4he main a%tivity O +oremDemo O Nust uses a +istAdapter $or the =hole =or list*
-1%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

pac age!com.commonsware.android.searc&5 import!android.content..ntent5 import!android.widget.ArrayAdapter5 import!android.widget.+istAdapter5 public!class!+oremDemo!extends!+orem6ase!8 !!9,verride !!+istAdapter!make'e#n#dapter:.ntent!intent;!8 !!!!return:new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G !!!!!!!!!!!!!!!!!!!!!items;;5 !!< <

4he sear%h a%tivity, though, oes things a bit i$$erently. (irst, it inspe%ts the .ntent supplie to the abstra%t ma eMeAnAdpater:;! metho . 4hat .ntent %omes $rom either on)reate:; or on/ew.ntent:;. -$ the intent is a A)-.,/_S*AR)3, then =e kno= this is a sear%h. We %an get the sear%h ;uery an , in the %ase o$ this silly emo, spin through the loa e list o$ =or s an $in only those %ontaining the sear%h string. 4hat list then gets =rappe in a +istAdapter an returne $or isplay*
pac age!com.commonsware.android.searc&5 import!android.app.Searc&Manager5 import!android.content..ntent5 import!android.widget.ArrayAdapter5 import!android.widget.+istAdapter5 import!java.util.Array+ist5 import!java.util.+ist5 public!class!+oremSearc&!extends!+orem6ase!8 !!9,verride !!+istAdapter!make'e#n#dapter:.ntent!intent;!8 !!!!+istAdapter!adapter$null5! !!!! !!!!if!:intent.get#ction:;.e.uals:.ntent.A)-.,/_S*AR)3;;!8 !!!!!!String!Juery$intent.getString*xtra:Searc&Manager.T2*RF;5 !!!!!!+ist"String'!results$searchItems:Juery;5 !!!!!! !!!!!!adapter$new!ArrayAdapter"String':t&isG !!!!!!!!!!!!!!!!!!!!!!!android.R.layout.simple_list_item_?G !!!!!!!!!!!!!!!!!!!!!!!results;5 !!!!!!setTitle:%+oremSearc&!for#!%BJuery;5 !!!!< !!!! !!!!return:adapter;5

-1Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

!!< !! !!private!+ist"String'!searchItems:String!Juery;!8 !!!!+ist"String'!results$new!Array+ist"String':;5 !!!! !!!!for!:String!item!#!items;!8 !!!!!!if!:item.indexOf:Juery;'-?;!8 !!!!!!!!results.add:item;5 !!!!!!< !!!!< !!!! !!!!return:results;5 !!< <

+pd te the % ni,est


While this implements sear%h, it oesn6t tie it into the An roi sear%h system. 4hat re;uires a $e= %hanges to the auto2generate AndroidManifest.xml $ile*
"manifest!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!pac age$%com.commonsware.android.searc&%' !!"application' !!!!"activity!android#name$%.+oremDemo%!android#label$%+oremDemo%' !!!!!!"intent-filter' !!!!!!!!"action!android#name$%android.intent.action.MA./%!/' !!!!!!!!"category!android#name$%android.intent.category.+A2/)3*R%!/' !!!!!!"/intent-filter' !!!!!!"meta-data!android#name$%android.app.default_searc&able% !!!!!!!!!!!!android#value$%.+oremSearc&%!/' !!!!"/activity' !!!!"activity !!!!!!android#name$%.+oremSearc&% !!!!!!android#label$%+oremSearc&% !!!!!!android#launc&Mode$%single-op%' !!!!!!"intent-filter' !!!!!!!!"action!android#name$%android.intent.action.S*AR)3%!/' !!!!!!!!"category!android#name$%android.intent.category.D*EA2+-%!/' !!!!!!"/intent-filter' !!!!!!"meta-data!android#name$%android.app.searc&able%! !!!!!!!!!!!!android#resource$%9xml/searc&able%!/' !!!!"/activity' !!"/application' "/manifest'

4he %hanges that are nee e are*

-1$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

,.

4he +oremDemo main a%tivity gets a meta-data element, =ith an android#name o$ android.app.default_searc&able an a android#value! o$ the sear%h implementation %lass &.+oremSearc&'
+oremSearc& a%tivity gets an intent $ilter android.intent.action.S*AR)3, so sear%h intents =ill be pi%ke up

2. 4he

$or

?. 4he +oremSearc& a%tivity is set to have android#launc&Mode ! $! %single-op%, =hi%h means at most one instan%e o$ this a%tivity =ill be open at any time, so =e on6t =in up =ith a =hole bun%h o$ little sear%h a%tivities %luttering up the a%tivity sta%k <. 4he +oremSearc& a%tivity gets a meta-data element, =ith an android#name o$ android.app.searc&able an a android#value o$ an DML resour%e %ontaining more in$ormation about the sear%h $a%ility o$$ere by this a%tivity &9xml/searc&able'
"searc&able!xmlns#android$%&ttp#//sc&emas.android.com/ap /res/android% !!!!android#label$%9string/searc&+abel% !!!!android#&int$%9string/searc&3int%!/'

4hat DML resour%e provi es t=o bits o$ in$ormation to ay* ,. What name shoul appear in the sear%h omain button to the le$t o$ the sear%h $iel , i enti$ying to the user =here she is sear%hing &android#label'

2. What hint te:t shoul appear in the sear%h $iel , to give the user a %lue as to =hat they shoul be typing in &android#&int'

Searching for +eaning 8n 3andomness


7iven all that, sear%h is no= available O An roi kno=s your appli%ation is sear%hable, =hat sear%h omain to use =hen sear%hing $rom the main a%tivity, an the a%tivity kno=s ho= to o the sear%h. 4he options menu $or this appli%ation has both lo%al an global sear%h options. -n the %ase o$ lo%al sear%h, =e Nust %all onSearc&ReJuested:;P in the %ase o$ global sear%h, =e %all startSearc&:; =ith true in the last parameter, in i%ating the s%ope is global.

-10
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

!igure 7-< The orem sample application6 sho)ing the local search popup

4yping in a letter or t=o, then %li%king #ear%h, =ill bring up the sear%h a%tivity an the subset o$ =or s %ontaining =hat you type , =ith your sear%h ;uery in the a%tivity title bar*

-11
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

Searching )ith Search+anager

!igure 7$< The results of searching for AcoA in the orem search sample

@ou %an get the same e$$e%t i$ you Nust start typing in the main a%tivity, sin%e it is set up $or triggering a lo%al sear%h.

-14
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex

Class..................................................
AbsoluteLayout.....................................................,28 A%tionIvent............................................................20 A%tionListener........................................................20 A%tivity 8, 1<, ,B,, ,B2, ,30, ,32, ,33, ,1?, ,1<, ,0?, 2,0, 2B?, 2BB A%tivityA apter.......................................1<, 238, 210 A%tivity-%onA apter...............................................1< A%tivityManager....................................................,B1 A apter.......................................................00, 02, 0? A apterWrapper............................................,00, ,,0 AlertAialog.....................................................,B2, ,B? AnalogClo%k..........................................................,20 ArrayA apter..............12, 1?, 1B, 82, 0,, ,02, ,0<, ,02 ArrayList................................................................,02 AutoComplete........................................................8B AutoComplete4e:t+ie=.............................?8, 8<283 .aseColumns........................................................20? .o:..........................................................................<1 .o:Layout...............................................................<1

.roa %astRe%eiver...........................2B2, 2B?, ?,1, ?,8 .uil er.............................................................,B2, ,B? .un le.....................................,31, ,30, 2<0, 2B8, ?,1 .utton................................2B, 212?0, ?<, ?B, 20,, 20B Calen ar.................................................................,,8 Char#e;uen%e.......................................................?01 Che%kA apter.......................................................,0< Che%k.o:....................................................?0, <2, << Che%k.o:!re$eren%e.............................................,1B Chrono...................................................................,,3 Clo%ks....................................................................,20 Component/ame..................................230, 210, ?,B Compoun .utton..................................................<2 Con%urrentLinke Hueue.....................................?0B Constants.ro=ser.................................213, 211, 280 ContentManager...................................................?22 Content>bserver..........................................20<, 20B Content!rovi er............................22<, 280, 28,, 28B ContentResolver....................................28,, 20<, 20B Content+alues.......................22,, 280, 288, 280, 20?

-17
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
Conte:t.........................12, ,B2, ,1?, ,1<, ,0?, 2,0, 211 Conte:tMenu..................................................,?2, ,?? Conte:tMenu.Conte:tMenu-n$o..........................,?2 Criteria....................................................??,, ??2, ??0 Critieria..................................................................??, Cursor...1?, 0B, ,0<, 22?, 22B, 223, 21B, 211228,, 281, 288, 20? CursorA apter........................................................1? Aatabase)elper...................................................283 Aate(ormat............................................................,,8 Aate!i%ker..............................................................,,B Aate!i%kerAialog............................................,,B, ,,8 Aea >bNe%tI:%eption...........................................?,3 Ae$ault)ttpClient................................................2?8 Aialer.....................................................................?B2 AialogWrapper.....................................................280 AigitalClo%k..........................................................,20 Ao%ument.............................................................,02 Aouble...................................................................2B1 Ara=able...........................88, ,2B, 20<, ?22, ?<1, ?<8 I it!re$eren%es.....................................................,13 I it4e:t!re$eren%e................................................,8B I it+ie=..................................?3, ?1, 8<, 8B, ,,B, 21B I:pan ableList+ie=.............................................,28 (iel .........................................................................?1 (lo=Layout.............................................................<8 (ore%ast..........................................................2<,, ?,0 (rameLayout...................................................,2?2,2B 7allery...............................................................1,, 88 7eo!oint.......................................................?<B, ?<3 7ri ..........................................................................8, 7ri +ie=.....................................................80, 8,, 88 )an ler....................................................,B12,32, ,38 )elpA%tivity..........................................................2B1 )ttpClient.............................2?8, 2<0, 2<2, 2<?, ?0B )ttp7et.........................................................2?8, 2<0 )ttp!ost................................................................2?8 )ttpRe;uest.........................................................2?8 )ttpResponse.......................................................2?8 -[Lo%ation(ee .....................................................??B -.in er...........................................................?03, ?,B -mage.utton...........................................?B, 20<, 20B -mages...................................................................20< -mage+ie=............................?B, 0<, 08, ,0,, 20<, 28, -nputMetho ..........................................................?1 -nput#tream.....................................,80, ,02, ,0?, 2<, -nput#treamRea er...............................................,0? -nteger...................................................................,0< -ntent. .,22, ,<3, 2<0, 2B?, 2382210, 28B, ?,0, ?,,, ?,?, ?,B, ?,1, ?,8, ??<, ?B2, ?3? -nterpreter.............................................................2?2 -temiMe >verlay...........................................?<1, ?<0 -terator..................................................................210 -Weather...............................................................?03 G.utton...............................................................20, 2, GChe%k.o:...............................................................12 GCombo.o:.............................................................13 GLabel......................................................................12 GList.........................................................................12 G4abbe !ane..........................................................,22 G4able......................................................................12 Label.......................................................................?<

-19
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
Laun%h..................................................................2B8 Layout-n$later..................................................0<, ,,, Linear.......................................................................B, LinearLayout<12B2, 3<, 00, 0<, ,0B, ,,,, ,2B, ?<2, ?<< LinearLo%ation(ee ......................................??3, ??0 List..............................................1<, ,??, 210, ?01, ??, ListA%tivity..........................................1<, 1B, ,2<, ?<, ListA apter.........................,082,,0, ,,?, ,28, ?32, ?3? ListCellRen erer.....................................................12 ListAemo...............................................................,?3 List!re$eren%e.......................................................,8B List+ie=....1?, 1<, 13, 11, 8820,, 0B, 03, ,0,, ,02, ,08, ,,?, ,??, 2?0, 211, 218, 280, ?<,, ?30, ?32 Lo%ation..................................2?0, ??2, ???, ??3, ??1 Lo%ationListener...................................................??? Lo%ationManager...................................??02??2, ??< Lo%ation!rovi er....................................??02??2, ??B Lorem....................................................................?30 Lorem.ase.............................................................?3, LoremAemo..................................................?32, ?3B Lorem#ear%h.........................................................?3B Map.........................................................,1?, 22,, ?01 MapA%tivity....................................................?<,2?<? MapController..............................................?<<, ?<B Map+ie=........................................................?<,2?<1 Menu.......................................................,?0, ,?2, 238 Menu.-tem............................................................210 Menu-tem.........................................................,?,2,?? Menus....................................................................,?? Message.............................................,B?, ,B8, ,30, ,3, Mo%kery..................................................??B, ??12??0 MyA%tivity............................................................230 /oo@a=k.......................................................?<<, ?<3 /oti$i%ation...................................................?22, ?2B /oti$i%ationManager....................................?22, ?2B /oti$yAemo..........................................................?2? /oti$yMessage......................................................?2B /o=..............................................................,0, 20, ?0 /o=Re u:..............................................................20 >nChe%ke ChangeListener......................?0, <0, B< >nCli%kListener................................20, ,,8, ,BB, 2B0 >nAateChange Listener......................................,,3 >nAate#etListener.........................................,,3, ,,8 >n-tem#ele%te Listener........................................18 >n4imeChange Listener.....................................,,3 >n4ime#etListener.........................................,,3, ,,8 >utput#tream.......................................................,0? >utput#treamWriter............................................,0? >verlay..........................................................?<1, ?<0 >verlay-tem..................................................?<1, ?<0 !a%kageManager..................................................210 !ar%elable..............................................................?01 !en ing-ntent........................................?2?, ?2B, ??< !i%k...............................................................23<, 200 !i%kAemo.............................................................200 !re$eren%e..............................................................,1B !re$eren%eA%tivity.................................................,82 !re$eren%eCategory........................................,8,, ,82 !re$eren%e#%reen.....................................,1B, ,8,, ,82 !re$eren%esManager..............................................,1< !rogress.ar......................................,22, ,B0, ,30, ,3?

-4;
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
!rovi er..................................213, 2832288, 200220? Ra io.utton..........................................<22<<, <1, B2 Ra io7roup...............................<2, <?, <1, B2, B<, BB RateableWrapper.......................................,,0, ,,,, ,,? RateList+ie=.............................................,08, ,,2, ,,? Rating.ar.......................,0,, ,02, ,0<, ,0B, ,,,, ,,?, ,,< Rea Write..............................................................,0? Relative...................................................................B0 RelativeLayout...........................<1, B3, B1, 30, 3,, 3B RemoteI:%eption..................................................?,3 Resour%es.......................................................,80, 201 Ringtone!re$eren%e...............................................,1B Ro=Mo el......................................................,0<, ,0B Runnable...........................................,B1, ,B8, ,3,, ,32 #%roll.......................................................................33 #%roll+ie=..................................................<1, 33, 38 #e%rets!rovi er....................................................28< #e%urityI:%eption........................................208, 200 #ervi%e...........................................................?0<, ?08 #ervi%eConne%tion.........................................?,<2?,3 #hare !re$eren%es...................................,1<, ,1B, ,8B #impleA apter........................................................1? #impleCursorA apter...........................211, 218, 280 #imple!re$sAemo..........................................,11, ,10 #ites>verlay...................................................?<12?<0 #panne ........................................................,00, 200 #pinner..........................................13, 11, 8<, 88, 211 #HLiteAatabase..............................................2,0222, #HLiteAatabase.Cursor(a%tory...........................223 #HLite>pen)elper...............................................2,0 #HLiteHuery.uil er.............222, 22<, 22B, 281, 288 #tati%..............................................................,00, 201 #tring. ,0<, ,B2, ,B?, ,1?, 200, 202, 2?8, 2B8, 21B, 281, ?01, ?,, #trings...................................................................200 4ab.........................................................................,2< 4abA%tivity.....................................................,2<, ,2B 4ab)ost...........................................................,222,23 4able.......................................................................3B 4ableLayout..........................................<1, 3223B, ,10 4ableRo=...........................................................3223< 4ab#pe%..........................................................,2B, ,23 4abWi get.......................................................,2?2,2B 4elephonyManager...............................................?B2 4e:t+ie= 28, ??2?3, ?0, <2, 1?, 82, 8?, 0,, 0<, 08, ,0,, ,0B, ,,8, ,20, 218, ?30 4e:tWat%her.....................................................8B, 83 4ime!i%ker.......................................................,,B, ,,3 4ime!i%kerAialog.....................................,,B, ,,3, ,,8 4imer.....................................................................??1 4imer4ask.............................................................??1 4oast..................................,B,, ,B2, ,BB, 2?<, 2<0, ?<0 "-4hrea "tilities..................................................,B1 "ri......?B, 20<, 22B, 2<8, 2<0, 2B,, 2B2, 2BB, 2B1, 2B0, 23?223B, 230, 21?2213, 280, 28,, 28?2202, 20<, 20B, ?22, ?B2 +ie=....2B, 20, <<, 3<, 38, 18, 00, 02, 0<203, 08, ,00, ,0,, ,0B, ,,,, ,?2, ,B2, ,B1, ,3,, ,32 +ie=-n$late.............................................................0< +ie=Wrapper..............................002,0,, ,0<, ,0B, ,,2 Weather................................................................2?8 WeatherAemo......................................................2<0 Weather!lus.....................................?0B, ?,?, ?,<, ?,1

-4*
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
Weather!lus#ervi%e...............?0?, ?0<, ?,0, ??8, ??0 WebEit..........................................................2?8, 2<0 Web#ettings..........................................................,<0 Web+ie=.............................,<,2,<?, ,<B2,<0, 208, ?,0 Web+ie=Client.............................................,<3, ,<8 Dml!ull!arser..............................................201, 208 AL4IR/A4-+I[CA4I7>R@...............................230 .-/A[A"4>[CRIA4I.........................................?,B C>/4I/4["R-...................................................20< AI(A"L4..............................................................2<0 AI(A"L4[CA4I7>R@........................................210 AILI4I..................................................22,, 222, 28, I/A[A>C"MI/4..............................................201

Command..........................................
a%tivityCreator......................................................2?0 a b pull.................................................................221 a b push................................................................221 a b shell................................................................223 ant.........................................................................8, 0 ant Nar%ore..............................................................2?, ant release................................................................0 e:..........................................................................2?, Narsigner....................................................................0 s;lite?............................................................223, 221

I/A[4A7.............................................................201 7I4.......................................................................2?8 )>R-L>/4AL.......................................................<8 -/#IR4....................................................2,8, 22,, 222 -/4I7IR...............................................................2,8 LAR7IR.................................................................,<0 LA"/C)IR...................................................2<0, 2B, LI/74)[L>/7...................................................,B2 LI/74)[#)>R4.................................................,B2 MA-/.....................................................................2B, MA4C)[AI(A"L4[>/L@..................................210 /"LL.....................................................................22, >RAIR .@............................................................21B !IRM-##->/[AI/-IA........................................?0, !IRM-##->/[7RA/4IA....................................?0, !>#4.....................................................................2?8 R..............................................................................20 RIAA[C>/4AC4#..............................................200 RICI-+I[#M#......................................................?0, RI#"L4[CA/CILLIA.........................................2B8 RI#"L4[(-R#4["#IR.........................................2B8 RI#"L4[>E.........................................2B8, 23<, 23B #ILIC4...................................................2,8, 222, 22B

Constant............................................
ACCI##[A##-#4IA[7!#.....................................??0 ACCI##[CILL[-A................................................??0 ACCI##[7!#........................................................??0 ACCI##[L>CA4->/...........................................??0 AC4->/[IA-4.....................................................2<8 AC4->/[!-CE..............2<8, 2B8, 23<, 23B, 21B, 28B AC4->/[#IARC)...............................................?3? AC4->/[4A7......................................................238 AC4->/[+-IW....................................2<8, 2B1, 23B AL4IR/A4I[CA4I7>R@...................................230 AL4IR/A4-+I.............................................2<0, 230

-4%
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
#MALLI#4............................................................,<0 #4AR4[4A7..................................................201, 208 4ID4.....................................................................201 4-4LI....................................................................218 "!AA4I.........................................................22,, 222 +IR4-CAL..............................................................<8 W)IRI..............22,222?, 22B, 21B, 28,, 281, 280220, [i .........................................................................220 %an7o.a%k&'..........................................................,<B %an7o.a%k>r(or=ar &'.......................................,<3 %an7o(or=ar &'....................................................,<B %he%k&'..............................................................<2, <? %he%kCalling!ermission&'....................................?0, %lear&'.....................................................................,1< %learCa%he&'..........................................................,<3 %learChe%k&'...........................................................<2 %lear)istory&'........................................................,<3

&ethod..............................................
a a a a a a a a &'.........................................................,?0, ,?,, ?<1 - &'..................................................................21< -ntent>ptions&'................................,?,, 2382210 Menu&'.............................................................,?, !re$eren%es(romResour%e&'...........................,13 !ro:imityAlert&'.............................................??< #ubMenu&'.......................................................,?, 4ab&'................................................................,23

%lose&'.....................................................,0?, 220, 22B %ommit&'................................................................,1< %ount&'..................................................................22B %reate&'...................................................................,B? %reateAatabase&'..................................................221 %reate-tem&'..........................................................?<1 elete&'....................................22,, 222, 28,, 200, 20, isplayLoomControls&'........................................?<B ra=&'...................................................................?<8 e it&'......................................................................,1< enable&'.................................................................?01 enableLo%ation!oll&'............................................??0 e;uery&'.................................................................22B e:e%#HL&'......................................................2202222 e:e%ute&'...............................................................2?8 $in +ie=.y- &'.20, ?0, <B, 03, 082,00, ,23, ,80, ?<?, ?<< $inish&'............................................................,31, ,0B $irst&'.....................................................................22B generate!age&'......................................................2<, get&'........................................................................22, getAltitu e&'.........................................................??2

appen Where&'....................................................22B apply(ormat&'.......................................................202 applyMenuChoi%e&'.......................................,?B, ,?3 be$ore4e:tChange &'.............................................83 bin #ervi%e&'..................................................?,B, ?,3 broa %ast-ntent&'..........................................2B8, ?0, broa %ast-ntent#erialiMe &'.................................2B8 buil (ore%asts&'...................................................2<0 buil Huery&'.........................................................22B bulk-nsert&'..........................................................280 %an%el&'.................................................................?22 %an%elAll&'.............................................................?22

-4Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
getAs-nteger&'.......................................................22, getAs#tring&'.........................................................22, getAttributeCount&'.............................................208 getAttribute/ame&'.............................................200 get.earing&'..........................................................??2 get.est!rovi er&'..................................................??, get.oolean&'..........................................................,1< getCall#tate&'........................................................?B2 getChe%ke Ra io.utton- &'.................................<2 getColle%tion4ype&'.............................................202 getColumn-n e:&'................................................22B getColumn/ames&'..............................................22B getContent!rovi er&'...........................................280 getContentResolver&'...........................................20B getAe$ault#hare !re$eren%es&'.....................,1<, ,1B get(loat&'..............................................................210 get-nput#tream&'..................................................28, get-nt&'..........................................................22B, 210 get-ntent&'............................................................?30 getLastEno=n!osition&'......................................??2 getLatitu e&'.........................................................2?0 getLongitu e&'.....................................................2?0 getMapController&'..............................................?<? getMeMyCurrentLo%ation/o=&'.........................??2 get/et=ork4ype&'.................................................?B2 get>utput#tream&'...............................................28, get>verlays&'........................................................?<1 get!a%kageManager&'..........................................210 get!arent&'..............................................................<B get!hone4ype&'....................................................?B2 get!osition&'.........................................................210 get!re$eren%es&'..............................................,1?, ,1< get!rogress&'.........................................................,22 get!rovi ers&'........................................................??, getRea ableAatabase&'.........................................2,0 getRe;uire Columns&'........................................280 getResour%es&'......................................................,80 getRoot+ie=&'........................................................<B get#ettings&'..........................................................,<0 get#hare !re$eren%es&'..................................,1?, ,1< get#ingle4ype&'....................................................202 get#pee &'.............................................................??2 get#tring&'......................................,00, 202, 22B, 210 get#tringArray&'....................................................2,2 get#ubs%riber- &'..................................................?B2 get4ag&'...........................................................00, ,0< get4ype&'........................................................20,, 202 get+ie=&'.....1?, 82, 02, 0?, 0B, 03, ,00, ,0<, ,08, ,,0, ,,,, 218 getWriteableAatabase&'.......................................2,0 getDml&'................................................................201 go.a%k&'.................................................................,<B go.a%k>r(or=ar &'.......................................,<B, ,<3 go(or=ar &'...........................................................,<B han leMessage&'............................................,B8, ,30 hasAltitu e&'.........................................................??2 has.earing&'..........................................................??2 has#pee &'............................................................??2 in%rement!rogress.y&'.........................................,22 initMo%k!rovi er&'..............................................??8 insert&'...................................22,, 280, 288, 280, 20?

-4$
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
isA$terLast&'..................................................22B, 210 is.e$ore(irst&'.......................................................210 isChe%ke &'.......................................................?0, <2 isColle%tion"ri&'..........................................280, 200 isInable &'.............................................................<< is(irst&'..................................................................210 is(o%use &'.............................................................<< isLast&'..................................................................210 is/ull&'..................................................................210 isRouteAisplaye &'...............................................?<? loa Aata&'.............................................................,<< loa 4ime&'............................................................,<8 loa "rl&'.........................................................,<22,<< makeMeAnA pater&'...........................................?3? make4e:t&'.............................................................,B2 manage Huery&'...........................................21B2211 MenuKset7roupChe%kable&'.................................,?, Menu-temKsetChe%kable&'...................................,?, move&'...................................................................210 move4o(irst&'.......................................................210 move4oLast&'........................................................210 move4o/e:t&'.......................................................210 move4o!osition&'.................................................210 move4o!revious&'................................................210 ne=Cursor&'.........................................................223 ne=4ab#pe%&'.................................................,2B, ,23 ne:t&'.............................................................201, 22B noti$y&'..................................................................?22 noti$yChange&'.............................................20<, 20B noti$yMe&'.............................................................?2< obtainMessage&'....................................................,B8 onA%tivityResult&'........................................2B8, 23< on.in &'.......................................................?03, ?08 onChe%ke Change &'......................................<0, B< onCli%k&'............................................................20, 2, onConte:t-tem#ele%te &'...............................,??, ,?B onCreate&'............20, 2,, 28, 20, <?, B<, ,?0, ,?B, ,<2, ,332,30, ,80, ,02, 202, 2,0, 2<0, 211, 28B, 283, ?0<, ?0B, ?<<, ?30, ?3? onCreateConte:tMenu&'.........................,?2, ,??, ,?B onCreate>ptionsMenu&'........................,?0, ,?2, ,?B onCreate!anelMenu&'...........................................,?, onAestroy&'...........................................,31, ?0<, ?0B onList-temCli%k&'............................................1B, ,0< onLo%ationChange &'..........................................??? on/e=-ntent&'..............................................?30, ?3? on>ptions-tem#ele%te &'.........................,?,2,??, ,?B on!age#tarte &'....................................................,<3 on!ause&'.................................,38, ,0B, 2B?, ?0<, ?,1 onRating.arChange &'.........................................,,2 onRatingChange &'..............................................,0< onRe%eive&'...........................................................2B2 onRe%eive )ttpAuthRe;uest&'...........................,<3 onRestart&'............................................................,31 onRestore-nstan%e#tate&'.....................................,30 onResume&'.......,31, ,38, ,80, ,0B, 2?0, 2B?, ?0<, ?,1 on#ave-nstan%e#tate&'...................................,31, ,30 on#ear%hRe;ueste &'...................................?B1, ?3B on#ervi%eConne%te &'..........................................?,B on#ervi%eAis%onne%te &'..............................?,B, ?,3 on#tart&'...................................,30, ,3,, ,31, ?0<, ?,1

-40
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
on#top&'.................................................................,31 on4ap&'.................................................................?<0 on4e:tChange &'...................................................83 on4ooManyRe ire%ts&'.........................................,<3 on"pgra e&'..........................................................2,0 open(ile-nput&'..............................................,0?, ,0B open(ile>utput&'..........................................,0?, ,0B openRa=Resour%e&'..............................................,80 populate&'.............................................................?<1 populateAe$ault+alues&'.....................................280 populateMenu&'.............................................,?B, ,?3 post&'...............................................................,3,, ,32 postAelaye &'........................................................,3, ;uery&'....................................222222B, 2832288, 20? ;uery-ntentA%tivity>ptions&'.............................210 ;ueryWith(a%tory&'.............................................223 ra=Huery&'...........................................................222 ra=HueryWith(a%tory&'......................................223 registerContent>bserver&'..................................20B register(orConte:tMenu&'....................................,?2 registerRe%eiver&'..................................................2B? reloa &'..................................................................,<B remove&'................................................................,1< remove!ro:imityAlert&'.......................................??< remove"p ates&'..................................................??? re;uery&'...............................................................280 re;uest(o%us&'.......................................................<< re;uestLo%ation"p ates&'...................................??2 run>n"-4hrea &'.................................................,32 sen .roa %ast&'.............................................?0,, ?,0 sen Message&'.......................................................,B8 sen MessageAt(ront>$Hueue&'..........................,B8 sen MessageAt4ime&'..........................................,B8 sen MessageAelaye &'.........................................,B8 set&'.......................................................................2?< setA%%ura%y&'.........................................................??, setA apter&'...................................1<, 13, 80, 8<, ,,? setAlphabeti%#hort%ut&'........................................,?, setAltitu eRe;uire &'...........................................??, setCellRen erer&'...................................................12 setCenter&'............................................................?<B setChe%ke &'.....................................................?0, <? setColumnCollapse &'...........................................3B setColumn#hrinkable&'.........................................3B setColumn#tret%hable&'........................................3B setContent&'...................................................,2B, ,23 setContent+ie=&'.......................................20, 20, <B setCostAllo=e &'...................................................??, setCurrent4ab&'....................................................,23 setAe$ault(ont#iMe&'............................................,<0 setAe$aultEeyMo e&'...........................................?B8 setAropAo=n+ie=Resour%e&'...............................13 setAuration&'.........................................................,B2 setInable &'...........................................................<< set(antasy(ont(amily&'........................................,<0 set7ravity&'.............................................................B0 set7roupChe%kable&'............................................,?0 set-%on&'.................................................................,B? set-mage"R-&'........................................................?B set-n eterminate&'................................................,22

-41
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
set-n i%ator&'.................................................,2B, ,23 setGava#%riptCan>penWin o=sAutomati%ally&' ...............................................................................,<0 setGava#%riptInable &'.........................................,<0 setLatestIvent-n$o&'.....................................?2?, ?2B setListA apter&'.....................................................1B setMa:&'.................................................................,22 setMessage&'..........................................................,B? set/egative.utton&'..............................................,B? set/eutral.utton&'................................................,B? set/umeri%#hort%ut&'...........................................,?, set>nCli%kListener&'......................................20, ,0B set>n-tem#ele%te Listener&'....................1<, 13, 80 set>rientation&'.....................................................<8 set!a ing&'...........................................................B0 sho=&'......................................................,B2, ,B?, ,BB siMe&'......................................................................?<1 startA%tivity&'........................................2B1, 2B8, ?B2 start#ear%h&'.................................................?B8, ?3B start#ervi%e&'.........................................................?,1 start#ubA%tivity&'.........................................2B8, 23< stop#ervi%e&'..........................................................?,1 s=it%h&'..................................................................,?2 toggle&'..............................................................?0, <2 toggle#atellite&'....................................................?<3 to#tring&'................................................................12 unbin #ervi%e&'....................................................?,3 unregisterContent>bserver&'..............................20B unregisterRe%eiver&'.............................................2B? up ate&'...................................22,, 222, 280220,, 20? up ate(ore%ast&'....................................2?0, ?,8, ??? up ateLabel&'........................................................,,8 up ate4ime&'.........................................................20

set!ositive.utton&'...............................................,B? set!rogress&'..........................................................,22 set!roNe%tionMap&'..............................................22B setH=ertyMo e&'...................................................,?, setResult&'.............................................................2B8 set4ag&'....................................................00, ,00, ,0B set4e:t&'...................................................................2, set4e:t#iMe&'..........................................................,<0 set4itle&'................................................................,B? set4ype$a%e&'..........................................................23 setup&'............................................................,2B, ,23 set"serAgent&'......................................................,<0 set+ie=&'................................................................,B2 setWeb+ie=Client&'.............................................,<3 setLoom&'.............................................................?<< shoul >verri e"rlLoa ing&'.......................,<3, ,<8

Property............................................
an roi *authorities..............................................20< an roi *auto4e:t....................................................?3 an roi *ba%kgroun ..............................................<< an roi *%apitaliMe..................................................?3 an roi *%ollapseColumns......................................3B an roi *%olumnWi th..........................................80 an roi *%ompletion4hreshol ..............................8< an roi * igits.........................................................?3 an roi * ra=#ele%tor>n4op...........................11, 88 an roi *horiMontal#pa%ing...................................80

-44
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex
an roi *i .................................21, 28, <2, B1, ,2?2,2B an roi *inputMetho ............................................?1 an roi *label...........................................................,< an roi *layout[above............................................B8 an roi *layout[align.aseline................................B8 an roi *layout[align.ottom.................................B8 an roi *layout[alignLe$t.......................................B8 an roi *layout[align!arent.ottom......................B1 an roi *layout[align!arentLe$t............................B1 an roi *layout[align!arentRight..........................B1 an roi *layout[align!arent4op.......................B1, 3, an roi *layout[alignRight.....................................B8 an roi *layout[align4op..................................B8, B0 an roi *layout[belo=............................................B8 an roi *layout[%enter)oriMontal..........................B1 an roi *layout[%enter-n!arent.............................B1 an roi *layout[%enter+erti%al...............................B1 an roi *layout[%olumn.........................................3? an roi *layout[gravity...........................................B0 an roi *layout[height........................21, <0, B0, ,2< an roi *layout[span..............................................3? an roi *layout[toLe$t>$........................................B8 an roi *layout[toRight>$.....................................B8 an roi *layout[=eight...........................................<0 an roi *layout[=i th...........................21, <0, B?, B0 an roi *mani$est.....................................................,2 an roi *ma:..........................................................,B0 an roi *name..........................,<, 20?, 208, ?00, ?3B an roi *ne:t(o%usAo=n.......................................<< an roi *ne:t(o%usLe$t...........................................<< an roi *ne:t(o%usRight........................................<< an roi *ne:t(o%us"p............................................<< an roi *numColumns...........................................80 an roi *numeri%.....................................................?1 an roi *orientation...............................................<8 an roi *pa an roi *pa an roi *pa an roi *pa an roi *pa ing...............................................B0, B, ing.ottom.........................................B, ingLe$t...............................................B, ingRight............................................B, ing4op........................................B,, ,2<

an roi *pass=or ...................................................?1 an roi *permission......................................?00, ?00 an roi *phone/umber..........................................?1 an roi *shrinkColumns........................................3< an roi *singleLine............................................?3, ?1 an roi *spa%ing.....................................................88 an roi *spinner#ele%tor........................................88 an roi *sr%..............................................................?B an roi *stret%hColumns.......................................3< an roi *stret%hMo e.............................................80 an roi *te:t.......................................................21, ?? an roi *te:tColor.............................................?<, ?0 an roi *te:t#tyle..............................................??, ?3 an roi *type$a%e.....................................................?? an roi *value........................................................?3B an roi *verti%al#pa%ing.........................................80 an roi *visibility....................................................<<

-47
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

@ey)ord 8ndex

-49
Subscribe to updates at http://commonsware.com Special Creative Commons BY-NC-SA 3.0 License Edition

S-ar putea să vă placă și