android面试题目--答案.pdf
androidandroid 面试题目面试题目-答案答案AndroidAndroid 笔试题笔试题一、选择题一、选择题1.1.对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(d)(d)A A、onPause()onPause()B B、onCreate()onCreate()C C、onResume()onResume()D D、onStart()onStart()2.android2.android 中下列属于中下列属于 IntentIntent 的作用的是的作用的是(c)(c)A A、实现应用程序间的数据共享、实现应用程序间的数据共享B B、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而、是一段长的生命周期,没有用户界面的程序,可以保持应用在后台运行,而不会因为切换页面而消失不会因为切换页面而消失C C、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带、可以实现界面间的切换,可以包含动作和动作数据,连接四大组件的纽带D D、处理一个应用程序整体性的工作、处理一个应用程序整体性的工作3.3.下面的对自定下面的对自定 stylestyle 的方式正确的是的方式正确的是(a)(a)A A、fill_parentfill_parent B B、fill_parentfill_parent C C、fill_parentfill_parentD D、fill_parentfill_parent4.android4.android 关于关于 serviceservice 生命周期的生命周期的 onCreate()onCreate()和和 onStart()onStart()说法正确的是说法正确的是(ad)(ad)(多选题多选题)A A、当第一次启动的时候先后调用、当第一次启动的时候先后调用 onCreate()onCreate()和和 onStart()onStart()方法方法B B、当第一次启动的时候只会调用、当第一次启动的时候只会调用 onCreate()onCreate()方法方法C C、如果、如果 serviceservice 已经启动,将先后调用已经启动,将先后调用 onCreate()onCreate()和和 onStart()onStart()方法方法D D、如果、如果 serviceservice 已经启动,只会执行已经启动,只会执行 onStart()onStart()方法,不在执行方法,不在执行 onCreate()onCreate()方方法法5.Android5.Android 项目工程下面的项目工程下面的 assetsassets 目录的作用是什么目录的作用是什么 b bA A、放置应用到的图片资源。、放置应用到的图片资源。B B、主要放置多媒体等数据文件、主要放置多媒体等数据文件C C、放置字符串,颜色,数组等常量数据、放置字符串,颜色,数组等常量数据D D、放置一些与、放置一些与 UIUI 相应的布局文件,都是相应的布局文件,都是 xmlxml 文件文件二、填空题二、填空题6.6.androidandroid 中常用的四个布局是中常用的四个布局是 framlayoutframlayout,linenarlayoutlinenarlayout,relativelayoutrelativelayout和和 tablelayouttablelayout。7.7.androidandroid 的四大组件是的四大组件是 activieyactiviey,serviceservice,broadcastbroadcast 和和 contentprovidecontentprovide。8.android8.android 中中 serviceservice 的启动方法是:的启动方法是:startservicestartservice 和和 bindservicebindservice。9.9.activityactivity一一 般般 会会 重重 载载7 7个个 方方 法法 用用 来来 维维 护护 其其 生生 命命 周周 期期,除除 了了onCreate(),onStart(),onDestory()onCreate(),onStart(),onDestory()onrestart,onresume,onpause,onstoponrestart,onresume,onpause,onstop。10.10.androidandroid的的数数据据存存储储的的方方式式sharedpreference,sharedpreference,文文外外,还还有有件件,SQlite,contentprovider,SQlite,contentprovider,网络。网络。11.11.当启动一个当启动一个 ActivityActivity 并且新的并且新的 ActivityActivity 执行完后需要返回到启动它的执行完后需要返回到启动它的ActivityActivity 来执行来执行 的回调函数是的回调函数是 startActivityResult()startActivityResult()。12.12.注册广播有两种常见的方式:使用代码进行注册广播有两种常见的方式:使用代码进行注册注册 和和 AndroidManifest.xmlAndroidManifest.xml 中声明。中声明。三、三、问答题问答题1 1、谈谈你对同步和异步的理解和区别,在谈谈你对同步和异步的理解和区别,在androidandroid 中实现异步的常用方式以及区别。中实现异步的常用方式以及区别。AsyncTaskAsyncTask和和 HandlerHandler 两种异步方式两种异步方式AsyncTaskAsyncTask 实现的原理实现的原理,和适用的优缺点和适用的优缺点l l过程可控过程可控缺点缺点:l l在使用多个异步操作和并需要进行在使用多个异步操作和并需要进行 UiUi变更变更时时,就变得复杂起来就变得复杂起来.HandlerHandler 异步实现的原理和适用的优缺点异步实现的原理和适用的优缺点在在 HandlerHandler 异异步步实实现现时时,涉涉及及到到 Handler,Handler,Looper,Message,ThreadLooper,Message,Thread四个对象,实现异步四个对象,实现异步的流程是主线程启动的流程是主线程启动ThreadThread(子线程)(子线程)thread(thread(子线程子线程)运行并生成运行并生成 Message-Message-LooperLooper获取获取MessageMessage并传递给并传递给HandlerHandler HandlerHandler逐个逐个获取获取 LooperLooper 中的中的 MessageMessage,并进行,并进行 UIUI 变更。变更。使用的优点:使用的优点:l l结构清晰,功能定义明确结构清晰,功能定义明确l l对于多个后台任务时,简单,清晰对于多个后台任务时,简单,清晰使用的缺点:使用的缺点:l l在单个后台异步处理时,显得代码过多,在单个后台异步处理时,显得代码过多,结构过于复杂(相对性)结构过于复杂(相对性)2 2、谈谈你对谈谈你对 httphttp 协议的理解,以及发送协议的理解,以及发送 httphttp请求的常用方法和他们的区别。请求的常用方法和他们的区别。1 1、GETGET 请求的数据会附在请求的数据会附在 URLURL 之后(就是之后(就是把数据放置在把数据放置在HTTPHTTP 协议头中)协议头中),以,以?分割分割URLURL 和传输数据,参数之间以和传输数据,参数之间以&相连,相连,2 2、POSTPOST 把提交的数据则放置在是把提交的数据则放置在是 HTTPHTTP 包包的包体中。的包体中。3 3、GETGET 方式提交的数据最多只能是方式提交的数据最多只能是 10241024 字字节,节,理论上理论上 POSTPOST 没有限制,没有限制,可传较大量的数可传较大量的数据据3 3、androidandroid 中线程间是怎样通信的。中线程间是怎样通信的。andriodandriod 提供了提供了 HandlerHandler 和和 Looper Looper 来满足线程间的通信。来满足线程间的通信。HandlerHandler 先进先出原先进先出原则。则。LooperLooper 类用来管理特定线程内对象之间的消息交换类用来管理特定线程内对象之间的消息交换(MessageExchange)(MessageExchange)。1)Looper:1)Looper:一个线程可以产生一个一个线程可以产生一个 LooperLooper 对象,由它来管理此线程里的对象,由它来管理此线程里的MessageQueue(MessageQueue(消息队列消息队列)。2)Handler:2)Handler:你可以构造你可以构造 HandlerHandler 对象来与对象来与 LooperLooper 沟通,以便沟通,以便 pushpush 新消息新消息到到 MessageQueueMessageQueue 里里;或者接收或者接收 LooperLooper 从从 Message QueueMessage Queue 取出取出)所送来的消息。所送来的消息。3)Message Queue(3)Message Queue(消息队列消息队列):):用来存放线程放入的消息。用来存放线程放入的消息。4)4)线程:线程:UIthreadUIthread 通常就是通常就是 main threadmain thread,而,而 AndroidAndroid 启动程序时会替它启动程序时会替它建立一个建立一个 MessageQueueMessageQueue。四、程序设计四、程序设计1 1、谈谈你对观察者设计模式的理解,请以编写、谈谈你对观察者设计模式的理解,请以编写简单的示例代码。简单的示例代码。2 2、实际问题:实际问题:随着随着 androidandroid 的迅速崛起,的迅速崛起,androidandroid广告平台也跟着产生,广告平台也跟着产生,就光国内就几十家,就光国内就几十家,如果如果开发者对每个广告平台都进行集成的话是一件开发者对每个广告平台都进行集成的话是一件很费力不讨好的事情,很费力不讨好的事情,因为开发者需要阅读各个因为开发者需要阅读各个广告平台的文档,广告平台的文档,编写代码以及维护等,编写代码以及维护等,如果让如果让你为开发者解决该问题的话你为开发者解决该问题的话(即为开发者设计一(即为开发者设计一个聚合多家广告平台的个聚合多家广告平台的 sdksdk,开发者使用该,开发者使用该 sdksdk.hprof.hprof 文件会自动保存在文件会自动保存在 SDSD 卡上,把卡上,把.hprof.hprof 文件拷贝到文件拷贝到 PCPC 上的上的 android-sdk-windowstoolsandroid-sdk-windowstools 目录下。这个由目录下。这个由 DDMSDDMS 生成的文件不能直接在生成的文件不能直接在MATMAT 打开,需要转换。打开,需要转换。运行运行 cmdcmd 打开命令行,打开命令行,cdcd 到到 android-sdk-windowstools android-sdk-windowstools 所在目录,所在目录,并输入命令并输入命令 hprof-convhprof-conv xxxxx.hprofxxxxx.hprof yyyyy.hprofyyyyy.hprof,其中,其中 xxxxx.hprofxxxxx.hprof 为原为原始文件,始文件,yyyyy.hprofyyyyy.hprof 为转换过后的文件。转换过后的文件自动放在为转换过后的文件。转换过后的文件自动放在android-sdk-windowstoolsandroid-sdk-windowstools 目录下。目录下。OKOK,到此为止,到此为止,.hprof.hprof 文件处理完毕,可以用来分析内存泄露情况了。文件处理完毕,可以用来分析内存泄露情况了。5.5.打开打开 MATMAT:在在 EclipseEclipse 中点击中点击 Windows-Open Perspective-Other-MemoryWindows-Open Perspective-Other-MemoryAnalysisAnalysis6.6.导入导入.hprof.hprof 文件文件在在 MATMAT 中点击中点击 File-Open File-Open File,File,浏览到刚刚转换而得到的浏览到刚刚转换而得到的.hprof.hprof 文件,文件,并并 CancelCancel 掉自动生成报告掉自动生成报告,点击点击 DominatorDominator TreeTree,并按,并按 PackagePackage 分组,选择分组,选择自己所定义的自己所定义的 PackagePackage 类点右键,在弹出菜单中选择类点右键,在弹出菜单中选择 List objects-WithList objects-Withincoming referencesincoming references。这时会列出所有可疑类,右键点击某一项,并选择这时会列出所有可疑类,右键点击某一项,并选择 Path to GCPath to GCRoots-exclude weak/soft references,Roots-exclude weak/soft references,会进一步筛选出跟程序相关的所有会进一步筛选出跟程序相关的所有有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。有内存泄露的类。据此,可以追踪到代码中的某一个产生泄露的类。1 1、JNIJNI 和和 NDKNDK的区别的区别androidandroid 常用的开发方式是常用的开发方式是 javajava 封装的库,而这些库的底层实现是由封装的库,而这些库的底层实现是由 C/C+C/C+实现,如媒体,图形库等实现,如媒体,图形库等javajava 调用这样实现就需要用调用这样实现就需要用 JNIJNI(Java Native InterfaceJava Native Interface)平时用的也就是平时用的也就是 googlegoogle 给我们封装的好的库,即便是底层实现用的不是给我们封装的好的库,即便是底层实现用的不是JavaJava,但都有统一的,但都有统一的 JavaJava 接口接口而而 NDKNDK 的作用是“我们自己写本地代码”的作用是“我们自己写本地代码”(C/C+)C/C+),自己用自己用 JNIJNI 封装成封装成 JavaJava接口接口比如我们想做个计算,二这不是比如我们想做个计算,二这不是 JavaJava 的强项,可以用的强项,可以用C/C+C/C+来写实现,返回来写实现,返回一个运算结果就行了一个运算结果就行了NDKr5NDKr5 已经实现了不用写一行已经实现了不用写一行 JavaJava 代码开发程序了,代码开发程序了,只不过还是用到了虚拟只不过还是用到了虚拟机,细节被封装隐藏起来了而已机,细节被封装隐藏起来了而已JNIJNI 是是 JavaJava 调用调用 NativeNative 机制,是机制,是JavaJava 语言自己的特性全称为语言自己的特性全称为 Java Java NativeNativeInterfaceInterface,类似的还有微软,类似的还有微软.Net Framework.Net Framework 上的上的 p/invokep/invoke,可以让,可以让 C#C#或或VisualVisual Basic.NetBasic.Net 可以调用可以调用 C/C+C/C+的的 APIAPI,所以说,所以说JNIJNI 和和 AndroidAndroid 没有关系,没有关系,在在 PCPC 上开发上开发 JavaJava 的应用,如果运行在的应用,如果运行在 WindowsWindows 平台使用平台使用 JNI JNI 是是经常的,是是经常的,比如说读写比如说读写 WindowsWindows 的注册表。的注册表。NDKNDK 是是 GoogleGoogle 公司推出的帮助公司推出的帮助 AndroidAndroid 开发者通过开发者通过 C/C+C/C+本地语言编写应用本地语言编写应用的开发包,包含了的开发包,包含了 C/C+C/C+的头文件、库文件、说明文档和示例的头文件、库文件、说明文档和示例 代码,我们可代码,我们可以理解为以理解为 WindowsWindows PlatformPlatform SDKSDK 一样,是纯一样,是纯 C/C+C/C+编写的,但是编写的,但是 AndroidAndroid 并并不支持纯不支持纯 C/C+C/C+编写的应用,同时编写的应用,同时 NDKNDK 提供的库和函数功能很有限,仅仅处提供的库和函数功能很有限,仅仅处理些算法效率敏感的理些算法效率敏感的 问题。问题。