欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 面试精华题目总结

程序员文章站 2024-03-05 22:56:13
下面的题目都是楼主在android交流群大家面试时遇到的,如果大家有好的题目或者好的见解欢迎分享,楼主将长期维护此帖。 某公司高级面试题(2015-03-14)【感谢he...

下面的题目都是楼主在android交流群大家面试时遇到的,如果大家有好的题目或者好的见解欢迎分享,楼主将长期维护此帖。

某公司高级面试题(2015-03-14)【感谢helder分享】
1、详述android系统架构,包括层与层之间调用、binder、jni、底层文件读写方法
2、描述自己的一个项目,要求画出结构图,uml图,详细描述项目种的技术点,技术难点以及解决方案
3、一道算法
4、谈谈自己项目管理的方法、对敏捷软件开发的理解

基础面试题(2014-04-18)

1、请解释下在单线程模型中message,handler,message queue,looper之间的关系。

拿主线程来说,主线程启动时会调用looper.prepare()方法,会初始化一个looper,放入threadlocal中,接着调用looper.loop()不断遍历message queue,
handler的创建依赖与当前线程中的looper,如果当前线程没有looper则必须调用looper.prepare()。handler , sendmessage到messagequeue,looper不断
从messagequeue中取出消息,回调handlemessage方法。

2、如果有个100m大的文件,需要上传至服务器中,而服务器form表单最大只能上传2m,可以用什么方法。

这个问题不是很明确我觉得,首先来说使用http协议上传数据,特别在android下,跟form没什么关系。传统的在web中,在form中写文件上传,其实浏览器所做
的就是将我们的数据进行解析组拼成字符串,以流的方式发送到服务器,且上传文件用的都是post方式,post方式对大小没什么限制。
回到题目,可以说假设每次真的只能上传2m,那么可能我们只能把文件截断,然后分别上传了。

3、内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法?

内存溢出通俗理解就是软件(应用)运行需要的内存,超出了它可用的最大内存。
内存泄漏就是我们对某一内存空间的使用,使用完成后没有释放。
内存优化:android中容易内存溢出的部分,就是图片的加载,我们可以使用图片的压缩加上使用lrucache缓存的目的来控制图片所能够使用的内存。
还有对于比较耗资源的对象及时的关闭,例如database conn , 各种传感器 , service 等等。

4、asynctask使用在哪些场景?它的缺陷是什么?如何解决?

asynctask 运用的场景就是我们需要进行一些耗时的操作,耗时操作完成后更新主线程,或者在操作过程中对主线程的ui进行更新。
缺陷:asynctask中维护着一个长度为128的线程池,同时可以执行5个工作线程,还有一个缓冲队列,当线程池中已有128个线程,缓冲队列已满时,如果
此时向线程提交任务,将会抛出rejectedexecutionexception。
解决:由一个控制线程来处理asynctask的调用判断线程池是否满了,如果满了则线程睡眠否则请求asynctask继续处理。

5、activity用sharedpreferences保存数据,大小有木有限制?

这个真心查不到。。。

6、activity间通过intent传递数据大小有没有限制?

貌似是40k。

7、assest文件夹里放文件,对于文件的大小有没有限制?

assets目录更像一个附录类型的目录,android不会为这个目录中的文件生成id并保存在r类当中,因此它与android中的一些类和方法兼容度更低。
同时,由于你需要一个字符串路径来获取这个目录下的文件描述符,访问的速度会更慢。但是把一些文件放在这个目录下会使一些操作更加方便,
比方说拷贝一个数据库文件到系统内存中。要注意的是,你无法在android xml文件中引用到assets目录下的文件,只能通过assetmanager来访问
这些文件。数据库文件和游戏数据等放在这个目录下是比较合适的。另外,网上关于assets和raw的资料都千篇一律了,因此关于这两者中单个文件
大小不能超过1m的**错误**描述也在传播,即如果读取超过1m的文件会报"data exceeds uncompress_data_max (1314625 vs 1048576)"的
ioexception,还引申出种种解决方案。个人认为不应该有这样的限制,为了验证这个说法写了个demo,发现将近5m的压缩包在assets和raw中
都能正常访问,因此在这里纠正一下,理论上只要打包不超过android apk 50m大小的限制都是没有问题的。当然了,不排除是android很早期的
时候因为设备硬件原因aapt在编译的时候对这两个文件夹大小做出了限制,如果是这样,较新版的adt应该不会出现这种情况。
来自:http://my.eoe.cn/futurexiong/archive/5350.html

8、 启动一个程序,可以主界面点击图标进入,也可以从一个程序中跳转过去,二者有什么区别?

是因为启动程序(主界面也是一个app),发现了在这个程序中存在一个设置为<category android:name="android.intent.category.launcher" />的activity,
所以这个launcher会把icon提出来,放在主界面上。当用户点击icon的时候,发出一个intent:
intent intent = mactivity.getpackagemanager().getlaunchintentforpackage(packagename);
mactivity.startactivity(intent);  
跳过去可以跳到任意允许的页面,如一个程序可以下载,那么真正下载的页面可能不是首页(也有可能是首页),这时还是构造一个intent,startactivity.
这个intent中的action可能有多种view,download都有可能。系统会根据第三方程序向系统注册的功能,为你的intent选择可以打开的程序或者页面。所以唯一的一点
不同的是从icon的点击启动的intent的action是相对单一的,从程序中跳转或者启动可能样式更多一些。本质是相同的。

9、程序之间的亲和性的理解。

1、默认情况下一个应用的所有activity都是具有相同的affinity,都是从application中继承,application的affinity默认就是manifest的包名。
2、affinity对activity来说,就像是身份证一样,可以告诉所在的task,自己属于其中的一员。
3、应用场合:
a:根据affinity重新为activity选择合适的宿主task;
b:与allowtaskreparenting属性配合;
c:启动activity使用intent设置了flag_activity_new_task标记。

10、同一个程序,但不同的activity是否可以放在不同的task任务栈中?

可以放在不同的task中。需要为不同的activity设置不同的affinity属性,启动activity的intent需要包含flag_activity_new_task标记。

11、横竖屏切换时候activity的生命周期。

1、不设置activity的android:configchanges时,切屏会重新调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次
2、设置activity的android:configchanges="orientation"时,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
3、设置activity的android:configchanges="orientation|keyboardhidden"时,切屏不会重新调用各个生命周期,只会执行onconfigurationchanged方法

12、aidl的全称是什么?如何工作?

全称是:android interface define language
在android中, 每个应用程序都可以有自己的进程. 在写ui应用的时候, 经常要用到service. 在不同的进程中, 怎样传递对象呢? 显然, java中不允许跨进程内存共享.
 因此传递对象, 只能把对象拆分成操作系统能理解的简单形式, 以达到跨界对象访问的目的. 在j2ee中,采用rmi的方式, 可以通过序列化传递对象. 在android中, 则
采用aidl的方式. 理论上aidl可以传递bundle,实际上做起来却比较麻烦。
aidl(android接口描述语言)是一种借口描述语言; 编译器可以通过aidl文件生成一段代码,通过预先定义的接口达到两个进程内部通信进程的目的. 如果需要
在一个activity中, 访问另一个service中的某个对象, 需要先将对象转化成aidl可识别的参数(可能是多个参数), 然后使用aidl来传递这些参数, 在消息的接收端, 使用
这些参数组装成自己需要的对象.aidl的ipc的机制和com或corba类似, 是基于接口的,但它是轻量级的。它使用代理类在客户端和实现层间传递值. 如果要使用aidl,
需要完成2件事情: 1. 引入aidl的相关类.; 2. 调用aidl产生的class.
aidl的创建方法:
aidl语法很简单,可以用来声明一个带一个或多个方法的接口,也可以传递参数和返回值。 由于远程调用的需要, 这些参数和返回值并不是任何类型.
下面是些aidl支持的数据类型:
1. 不需要import声明的简单java编程语言类型(int,boolean等)
2. string, charsequence不需要特殊声明
3. list, map和parcelables类型, 这些类型内所包含的数据成员也只能是简单数据类型, string等其他比支持的类型.
(另外: 我没尝试parcelables, 在eclipse+adt下编译不过, 或许以后会有所支持

13、dvm的进程和linux的进程, 应用程序的进程是否为同一个概念

     dvm的进程是dalivk虚拟机进程,每个android程序都运行在自己的进程里面,每个android程序系统都会给他分配一个单独的liunx uid(user id),
每个dvm都是linux里面的一个进程.所以说这两个进程是一个进程.

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/24015867