android开发技巧总汇android开发培训-教师必备4764.docx
<<android 开发技巧总汇1>>目录 <<android 的几个技巧1>>11. 入门门实例剖剖析122.在测试试时,如何实实现一个个提示883.可以使使用AllerttDiaalogg.Buuildder 才产生生一个提提示框.94.mennu 的的用法.101. 简单单的代码码102. meenu实实现的两两种方法法105.Acttiviity 的切换(含Bundlle传值值)1441. 代码码142. 详解解:156.Anddroiid UUI LLayoout1191. AbbsolluteeLayyoutt197. Taab以及及 HoostTTab操操作2008. Liist (图图片/按钮/标题/文本)26LIST例例一277LIST例例二366LIST例例三4009. 调用用浏览器器载入某某网址44310.监控控应用程程序包的的安装&&删除433方法一:443方法二:44611. 使使用Tooastt输出一一个字符符串52212. 把把一个字字符串写写进文件件5213. 把把文件内内容读出出到一个个字符串串5414. 调调用Anndrooid insstalllerr 安装装和卸载载程序55515. 结结束某个个进程55516. 设设置默认认来电铃铃声56617. 开开机自启启动57718. 线线程与子子线程558handllerMMesssagee实例58819. SServvicee601. 什么么是Seerviice6602. 如何何使用SServvicee603. Seerviice的的生命周周期666附) 常用用界面截截图:67提示1677提示2688菜单681. 入门门实例剖剖析1开卷语俗话说,“熟读唐唐诗三百百首,不不会作诗诗也会吟吟”。最近近收集了了很多AAndrroidd的示例例代码,从从这些代代码的阅阅读和实实验中学学习到很很多知识识,从而而产生写写这个系系列的打打算,目目标就是是一步步步跟着实实例进行行动手实实作,真真正从“做”中体会会和学习习Anddroiid开发发。 本文目标标是Anndrooid自自带的一一个范例例程序:记事本本,预备知识搭建开发环环境,尝尝试编写写”Helllo Worrld”,了解解Anddroiid的基基本概念念,熟悉悉Anddroiid的AAPI(官方文文档中都都有,不不赘述)。程序截图先来简单了了解下程程序运行行的效果果 1 22 3 44程序入口点点类似于wiin322程序里里的WiinMaain函函数,AAndrroidd自然也也有它的的程序入入口点。它它通过在在AnddroiidMaaniffestt.xmml文件件中配置置来指明明,可以以看到名名为NootessLisst的aactiivitty节点点下有这这样一个个inttentt-fiilteer,其其acttionn为anndrooid.inttentt.acctioon.MMAINN,Categgoryy指定为为 anndrooid.inttentt.caateggoryy.LAAUNCCHERR,这就就指明了了这个aactiivitty是作作为入口口acttiviity,系系统查找找到它后后,就会会创建这这个acctivvityy实例来来运行,若若未发现现就不启启动(你你可以把把MAIIN改名名字试试试)。<inteent-fillterr><actiion anddroiid:nnamee="aandrroidd.inntennt.aactiion.MAIIN"/><cateegorry aandrroidd:naame="anndrooid.inttentt.caateggoryy.LAAUNCCHERR"/></inttentt-fiilteer>NotessLisst详解解就从入口点点所在的的acttiviity(见图11)开始始,可以以看到这这个acctivvityy最重要要的功能能就是显显示日志志列表。这这个程序序的日志志都存放放在Sqqlitte数据据库中,因因此需要要读取出出所有的的日志记记录并显显示。先来看两个个重要的的私有数数据,第第一个PPROJJECTTIONN字段指指明了“日志列列表“所关注注的数据据库中的的字段(即即只需要要ID和和Tittle就就可以了了)。privaatestatiicfinall Sttrinng PRROJEECTIION =new SStriing Nootess._IID, / 0 Nootess.TIITLEE, / 11 ;第二个字段段COLLUMNN_INNDEXX_TIITLEE指明ttitlle字段段在数据据表中的的索引。privaatestatiicfinallint CCOLUUMN_INDDEX_TITTLE =1;然后就进入入第一个个调用的的函数oonCrreatte。 Inttentt inntennt = geetInntennt(); if (inntennt.ggetDDataa() =null) inntennt.ssetDDataa(Nootess.COONTEENT_URII); 因为为NottesLListt这个aactiivitty是系系统调用用的,此此时的iinteent是是不带数数据和操操作类型型的,系系统只是是在其中中指明了了目标组组件是NNoteelisst,所所以这里里把”conntennt:/ ccom.goooglee.prroviiderr.NootePPad/nottes”保存到到inttentt里面,这这个URRI地址址指明了了数据库库中的数数据表名名(参见见以后的的NottePaadPrroviiderr类),也也就是保保存日志志的数据据表nootess。 Currsorr cuursoor = maanaggedQQuerry(ggetIInteent().ggetDDataa(), PRROJEECTIION, nuull, nuull, Nootess.DEEFAUULT_SORRT_OORDEER); 然后后调用mmanaageddQueery函函数查询询出所有有的日志志信息,这这里第一一个参数数就是上上面设置置的” coonteent:/ comm.goooglle.pprovvideer.NNoteePadd/nootess”这个UURI,即即nottes数数据表。PPROJJECTTIONN 字段段指明了了结果中中所需要要的字段段,Nootess.DEEFAUULT_SORRT_OORDEER 指指明了结结果的排排序规则则。实际际上maanaggedQQuerry并没没有直接接去查询询数据库库,而是是通过CConttentt Prroviiderr来完成成实际的的数据库库操作,这这样就实实现了逻逻辑层和和数据库库层的分分离。SimplleCuursoorAddaptter adaapteer =new SSimppleCCurssorAAdappterr(thhis, R.layyoutt.nootesslisst_iitemm, ccurssor, nnew Strringg NNotees.TTITLLE , nnewint anddroiid.RR.idd.teext11 ); settLisstAddaptter(adaapteer); 查询询出日志志列表后后,构造造一个CCurssorAAdappterr,并将将其作为为Lisst VVieww的数据据源,从从而在界界面上显显示出日日志列表表。可以以看到,第第二个参参数是RR.laayouut.nnoteesliist_iteem,打打开对应应的nootesslisst_iitemm.xmml文件件,<TexttVieew xxmlnns:aandrroidd="hhttpp:/schhemaas.aandrroidd.coom/aapk/ress/anndrooid"" aandrroidd:idd="anddroiid:iid/ttextt1" aandrroidd:laayouut_wwidtth=""filll_ppareent"" aandrroidd:laayouut_hheigght="?aandrroidd:atttr/lisstPrrefeerreedIttemHHeigght"" aandrroidd:teextAAppeearaancee="?anddroiid:aattrr/teextAAppeearaanceeLarrge"" aandrroidd:grraviity="ceenteer_vvertticaal" aandrroidd:paaddiingLLeftt="55dipp" aandrroidd:siinglleLiine="trrue""/> 就是是用来显显示一条条日志记记录的TTexttVieew,最最后两个个字段指指明了实实际的字字段映射射关系,通通过这个个TexxtViiew来来显示一一条日志志记录的的tittle字字段。处理“选择择日志”事件既然有了“日志列列表”,就自自然要考考虑如何何处理某某一条日日志的单单击事件件,这通通过重载载onLListtIteemCllickk方法来来完成, Oveerriide pprottecttedvoid onLListtIteemCllickk(LiistVVieww l, Viiew v, intt poosittionn, llongg idd) Urii urri = CoonteentUUriss.wiithAAppeendeedIdd(geetInntennt().geetDaata(), id); Strringg acctioon = geetInntennt().geetAcctioon(); if (Inntennt.AACTIION_PICCK.eequaals(acttionn) | IInteent.ACTTIONN_GEET_CCONTTENTT.eqqualls(aactiion) / Thhe ccalller is waiitinng ffor us to retturnn a notte sseleecteed bby / thhe uuserr. Thee haave cliickeed oon oone, soo reeturrn iit nnow. seetReesullt(RRESUULT_OK, neew IInteent().ssetDDataa(urri); eelsee / Laauncch aactiivitty tto vvieww/eddit thee cuurreentlly sseleecteed iitemm sttarttActtiviity(neww Inntennt(IInteent.ACTTIONN_EDDIT, urri); 首先先通过”conntennt:/ ccom.goooglee.prroviiderr.NootePPad/nottes”和日志志的idd 号拼拼接得到到选中日日志的真真正URRI,然然后创建建一个新新的Inntennt,其其操作类类型为IInteent.ACTTIONN_EDDIT,数数据域指指出待编编辑的日日志URRI(这这里只分分析ellse块块)。Intennt深度度剖析那么,上面面这句sstarrtAcctivvityy(neew IInteent(Inttentt.ACCTIOON_EEDITT, uuri)执行行后会发发生什么么事情呢呢?这时时候Anndrooid系系统就跳跳出来接接管了,它它会根据据inttentt中的信信息找到到对应的的acttiviity,在在这里找找到的是是NotteEdditoor这个个acttiviity,然然后创建建这个aactiivitty的实实例并运运行。那么,Anndrooid又又是如何何找到NNoteeEdiitorr这个对对应的aactiivitty的呢呢?这就就是inntennt发挥挥作用的的时刻了了。new IInteent(Inttentt.ACCTIOON_EEDITT, uuri)这里的Inntennt.AACTIION_EDIIT=” anndrooid.inttentt.acctioon.EEDITT”,另外外通过设设置断点点,我们们看下这这里的uuri值值: 可以以看到选选中的日日志条目目的URRI是:conntennt:/coom.ggooggle.proovidder.NottePaad/nnotees/11然后我们再再来看下下Anddroiidmaanfeest.xmll,其中中有这个个proovidder<provvideer aandrroidd:naame="NootePPadPProvvideer" anndrooid:autthorritiies="coom.ggooggle.proovidder.NottePaad"/> 发现现没有?它也有有comm.goooglle.pprovvideer.NNoteePadd,这个个是coonteent:/ccom.goooglee.prroviiderr.NootePPad/nottes/1的一一部分,同同时<actiivitty aandrroidd:naame="NooteEEdittor"" anndrooid:theeme="aandrroidd:sttylee/Thhemee.Liightt" anndrooid:labbel="sstriing/tittle_notte" anndrooid:scrreennOriienttatiion="seensoor" anndrooid:connfiggChaangees=""keyyboaardHHiddden|oriienttatiion""><!- Thiis ffiltter sayys tthatt wee caan vvieww orr eddit thee daata of a ssinggle notte -><inteent-fillterr anndrooid:labbel="sstriing/ressolvve_eeditt"><actiion anddroiid:nnamee="aandrroidd.inntennt.aactiion.VIEEW"/><actiion anddroiid:nnamee="aandrroidd.inntennt.aactiion.EDIIT"/><actiion anddroiid:nnamee="ccom.anddroiid.nnoteepadd.acctioon.EEDITT_NOOTE""/><cateegorry aandrroidd:naame="anndrooid.inttentt.caateggoryy.DEEFAUULT""/><dataa anndrooid:mimmeTyype="vnnd.aandrroidd.cuursoor.iitemm/vnnd.ggooggle.notte"/></inttentt-fiilteer><!- Thiis ffiltter sayys tthatt wee caan ccreaate a nnew notte iinsiide of a ddireectoory of nottes. -><inteent-fillterr><actiion anddroiid:nnamee="aandrroidd.inntennt.aactiion.INSSERTT"/><cateegorry aandrroidd:naame="anndrooid.inttentt.caateggoryy.DEEFAUULT""/><dataa anndrooid:mimmeTyype="vnnd.aandrroidd.cuursoor.ddir/vndd.goooglle.nnotee"/></inttentt-fiilteer></acttiviity>> 上面面第一个个inttentt-fiilteer中有有一个aactiion 名为aandrroidd.inntennt.aactiion.EDIIT,而而前面我我们创建建的Inntennt也正正好是Intennt.AACTIION_EDIIT=” anndrooid.inttentt.acctioon.EEDITT”,想必必大家已已经明白白是怎么么回事了了吧。下面就进入入acttiviity选选择机制制了:系统从inntennt中获获取道uuri,得得到了cconttentt:/comm.goooglle.pprovvideer.NNoteePadd/nootess/1,去掉开开始的cconttentt:标识识,得到到comm.goooglle.pprovvideer.NNoteePadd/nootess/1,然后获获取前面面的coom.ggooggle.proovidder.NottePaad,然然后就到到Anddroiidmaanfeest.xmll中找到到autthorritiies为为comm.goooglle.pprovvideer.NNoteePadd的prroviiderr,这个个就是后后面要讲讲的coonteentpprovvideer,然然后就加加载这个个conntennt pprovvideer。<provvideer aandrroidd:naame="NootePPadPProvvideer" anndrooid:autthorritiies="coom.ggooggle.proovidder.NottePaad"/>在这里是NNoteePaddProovidder,然后调调用NootePPadPProvvideer的ggetttypee函数,并并把上述述URII传给这这个函数数,函数数返回UURI所所对应的的类型(这这里返回回Nottes.CONNTENNT_IITEMM_TYYPE,代代表一条条日志记记录,而而CONNTENNT_IITEMM_TYYPE = "" vnnd.aandrroidd.cuursoor.iitemm/vnnd.ggooggle.notte "")。 OOverrridde ppubllic Strringg geetTyype(Urii urri) swiitchh (ssUriiMattcheer.mmatcch(uuri) casse NNOTEES: reeturrn NNotees.CCONTTENTT_TYYPE; casse NNOTEE_IDD: reeturrn NNotees.CCONTTENTT_ITTEM_TYPPE; deffaullt: thhrowwnew IIlleegallArggumeentEExceeptiion("Unnknoown URII "+ urii); 上面面的sUUriMMatccherr.maatchh是用来来检测uuri是是否能够够被处理理,而ssUriiMattcheer.mmatcch(uuri)返回值值其实是是由 sUrriMaatchher =new UUriMMatccherr(UrriMaatchher.NO_MATTCH); sUrriMaatchher.adddURII(NootePPad.AUTTHORRITYY, ""nottes"", NNOTEES); sUrriMaatchher.adddURII(NootePPad.AUTTHORRITYY, ""nottes/#", NOOTE_ID);决定的。然后系统使使用获得得的" vndd.anndrooid.currsorr.ittem/vndd.goooglle.nnotee "和和”anddroiid.iinteent.acttionn.EDDIT”到anndrooidmmanffestt.xmml中去去找匹配配的acctivvityy.<inteent-fillterr anndrooid:labbel="sstriing/ressolvve_eeditt"><actiion anddroiid:nnamee="aandrroidd.inntennt.aactiion.VIEEW"/><actiion anddroiid:nnamee="aandrroidd.inntennt.aactiion.EDIIT"/><actiion anddroiid:nnamee="ccom.anddroiid.nnoteepadd.acctioon.EEDITT_NOOTE""/><cateegorry aandrroidd:naame="anndrooid.inttentt.caateggoryy.DEEFAUULT""/><dataa anndrooid:mimmeTyype="vnnd.aandrroidd.cuursoor.iitemm/vnnd.ggooggle.notte"/></inttentt-fiilteer>正好NotteEdditoor这个个acttiviity的的inttentt-fiilteer满足足上述条条件,这这样就找找到了NNoteeEdiitorr。于是是系统加加载这个个类并实实例化,运运行,然然后就到到了NooteEEdittor的的OnCCreaate函函数中(见见后续文文章)。小技巧1,在命令令行中使使用”adbb shhelll”命令进进入系统统中,然然后”cd appp”进入应应用程序序所在目目录,”rm XXXX”就可以以删除你你指定的的apkk,从而而去掉其其在系统统顶层界界面占据据的图标标,若两两次”cd datta”则可以以进入应应用程序序使用的的数据目目录,你你的数据据可以保保存在这这里,例例如Nooteppad就就是把其其数据库库放在它它的daatabbasees目录录下,名名为noote_padd.dbb.2,第一次次启动模模拟器会会比较慢慢,但以以后就别别关闭模模拟器了了,修改改代码,调调试都不不需要再再次启动动的,直直接修改改后ruun或ddebuug就是是。2.在测试试时,如如何实现现一个提提示可以使用1. Toastt.maakeTTextt(thhis, "这这是一个个提示"", TToasst.LLENGGTH_SHOORT).shhow(); 2. /从资源源文件sstriing.xmll 里面面取提示示信息3. Toaast.makkeTeext(thiis, gettStrringg(R.strringg.weelcoome), TToasst.LLENGGTH_SHOORT).shhow();这个提示会会几秒钟钟后消失失3.可以使使用AllerttDiaalogg.Buuildder 才产生生一个提提示框. 例如如像meessaagebbox那那样的1. neew AAlerrtDiialoog.BBuillderr(thhis)2. .settTittle("Anndrooid 提示"")3. .settMesssagge(""这是一一个提示示,请确确定")4. .shoow();带一个确定定的对话话框1. new AAlerrtDiialoog.BBuillderr(thhis)2. .ssetMMesssagee("这这是第二二个提示示")3. .ssetPPosiitivveBuuttoon(""确定"",4. nnew DiaaloggIntterffacee.OnnCliickLListteneer()5. puubliic voiid oonCllickk(DiialoogInnterrfacce ddiallogiinteerfaace, innt ii)6. /按钮钮事件7. 8. )9. .sshoww();AlerttDiaalogg.Buuildder 还有很很多复杂杂的用法法,有确确定和取取消的对对话框1. new AAlerrtDiialoog.BBuillderr(thhis)2. .seetTiitlee("提提示")3. .seetMeessaage("确定定退出?")4. .seetIccon(R.ddrawwablle.qquitt)5. .seetPoosittiveeButttonn("确确定", neew DDiallogIInteerfaace.OnCClicckLiisteenerr() 6. pubblicc voiid oonCllickk(DiialoogInnterrfacce ddiallog, innt wwhicchBuuttoon) 7. settRessultt(REESULLT_OOK);/确确定按钮钮事件8. finnishh();9. 10. )11. .seetNeegattiveeButttonn("取取消", neew DDiallogIInteerfaace.OnCClicckLiisteenerr() 12. pubblicc voiid oonCllickk(DiialoogInnterrfacce ddiallog, innt wwhicchBuuttoon) 13. /取消按按钮事件件14. 15. )16. .shhow();4. menu 的用法法.1. 简单单的代码码1. publiic staaticc fiinall innt IITEMM_1_ID = MMenuu.FIIRSTT;2. publiic staaticc fiinall innt IITEMM_2_ID = MMenuu.FIIRSTT + 1;3. publiic staaticc fiinall innt IITEMM_3_ID = MMenuu.FIIRSTT + 2;4. 5. publiic bboolleann onnCreeateeOpttionnsMeenu(Mennu mmenuu) 6. supper.onCCreaateOOptiionssMennu(mmenuu);7. /不带图图标的mmenuu8. mennu.aadd(0, ITEEM_11_IDD, 00, ""iteem-11"); 9. /带图标标的meenu10. mennu.aadd(0, ITEEM_22_IDD, 11, ""iteem-22").settIcoon(RR.drrawaablee.edditbbillls2);11. mennu.aadd(0, ITEEM_33_IDD, 22, ""iteem-33").settIcoon(RR.drrawaablee.biillssum11);12. retturnn truue; 13. 14.15. publiic bboolleann onnOpttionnsIttemSSeleecteed(MMenuuIteem iitemm)16. sswittch (ittem.gettIteemIdd() 17. ccasee 1:18. Toaast.makkeTeext(thiis, "meenu11",TToasst.LLENGGTH_SHOORT).shhow(); 19. retturnn truue;20. ccasee 2:21. 22. retturnn truue;23. ccasee 3:24. 25. retturnn truue;26. 27. rretuurn fallse;28. 2. meenu实实现的两两种方法法大部分的应应用程序序都包括括两种人人机互动动方式,一一种是直直接通过过GUII的 VViewws,其其可以满满足大部部分的交交互操作作。另外外一种是是应用MMenuu,当按按下Meenu按按钮后,会会弹出与与当前活活动状态态下的应应用程序序相匹配配的菜单单。这两两种方式式相比较较都有各各自的优优势,而而且可以以很好的的相辅相相成,即即便用户户可以由由主界面面完成大大部分操操作,但但是适当当的拓展展Mennu功能能可以更更加完善善应用程程序,至至少用户户可以通通过排列列整齐的的 按钮钮清晰的的了解当当前模式式下可以以使用的的功能。有两种方法可以为Android APPs添加菜单功能,下边将对设置过程给出详细的介绍:第一种方法,通过Layout来添加静态菜单元素。一般情况下,开发者在res/Layout路径下来定义应用程序的GUI。应用Eclipse创建一个新项目后,可以看到res/layout中存在一个 预置的main.xml文件,其作为程序默认启动界面。同样,可以通过这种方式 创建一个静态的Menu,创建方法参阅下边的源代码:?View Code XML<?xmllverrsioon="1.0"eencoodinng="uttf-88"?>> <mmenuuxmllns:anddroiid="htttp:/m/appk/rres/anddroiid">> <<iteem anddroiid:iid="+id/preevioous"" aandrroidd:tiitlee="sstriing/preevioous"" aandrroidd:ennablled="faalsee" aandrroidd:iccon="aandrroidd:drrawaablee/icc_meediaa_prreviiouss"/>> <!-thhesee maay nnot be avaailaablee inn neext apii (lleveel >> 3), sso bbe ccareefulll-> <iitemm aandrroidd:idd="+id/plaay_ppausse" anndrooid:tittle="sstriing/plaay" anndrooid:icoon="aandrroidd:drrawaablee/icc_meediaa_pllay""/> <iitemm aandrroidd:idd="+id/nexxt" anndro