1、面试题目答案 资料仅供参考 Android笔试题 一、选择题 1. 对一些资源以及状态的操作保存,最好是保存在生命周期的哪个函数中进行(d) A、onPause() B、onCreate() C、 onResume() D、onStart() 2. android 中下列属于Intent的作用的是(c) A、实现应用程序间的数据共享 B、是一段长的生命周期,没有用户界面的程序,能够保持应用在后台运行,而不会因为切换页面而消失 C、能够实现界面间的切换,能够包含动作和动作数据,连接四大组件的纽带 D、处理一个应用程序整体性的工作 3. 下面的对
2、自定style的方式正确的是(a)
A、
4、)和onStart()方法 D、如果service已经启动,只会执行onStart()方法,不在执行onCreate()方法 5. Android项目工程下面的assets目录的作用是什么b A、放置应用到的图片资源。 B、主要放置多媒体等数据文件 C、放置字符串,颜色,数组等常量数据 D、放置一些与UI相应的布局文件,都是xml文件 二、填空题 6. android中常见的四个布局是framlayout,linenarlayout,relativelayout和tablelayout。 7. android 的四大组件是activiey,service,broadc
5、ast和contentprovide。 8. android 中service的启动方法是:startservice和bindservice。 9. activity一般会重载7个方法用来维护其生命周期,除了onCreate(),onStart(),onDestory()外,还有onrestart,onresume,onpause,onstop。 10. android的数据存储的方式sharedpreference,文件,SQlite,contentprovider,网络。 11. 当启动一个Activity而且新的Activity执行完后需要返回到启动它的Activity来执行 的
6、回调函数是startActivityResult()。 12. 注册广播有两种常见的方式:使用代码进行注册 和 AndroidManifest.xml中声明。 三、 问答题 1、 谈谈你对同步和异步的理解和区别,在android中实现异步的常见方式以及区别。 AsyncTask和Handler两种异步方式 AsyncTask实现的原理,和适用的优缺点 l 过程可控 缺点: l 在使用多个异步操作和并需要进行Ui变更时,就变得复杂起来. Handler异步实现的原理和适用的优缺点 在Handler 异步实现时,涉及到 Handler, Looper, Messa
7、ge,Thread四个对象,实现异步的流程是主线程启动Thread(子线程)àthread(子线程)运行并生成Message-àLooper获取Message并传递给HandleràHandler逐个获取Looper中的Message,并进行UI变更。 使用的优点: l 结构清晰,功能定义明确 l 对于多个后台任务时,简单,清晰 使用的缺点: l 在单个后台异步处理时,显得代码过多,结构过于复杂(相对性) 2、 谈谈你对http协议的理解,以及发送http请求的常见方法和她们的区别。 1、GET请求的数据会附在URL之后(就是把数据放置在HTTP协议头中),以?分割URL
8、和传输数据,参数之间以&相连, 2、POST把提交的数据则放置在是HTTP包的包体中。 3、"GET方式提交的数据最多只能是1024字节,理论上POST没有限制,可传较大量的数据 3、android中线程间是怎样通信的。 andriod提供了Handler 和 Looper 来满足线程间的通信。Handler先进先出原则。Looper类用来管理特定线程内对象之间的消息交换(MessageExchange)。 1)Looper: 一个线程能够产生一个Looper对象,由它来管理此线程里的MessageQueue(消息队列)。 2)Handler: 你能够构造Handle
9、r对象来与Looper沟通,以便push新消息到MessageQueue里;或者接收Looper从Message Queue取出)所送来的消息。 3) Message Queue(消息队列):用来存放线程放入的消息。 4)线程:UIthread 一般就是main thread,而Android启动程序时会替它建立一个MessageQueue。 四、程序设计 1、谈谈你对观察者设计模式的理解,请以编写简单的示例代码。 2、实际问题:随着android的迅速崛起,android广告平台也跟着产生,就光国内就几十家,如果开发者对每个广告平台都进行集成的话是一件很费力不讨
10、好的事情,因为开发者需要阅读各个广告平台的文档,编写代码以及维护等,如果让你为开发者解决该问题的话(即为开发者设计一个聚合多家广告平台的sdk,开发者使用该sdk后能够切换这广告平台的展示)。你该怎么做。 假设现在有三家广告平台,请设计一个sdk聚合这三家广告平台,把这个sdk给开发者用,开发者使用该sdk后,就像使用一家广告平台一样,她们不需要阅读这三家广告平台的文档,只需要阅读我们sdk的文档即可(假设平台广告的广告只要请求就可展示,无需其它信息)。 具体要求: 1、 广告在30秒后切换下一个广告平台,下一个广告平台随机生成。 2、编写示例代码 面试题目
11、 1、 谈谈你对面向对象以及面向对象的程序设计的理解,特征。 2、 对android中分辨率,密度的了解以及在android中怎样处理由于分辨率问题。 3、 谈谈你对线程和后台服务的理解和区别。 4、 关于android开发中如何调试,如何查看log 5、 android的内存管理,导致android内存泄露的原因,以及在android中怎样分析内存泄露。 在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,程序员不需要经过调用函数来释放内存,但它只能回收无用而且不再被其它对象引用的那些对象所占用的空间。 导致
12、内存泄漏主要的原因是,先前申请了内存空间而忘记了释放。如果程序中存在对无用对象的引用,那么这些对象就会驻留内存,消耗内存,因为无法让垃圾回收器GC验证这些对象是否不再需要。如果存在对象的引用,这个对象就被定义为"有效的活动",同时不会被释放。要确定对象所占内存将被回收,我们就要务必确认该对象不再会被使用。典型的做法就是把对象数据成员设为null或者从集合中移除该对象。但当局部变量不需要时,不需明显的设为null,因为一个方法执行完毕时,这些引用会自动被清理。 在Java中,内存泄漏就是存在一些被分配的对象,这些对象有下面两个特点,首先,这些对象是有被引用的,即在有向树形图中,存在树枝通路能
13、够与其相连;其次,这些对象是无用的,即程序以后不会再使用这些对象。如果对象满足这两个条件,这些对象就能够判定为Java中的内存泄漏,这些对象不会被GC所回收,然而它却占用内存。 强引用:引用为空的时候,Java的垃圾回收器会处理。一般来说自己写的程序大部分都是强引用。 软引用:堆内存不够的时候,Java的垃圾回收器会处理这类引用。 弱引用:Jave的垃圾回收器每次都会回收这类引用。 如何用MAT来分析,前提是Android开发和测试的工具安装完整,SDK,Eclipse: 1.打开Eclipse 2.选择 Help->Install New Software;
14、 3.在Work with中添加站点:(这个地址可能会变化,可是新的地址能够在官方网站上找到:) 4.生成.hprof文件:插入SD卡(Android机器很多程序都需要插入SD卡),并将设备连接到PC,在Eclipse中的DDMS中选择要测试的进程,然后点击Update Heap 和Dump HPROF file两个Button。 .hprof 文件会自动保存在SD卡上,把 .hprof 文件拷贝到PC上的\ android-sdk-windows\tools目录下。这个由DDMS生成的文件不能直接在MAT打开,需要转换。 运行cmd打开命令行,cd到\ a
15、ndroid-sdk-windows\tools所在目录,并输入命令hprof-conv xxxxx.hprof yyyyy.hprof,其中xxxxx.hprof为原始文件,yyyyy.hprof为转换过后的文件。转换过后的文件自动放在android-sdk-windows\tools 目录下。 OK,到此为止,.hprof文件处理完毕,能够用来分析内存泄露情况了。 5.打开MAT: 在Eclipse中点击Windows->Open Perspective->Other->Memory Analysis 6.导入.hprof文件 在MAT中点击 Fil
16、e->Open File,浏览到刚刚转换而得到的.hprof文件,并Cancel掉自动生成报告,点击Dominator Tree,并按Package分组,选择自己所定义的Package 类点右键,在弹出菜单中选择List objects->With incoming references。 这时会列出所有可疑类,右键点击某一项,并选择Path to GC Roots->exclude weak/soft references,会进一步筛选出跟程序相关的所有有内存泄露的类。据此,能够追踪到代码中的某一个产生泄露的类。 6、 JNI和NDK的区别 android常见的开发方式是j
17、ava封装的库,而这些库的底层实现是由C/C++实现,如媒体,图形库等 java调用这样实现就需要用JNI(Java Native Interface) 平时用的也就是google给我们封装的好的库,即便是底层实现用的不是Java,但都有统一的Java接口 而NDK的作用是“我们自己写本地代码”(C/C++),自己用JNI封装成Java接口 比如我们想做个计算,二这不是Java的强项,能够用C/C++来写实现,返回一个运算结果就行了 NDKr5已经实现了不用写一行Java代码开发程序了,只不过还是用到了虚拟机,细节被封装隐藏起来了而已 JNI是Java调用Native机制,是Jav
18、a语言自己的特性全称为 Java Native Interface,类似的还有微软.Net Framework上的p/invoke,能够让C#或Visual Basic.Net能够调用C/C++的API,因此说JNI和Android没有关系,在PC上开发Java的应用,如果运行在Windows平台使用 JNI是是经常的,比如说读写Windows的注册表。 NDK是Google公司推出的帮助Android开发者经过C/C++本地语言编写应用的开发包,包含了C/C++的头文件、库文件、说明文档和示例 代码,我们能够理解为Windows Platform SDK一样,是纯C/C++编写的,可是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的 问题。






