《android面试宝典11043.docx》由会员分享,可在线阅读,更多相关《android面试宝典11043.docx(110页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1. 什么是Activity? 四大组件之之一,一般的,一个用户户交互界面面对应一个个actiivityysetCoontenntVieew() ,/ 要显示的的布局 buttoon.seetOncclickkLinssteneer, acttivitty 是CConteext的子子类,同时时实现了wwindoow.caallbaack和kkeyevvent.calllbackk, 可以以处理与窗窗体用户交交互的事件件.我开发常用用的的有LListAActivvity , PPrefeerencceActtivitty ,TTabAccitivvty等如果界面有有共同的特特点或者功功能的时候候
2、,还会自自己定义一一个BasseActtivitty. 进度对话框框的显示与与销毁 doubbanseervicce 2. 请描描述一下AActivvity 生命周期期。生命周期描描述的是一一个类 从从创建(nnew出来来)到死亡亡(垃圾回回收)的过过程中会执执行的方法法.在这个过程程中 会针针对不同的的生命阶段段会调用不不同的方法法Activvity从从创建到销销毁有多种种状态,从从一种状态态到另一种种状态时会会激发相应应的回调方方法,这些些回调方法法包括:ooncreeate ondeestrooy onnstopp onsstartt onrresumme onnpausse 其实这些方
3、方法都是两两两对应的的,onCCreatte创建与与onDeestrooy销毁;onStaart可见见与onSStop不不可见;oonRessume可可编辑(即即焦点)与与onPaause;这6个方法法是相对应应的,那么么就只剩下下一个onnResttart方方法了,这这个方法在在什么时候候调用呢?答案就是:在Acttivitty被onnStopp后,但是是没有被oonDesstroyy,在再次次启动此AActivvity时时就调用oonResstartt(而不再再调用onnCreaate)方方法;如果被onnDesttroy了了,则是调调用onCCreatte方法。最后讲自己己项目中的的经验
4、,比比如说豆瓣瓣客户端每每次进入某某个界面的的时候都要要看到最新新的数据,这个刷新新列表的操操作 就放放在onSStartt()的方方法里面.这样保证证每次用户户看到的数数据都是最最新的.多媒体播放放, 播放放来电话. onSStop() 视频频, 视频频声音设置置为0 , 记录视视频播放的的位置 mmediaaplayyer.ppausee();onStaart() 根据保保存的状态态恢复现场场. meediapplayeer.sttart(); 在读文档的的时候 还还发现 aactivvity还还有两个方方法 onnPosttResuume() 和 OOnPosstCreeate()这两个
5、个生命周期期的方法,不过开发发的时候没没有用到过过.3. 两个个Actiivityy之间跳转转时必然会会执行的是是哪几个方方法。一般情况比比如说有两两个acttivitty,分别别叫A,BB ,当在在A里面激激活B组件件的时候, A 会会调用 oonPauuse()方法,然然后B 调调用onCCreatte() ,onSStartt(), OnReesumee() , 这个时候候B覆盖了了窗体, A会调用用onSttop()方法. 如果BB呢 是个个透明的,或者是对对话框的样样式, 就就不会调用用onSttop()方法4. 横竖竖屏切换时时候Acttivitty的生命命周期。这个生命周周期跟清
6、单单文件里的的配置有关关系1、不设置置Actiivityy的anddroidd:connfigCChangges时,切切屏会重新新调用各个个生命周期期默认首先销销毁当前aactivvity,然后重新新加载2、设置AActivvity的的andrroid:conffigChhangees=oorienntatiion|kkeybooardHHiddeen时,切切屏不会重重新调用各各个生命周周期,只会会执行onnConffigurratioonChaangedd方法游戏开发中中, 屏幕幕的朝向都都是写死的的. 5. 如何何将一个AActivvity设设置成窗口口的样式。androoid:tthem
7、ee=aandrooid:sstylee/Theeme.DDialoog 可以自自定义一个个actiivityy的样式,详细见手手机卫士的的程序详细细信息androoid:tthemee=sstylee/FlooatAcctiviityE:daay9mmobillesaffereesvaaluessstyyle6. 你后后台的Acctiviity被系系统 回收收怎么办?如果后台台的Acttivitty由于某某原因被系系统回收可可了,如何何在被系统统回收之前前保存当前前状态?除了在栈顶顶的acttivitty,其他他的acttivitty都有可可能在内存存不足的时时候被系统统回收,一一个actt
8、ivitty越处于于栈底,被被回收的可可能性越大大.proteecteddvoidd onSSaveIInstaanceSStatee(Bunndle outSStatee) superr.onSSaveIInstaanceSStatee(outtStatte);outSStatee.puttLongg(idd, 1123455678990);publiicvoiid onnCreaate(BBundlle saavedIInstaanceSStatee) /判断 saveedInsstancceStaate是不不是空./如果不不为空就取取出来superr.onCCreatte(saavedI
9、InstaanceSStatee);7. 如何何退出Acctiviity?如如何安全退退出已调用用多个Acctiviity的AAppliicatiion?退出acttivitty 直接接调用 ffinissh () 方法 . /用户点击击backk键 就是是退出一个个actiivityy 退出acttivitty 会执执行 onnDesttroy()方法 .1、抛异常常强制退出出:该方法通过过抛异常,使使程序Foorce Closse。 验证可以,但但是,需要要解决的问问题是,如如何使程序序结束掉,而而不弹出FForcee Cloose的窗窗口。/安全结结束进程 andrroid.os.PPr
10、oceess.kkillPProceess(aandrooid.oos.Prrocesss.myyPid();2、记录打打开的Acctiviity:每打开一个个Actiivityy,就记录录下来。在在需要退出出时,关闭闭每一个AActivvity即即可。Liist lissts ; 在apppliccatioon 全集集的环境里里面 lissts = neww ArrrayLiist();listss.addd(acttivitty);for(AActivvity actiivityy: liists)actiivityy.finnish();3、发送特特定广播:在需要结束束应用时,发发送一个
11、特特定的广播播,每个AActivvity收收到广播后后,关闭即即可。/给某个个actiivityy 注册接接受接受广广播的意图图 regiisterrReceeiverr(recceiveer, ffilteer)/如果过过接受到的的是 关闭闭actiivityy的广播 就调用用finiish()方法 把把当前的aactivvity finiish()掉 4、递归退退出在打开新的的Actiivityy时使用sstarttActiivityyForRResullt,然后后自己加标标志,在oonActtivittyRessult中中处理,递递归关闭。上面是网上上的一些做做法.其实 可以以通过 ii
12、ntennt的fllag 来来实现. inttent.setFFlag(FLAGG_ACTTIVITTY_CLLEAR_TOP)激活一个个新的acctiviity,然然后在新的的actiivityy的onccreatte方法里里面 fiinishh掉.讲一讲你对对actiivityy的理解 把上面的几几点用自己己的心得写写出来8. seervicce是否在在mainn thrread中中执行, servvice里里面是否能能执行耗时时的操作?默认情况,如果没有有显示的指指定serrvicee所运行的的进程, Serviice和aactivvity是是运行在当当前appp所在进程程的maiin
13、thhreadd(UI主主线程)里里面 serviice里面面不能执行行耗时的操操作(网络络请求,拷拷贝数据库库,大文件件 )在子线程中中执行 nnew TThreaad().sttart();特殊情况 ,可以在在清单文件件配置 sserviice 执执行所在的的进程 ,让serrvicee在另外的的进程中执执行 9. 两个个Actiivityy之间怎么么传递数据据?基本数据类类型可以通通过. Intennt 传递递数据 在A acctiviity中Intennt inntentt = nnew IIntennt();intennt.puutExttra(nname, vallue) Bund
14、dle bbundlle = new BBundlle(); bunddle.pputBoooleaan(keey, vallue); inteent.pputExxtrass(bunndle);extraas.puutDouuble(key, valuue)/ 通过过inteent pputExxtra 方法 基基本数据类类型 都传传递 Inteent ii = ggetInntentt(); i.geetExttras();intennt.geetStrringEExtraa(keey,valuue);intennt.geetBoooleannExtrra(kkey,vallue)Bund
15、dle bbundlle = new Bunndle(); bumddle.pputShhort(key, vallue); inteent.pputExxtrass(bummdle);intennt.puutExttras(bunddle)-Appliicatiion 全全局里面存存放 对象象 ,自己己去实现自自己的apppliccatioon的这个个类,基础系统的的appllicattion , 每个个actiivityy都可以取取到-让对象实现现 impplemeents Serrialiizablle 接口口把对象存存放到文件件上. 让类实现SSeriaalizaable 接口,然然后
16、可以通通过 ObbjecttOutpputSttreamm /对对象输出流流 Fille fiile = neww Fille(cc:1.obj);FilleOuttputSStreaam foos = neww FilleOuttputSStreaam(fiile);ObjjectOOutpuutStrream oos = neew ObbjecttOutpputSttreamm(foss);Stuudentt stuu = nnew SStudeent();ooss.wriiteObbjectt(stuu);/从从文件中把把对象读出出来 ObjjectIInputtStreeam oois
17、 = neww ObjjectIInputtStreeam(aarg0); Sttudennt sttu1 = (Sttudennt) oois.rreadOObjecct();文件/网络络 intennt.seetDatta(Urri) Uri.ffromFFile(); /大图图片的传递递10. 怎怎么让在启启动一个AActivvity是是就启动一一个serrvicee?在actiivityy的onCCreatte()方方法里面 starrtSerrvicee();11. 同同一个程序序,不同的的Actiivityy是否可以以放在不同同的Tassk任务栈栈中?比方说在激激活一个新新的act
18、tivitty时候, 给inntentt设置fllagIntennt的fllag添加加FLAGG_ACTTIVITTY_NEEW_TAASK 这个个被激活的的actiivityy就会在新新的tassk栈里面面Inteent iintennt = new Inteent(AA.thiis,B.classs);inteent.ssetFllags(Inteent.FFLAG_ACTIIVITYY_NEWW_TASSK);starrtActtivitty(inntentt);2.Acttivitty的启动动模式就有有一种单例例模式,它它就是单独独的一个任任务栈。12. AActivvity怎怎么和s
19、eervicce绑定,怎怎么在acctiviity中启启动自己对对应的seervicce?starttServvice() 一旦旦被创建 调用着着无关 没法使使用serrvicee里面的方方法 bindSServiice () 把sserviice 与与调用者绑绑定 ,如如果调用者者被销毁, serrvicee会销毁bindSServiice() 我们可可以使用sserviice 里里面的方法法binddServvice(). 让acttivitty能够访访问到 sserviice里面面的方法构建一个个inteent对象象,Intennt seervicce = new Inteent(tth
20、is,MySeervicce.cllass); 通过biindSeervicce的方法法去启动一一个服务, bbindSServiice(iintennt, nnew MMyConnn(), BINND_AUUTO_CCREATTE);ServiiceCoonnecctionn 对象(重写onnServviceCConneectedd和OnSServiiceDiisconnnectted方法法) 和BBIND_AUTOO_CREEATE.privvate classs myyconnn impplemeents ServviceCConneectioonpubblic voidd onSSer
21、viiceCoonneccted(CompponenntNamme naame, IBinnder servvice) / TODDO Auuto-ggenerratedd metthod stubb/可以通通过IBiinderr的对象 去使用sserviice里面面的方法pubblic voidd onSServiiceDiisconnnectted(CCompoonenttNamee namme) / TODDO Auuto-ggenerratedd metthod stubb13. 114 .什什么是Seervicce以及描描述下它的的生命周期期。Serrvicee有哪些启启动方法,有有
22、什么区别别,怎样停停用Serrvicee?在Servvice的的生命周期期中,被回回调的方法法比Acttivitty少一些些,只有oonCreeate, onSStartt, onnDesttroy,onBinnd和onnUnbiind。通常有两种种方式启动动一个Seervicce,他们们对Serrvicee生命周期期的影响是是不一样的的。1 通过sstarttServvice SServiice会经经历 onnCreaate 到到onSttart,然然后处于运运行状态,sstopSServiice的时时候调用oonDesstroyy方法。 如果果是调用者者自己直接接退出而没没有调用sstop
23、SServiice的话话,Serrvicee会一直在在后台运行行。 2 通通过binndSerrvicee SServiice会运运行onCCreatte,然后后是调用oonBinnd, 这这个时候调调用者和SServiice绑定定在一起。调调用者退出出了,Srrevicce就会调调用onUUnbinnd-oonDesstroyyed方法法。 所谓谓绑定在一一起就共存存亡了。调调用者也可可以通过调调用unbbindSServiice方法法来停止服服务,这时时候Sreevicee就会调用用onUnnbindd-onnDesttroyeed方法。需要注意的的是如果这这几个方法法交织在一一起的话,会
24、会出现什么么情况呢?一个原则是是Servvice的的onCrreatee的方法只只会被调用用一次,就就是你无论论多少次的的starrtSerrvicee又binndSerrvicee,Serrvicee只被创建建一次。如果先是bbind了了,那么sstartt的时候就就直接运行行Servvice的的onSttart方方法,如果先是sstartt,那么bbind的的时候就直直接运行oonBinnd方法。如果serrvicee运行期间间调用了bbindSServiice,这这时候再调调用stoopSerrvicee的话,sserviice是不不会调用oonDesstroyy方法的,sserviic
25、e就sstop不不掉了,只只能调用UUnbinndSerrvicee, seervicce就会被被销毁如果一个sserviice通过过starrtSerrvicee 被sttart之之后,多次次调用sttartSServiice 的的话,seervicce会多次次调用onnStarrt方法。多多次调用sstopSServiice的话话,serrvicee只会调用用一次onnDesttroyeed方法。如果一个sserviice通过过binddServvice被被starrt之后,多多次调用bbindSServiice的话话,serrvicee只会调用用一次onnBindd方法。多次调用uunb
26、inndSerrvicee的话会抛抛出异常。15. 不用serrvicee,B页面面为音乐播播放,从AA跳转到BB,再返回回,如何使使音乐继续续播放?new MMediaaplayyer 这个问题问问的很山寨寨.默认不不做任何处处理,B里里面的音乐乐都能播放放. 遇到问题, 可以随随机应变,灵活发挥挥,多考虑虑些细节,比如说这这个题就可可以这样说说,说说你你对staartAcctiviityFoorRessult的的理解()B的结束的的时候 ssetReesultt()A会调用到到onAcctiviityReesultt()就会获取到到resuultCoodeA开启B的的时候,用用starrt
27、ActtivittyForrResuult()方法, B返回的的时候把播播放的状态态信息返回回给A ,A继续播播放音乐. seekTTo(reesulttCodee)16. 什什么是InntenttServvice?有何优点点?普通的seervicce ,默默认运行在在ui mmain 主线程Sdk给我我们提供的的方便的,带有异步步处理的sserviice类, 可以在OOnHanndleIIntennt() 处理耗时时的操作其实是一个个单线程,多多个任务需需要排队。本本质是线程程+Hanndlerr+队列17. 什什么时候使使用Serrvicee?拥有seervicce的进程程具有较高高的优先
28、级级 官官方文档告告诉我们,AAndrooid系统统会尽量保保持拥有sserviice的进进程运行,只只要在该sserviice已经经被启动(starrt)或者者客户端连连接(biindSeervicce)到它它。当内存存不足时,需需要保持,拥拥有serrvicee的进程具具有较高的的优先级。1 如果果servvice正正在调用oonCreeate, onnStarrtCommmandd或者onnDesttory方方法,那么么用于当前前servvice的的进程相当当于前台进进程以避免免被killled。2 如果果当前seervicce已经被被启动(sstartt),拥有有它的进程程则比那些些用
29、户可见见的进程优优先级低一一些,但是是比那些不不可见的进进程更重要要,这就意意味着seervicce一般不不会被kiilledd.3 如果果客户端已已经连接到到servvice (binndSerrvicee),那么么拥有Seervicce的进程程则拥有最最高的优先先级,可以以认为seervicce是可见见的。4 如果果servvice可可以使用sstarttForeegrouund(iint, Notiificaationn)方法来来将serrvicee设置为前前台状态,那那么系统就就认为是对对用户可见见的,并不不会在内存存不足时kkilleed。如果有其他他的应用组组件作为SServiic
30、e,AActivvity等等运行在相相同的进程程中,那么么将会增加加该进程的的重要性。总结:1.可见后后台的;22.后台的的,serrviceeacttivitty;3.servvice之之间谁大?starrtForregroound()启启动的服务务级别要大大;1.Seervicce的特点点可以让他他在后台一一直运行,可以在sserviice里面面创建线程程去完成耗耗时的操作作.new TThreaad()TimerrTaskk / 循环的执执行一个定定时的任务务 .staart();2.Brroadccast receeiverr捕获到一一个事件之之后,可以以起一个sserviice来完完
31、成一个耗耗时的操作作.ANR new Servvice()微信开开机接收推推送消息3.远程程的serrvicee如果被启启动起来,可以被多多次binnd, 但但不会重新新creaate. 索爱手手机X100i的人脸脸识别的sserviice可以以被图库使使用,可以以被摄像机机,照相机机等程序使使用.画廊 摄像像机 照相相机 bbindSServiice() Ibbindeer的对象象, 访问问servvice AIDDL18. 请请描述一下下Inteent 和和 Inttent Filtter。Androoid 中中通过 IIntennt 对象象来表示一一条消息,一一个 Inntentt 对象
32、不不仅包含有有这个消息息的目的地地,还可以以包含消息息的内容,这这好比一封封 Emaail,其其中不仅应应该包含收收件地址,还还可以包含含具体的内内容。对于于一个 IIntennt 对象象,消息“目的地”是必须的的,而内容容则是可选选项。通过Inttent 可以实现现各种系统统组件的调调用与激活活. Intennt fiilterr: 可以以理解为邮邮局或者是是一个信笺笺的分拣系系统这个分拣系系统通过33个参数来来识别Actioon: 动动作 vieew Data: 数据uuri urii Categgory : 而外外的附加信信息 Actioon 匹配配Actioon 是一一个用户定定义的字
33、符符串,用于于描述一个个 Anddroidd 应用程程序组件,一一个 Inntentt Fillter 可以包含含多个 AActioon。在 AndrroidMManiffest.xml 的 Acctiviity 定定义时可以以在其 节节点指定一一个 Acctionn 列表用用于标示 Actiivityy 所能接接受的“动作”,例如: 如果我们在在启动一个个 Acttivitty 时使使用这样的的 Inttent 对象: Inteent iintennt =nnew IIntennt(); inteent.ssetAcctionn(cn.ittcastt.acttion); starrtAct
34、tivitty(inntentt);那么所有的的 Acttion 列表中包包含了“cn.ittcastt”的 Acttivitty 都将将会匹配成成功。Androoid 预预定义了一一系列的 Actiion 分分别表示特特定的系统统动作。这这些 Acctionn 通过常常量的方式式定义在 andrroid.conttent. Inttent中中,以“ACTIION_”开头。我我们可以在在 Anddroidd 提供的的文档中找找到它们的的详细说明明。URI 数数据匹配一个 Inntentt 可以通通过 URRI 携带带外部数据据给目标组组件。在 节点中,通通过 节点匹匹配外部数数据。mimeTT
35、ype 属性指定定携带外部部数据的数数据类型,sschemme 指定定协议,hhost、pport、ppath 指定数据据的位置、端端口、和路路径。如下下: Intennt inntentt = nnew IIntennt();intennt.seetActtion(Inteent.AACTIOON_CAALL);insennt.seetDatta( UUri.pparsee(tell:123345);starttAcittivtyy();电话的urri tel: 123345 httpp:/m自己定义的的uri itccast:/cnn.itccast/persson/110如果在 IInt
36、ennt Fiilterr 中指定定了这些属属性,那么么只有所有有的属性都都匹配成功功时 URRI 数据据匹配才会会成功。Categgory 类别匹配配节节点中可以以为组件定定义一个 Cateegoryy 类别列列表,当 Inteent 中中包含这个个列表的所所有项目时时 Cattegorry 类别别匹配才会会成功。默认是DEEFAULLT19. IIntennt传递数数据时,可可以传递哪哪些类型数数据?1.一般般的基本数数据类型 Inttent .puttextrra() inteent.ggetexxtra();Parseelablle Seeriallizabble2.数据据的urii,
37、 inntentt.settDataa() iintennt.geetDatta();20. 说说说Acttivitty,Inntentt,Serrvicee是什么关关系 。麦当劳和麦麦当娜的关关系是什么么关系?这种问题题,就讲下下actiivityy, 讲一一下serrvicee ,说一一下 通过过inteent去激激活组件,传递数据据.说自己项目目中有这样样一个网络络更新的功功能,显示示界面就用用的acttivitty, 后后台有个sserviice每隔隔半小时都都去访问下下服务器获获取更新的的数据开启服务用用的是inntentt来开启21. 请请描述一下下Broaadcasst Reec
38、eivver。有很多广播播接收者 ,系统已已经实现了了.广播分两种种 有序广广播 无序广播 指定接收收者的有序序广播 . senddOrdeeredBBroaddcastt(inttent, recceiveerPerrmisssion, ressultRReceiiver, schheduller, inittialCCode, iniitiallDataa, iniitiallExtrras)接受者一定定会获取到到 广播的的事件 sendSStickkyBrooadcaast(iintennt) /阴魂魂不散广播接受者者在onRReceiive 方方法获取到到广播的事事件 Wifi设设置
39、等等待wiffi状态更更新完毕 是不可可以被拦截截掉的 -10000 - 11000 aborrtBrooadcaast(); 用于接收收系统的广广播通知, 系统会会有很多ssd卡挂载载,手机重重启,广播播通知,低低电量,来来电,来短短信等. 手机卫士士中自定义义一个brroadccast receeiverr smms_reeceivved 来获取短信信到来的广广播, 根根据黑名单单来判断是是否拦截该该短信. 画画板生生成图片后后,发送一一个sd挂挂载的通知知,通知系系统的gaallerry去获取取到新的图图片.Intennt inntentt = nnew IIntennt(Inntent
40、t.ACTTION_MEDIIA_MOOUNTEED,Urri.paarse(fille:/+Ennviroonmennt.geetExtternaalStoorageeDireectorry();sendBBroaddcastt(inttent);22. 在在maniifestt和代码中中如何注册册和使 用用 brooadcaast rreceiiver 。设置广播播接收者的的优先级,设置广播播接受者的的actiion名字字 等详细见工程程代码. 可以通过代代码 regiisterrReceeiverr(recceiveer, fillter)23. 请介绍下CConteentPrrovid
41、der是如如何实现数数据共享的的。ConteentPrrovidder 可可以屏蔽数数据操作的的细节 文文件 xmml MyConntenttProvviderr 可以在在不同应用用程序之间间共享数据据 shhareddprefferennce ddb把自己的数数据通过uuri的形形式共享出出去androoid 系统下 不同程序序 数据默默认是不能能共享访问问 需要去实实现一个类类去继承CConteentPrrovidderpubliic cllass PerssonCoontenntProovideer exxtendds CoontenntProovideerpubllic bbooleean oonCreeate()/.queryy(Urii, Sttringg, Striing, Striing, Sttringg)inserrt(Urri, CCon