Android笔试题总结
1、Android系统中包含一些C/C++库,这些库能被Android系统中的不同的组件使用。
它们通过Android应用程序框架为开发者提供服务。请写出你所了解的一些核心库。
答:
(1)libc
libc是一个从BSD继承来的标准C系统函数库
(2)Surface Manager
对显示子系统的管理,并且为多个应用程序提供2D和3D图层的无缝结合
(3)SQlite
一个对于所有应用程序可用,功能强劲的轻型关系型数据库引擎
(4)OpenGL|ES
3D图形引擎
(5)FreeType
位图和矢量字体显示
(6)WebKit
WebKit引擎用于对网页浏览和操作进行编程
(7)SGL
2D图形引擎
(8)SSL
2、请简述Android Kernel移植过程
http://blog.csdn.net/andyhuabing/article/details/6593275
3、Android的传感器系统从驱动程序层次到上层都有所涉及,传感器系统的自下而上
涉及到的各个层次有哪些?
4、一条最长的短信约占多少byte?
一般来说Android手机的短信最多可以有70个字,一个字占两个byte所以答案是140
5、如何对Android应用进行性能分析
http://www.360doc.com/content/15/0407/22/7044580_461396514.shtml
http://www.cnblogs.com/ldq2016/p/5630435.html
6、什么情况下会导致内存泄漏
(1)集合类造成的内存泄漏
(2)单例模式造成的内存泄漏
(3)匿名内部类造成的内存泄漏
(4)Handler造成的内存泄漏
(5)一些不良代码习惯造成的内粗泄漏
7、如何避免OOM异常
http://blog.csdn.net/u010375364/article/details/51932688
8、Android中如何捕获未捕获的异常
在自定义的Application的onCreate方法中设置UncaughtExceptionHandler,并且重写uncaughtException方法。如下:
@Override
public void onCreate() {
super.onCreate();
Thread.setDefaultUncaughtExceptionHandler(this);
}
@Override
public void uncaughtException(final Thread thread, final Throwable ex) {
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
System.out.println(Thread.currentThread());
Toast.makeText(getApplicationContext(), "thread="+thread.getId()+"ex="+ex.toString(), 1).show();
Looper.loop();
}
}).start();
SystemClock.sleep(3000);
android.os.Process.killProcess(android.os.Process.myPid());
}
9、ANR是什么?怎么样避免和解决ANR?
ANR全称Application Not Responding,意思是应用程序无响应。
造成ANR的三种情况:
(1)KeyDispatchTimeout,即按键或触摸事件在特定时间内无响应,这是主要的情况超时时间为5s
(2)BroadcastTimeout,即BroadcastReceiver在特定时间内无法处理完成,超时时间10s
(3)ServiceTimeout,即Service在特定时间内无法处理完成,超时时间20s
如何避免以上情况呢?
(1)、主线程中,程序应该尽量少进行程序执行,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等)
(2)、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不要在子线程里去做这些事情(因为 BroadcastReceiver的生命周期短)。而应该让应用程序应该启动一个 Service。
(3)、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。
10、Android线程间的通讯有哪几种方式
(1)共享内存
(2)管道
(3)handler机制
11、Devik进程和Linux进程、线程的区别
(1)线程与进程的区别
进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
- 简而言之,一个程序至少有一个进程,一个进程至少有一个线程.
- 线程的划分尺度小于进程,使得多线程程序的并发性高。
- 另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。
- 线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。
- 从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但操作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。
(2)Devik进程和Linux进程的区别
12、请描述一下Android的系统架构
http://blog.csdn.net/howlaa/article/details/46786163
13、Android应用对内存是如何限制的?我们应该如何合理的使用内存?
Android应用的开发语言是Java,每个应用的最大的可使用对内存受到Android系统的限制,通常情况为16M~48M。可以通过ActivityManager 的 getMemoryClass()来查询可用堆内存限制 ,方法如下:
mActivityManager=(ActivityManager)this.getSystemService(Context.ACTIVITY_SERVICE);
mMaxMemory=mActivityManager.getMemoryClass();
那么如何合理的使用内存呢?我总结了一下几点
1)注意不使用的资源一定要关闭,比如说数据库、输入输出流等。
2)合理使用静态变量,因为静态变量额优先级很高,系统会最后再去回收
3)加载图片的时候注意缩放图片,例如一个ImageView的大小是100dp,而加载的图片的分辨率是1000*1000的,那么这么大的图片加载下来很明显是一种对于内存的浪费。
4)尽量避免使用帧动画
5)注册的资源监听器及时解绑
14、简述Android应用程序的结构是哪些?
http://blog.csdn.net/xiaopihair123/article/details/53149184
15、请解释下Android程序运行时权限和文件系统权限的区别?
http://blog.sina.com.cn/s/blog_624012330100ynit.html
16、Framework工作方式及原理,Activity的如何生成一个view的,机制是什么?
(1)Framework工作方式以及原理
(2)View的绘制机制
17、多线程间通讯和多进程间通讯有什么不同,分别注明实现?
18、屏幕适配方式都有哪些?屏幕适配的处理技巧有哪些?
19、dp和px之间的关系
px指的是一个物理像素点在Android是不建议使用px为单位的,因为在一张100px的图片在不同的设备上面显示的大小往往不同。dp指的是像素密度,这是一个比较难理解的单位。假设有一部手机,屏幕的物理尺寸为1.5英寸x2英寸,屏幕分辨率为240x320,则我们可以计算出在这部手机的屏幕上,每英寸包含的像素点的数量为240/1.5=160dpi(横向)或320/2=160dpi(纵向),160dpi就是这部手机的像素密度,像素密度的单位dpi是Dots Per Inch的缩写,即每英寸像素数量。在Android中定义了四种像素密度:低(120dpi)、中(160dpi)、高(240dpi)和超高(320dpi),它们对应的dp到px的系数分别为0.75、1、1.5和2,这个系数乘以dp长度就是像素数。
20、什么是AIDL,以及如何使用?
(1)AIDL是Android内部的一种进程间的通讯语言;
(2)AIDL的用法大致分为以下几个过程:
a、使数据类实现 Parcelable 接口,但是如果传输的数据是默认支持的数据则这步不需要
b、编写AIDL文件
c、移植AIDL文件
d、编写服务器端的代码
e、编写客户端的代码
f、最后实现通讯
21、AIDL的全称是什么?如何工作?能处理哪些数据类型?
(1)AIDL的全称是Android Interface Definition Language;
(2)AIDL是如何工作的?
(3)AIDL能处理的数据类型有:
Java中的八种基本数据类型,包括 byte,short,int,long,float,double,boolean,char。
String 类型。
CharSequence类型。
List类型:List中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。List可以使用泛型。
Map类型:Map中的所有元素必须是AIDL支持的类型之一,或者是一个其他AIDL生成的接口,或者是定义的parcelable。Map是不支持泛型的。
22、描述Handler机制
Handler Message Looper
23、子线程发消息到主线程进行更新ui,除了hanlder和AsyncTask,还有什么?
24、子线程中能不能new handler?为什么?
25、Android中的动画有哪几种?它们的特点和区别是什么?
(1) 属性动画
属性动画的原理是,通过改变View的属性实现的动画,这要求该View要有对应属性的getter、setter方法,否则动画将失效。另外由于是View的属性发生了变化,所有这是一种更本的变化。
(2)View动画
View动画可以实现平移、放大缩小、透明度、翻转这四种动画效果,其动画实现没有对属性产生本质上的变化
(3)帧动画
帧动画是有很多张图片组成,一张一张连续播放所形成的动画。这个过程和放电影的原理是一样的
26、如何修改Activityed进入和退出动画
在finish方法后面调用overridePendingTransition方法
27、属性动画。例如一个button从A移动到B点,B点还是可以响应事件,这个原理是什么?
属性动画,改变的是View在父View中的位置,而不是简单的显示的位置进行改变。因此响应事件的位置也发生了改变
28、描述ContentObserver内容观察者的作用以及特点?
29、XML和JSON之间的优缺点
(1)可读性:Json和XML的可读性差不多
(2)编码难度:XML的编码难度要略微大于JSON
(3)解码难度:XML的解码难度要大于JSON
(4)数据体积:JSON的数据体积要小于XML,因此JSON的传输更快
(5)解析手段:XML和JSON的解析手段都很丰富,所有这点两者差不多
(6)数据描述:JSON的数据描述要差一些
(7)可扩展性:JSON和XML的扩展性差不多