Android开发常见的面试题

安卓知识Git云周报:http://gityuan.com/

1、图片的三级缓存

http://blog.csdn.net/wuyinlei/article/details/50606455

android listview 异步加载图片并防止错位

Android ListView 图片异步加载和图片内存缓存

Android——listview加载网络图片错位解决方法

Android实现Listview异步加载网络图片并动态更新的方法

2、dagger2的使用

https://www.baidu.com/s?ie=UTF-8&wd=dagger2

3、glide的使用

http://blog.csdn.net/abc6368765/article/details/76652766

4、了解handler、Asynctask、handlerThread等工作原理。

http://blog.csdn.net/abc6368765/article/details/76253007
Android 消息处理机制(Looper、Handler、MessageQueue,Message)

5、并发编程

http://blog.csdn.net/abc6368765/article/details/76796593
http://blog.csdn.net/abc6368765/article/details/76796607

6、RXJava操作符和原理

http://www.jianshu.com/p/5ad08d85331f
https://www.baidu.com/s?ie=UTF-8&wd=RXJAVA%E6%93%8D%E4%BD%9C%E7%AC%A6

7、ButterKnife的原理

http://www.jianshu.com/p/593e43fcbec9
http://www.jianshu.com/p/2ca6d51cd967

8、retrofit的使用

9、虚拟机加载一个类的顺序

http://blog.csdn.net/abc6368765/article/details/76795357
http://blog.csdn.net/u013256816/article/details/50829596
http://blog.csdn.net/ustczyy/article/details/13021919

10、static,final属性的使用

http://blog.csdn.net/abc6368765/article/details/76795357
http://blog.csdn.net/abc6368765/article/details/76090916

11、fragment的优点(待解决)

http://www.jianshu.com/p/8c2b5f3cc1bb

12、java的引用

http://blog.csdn.net/abc6368765/article/details/76796034

13、git的使用

http://blog.jobbole.com/78960/

14、handelr的threadlocal里面都放了什么

http://blog.csdn.net/cjyusha/article/details/50946016

15、数据库的使用

LitePal的使用:http://blog.csdn.net/guolin_blog/article/details/38556989
DBFlow的使用:http://blog.csdn.net/abc6368765/article/details/70622329

16、进程保活

framework层保活
1、将Service设置为前台进程
2、在service的onstart方法里返回 STATR_STICK
3、添加Manifest文件属性值为android:persistent=“true”
4、重写Service的onDestroy方法
5、添加广播监听android.intent.action.USER_PRESENT事件以及其他一些可以允许的事件
6、服务互相绑定
7、设置闹钟,定时唤醒
8、账户同步,定时唤醒

native层保活

17、IPC的通讯机制:

https://www.zhihu.com/question/39440766#answer-31119460
http://blog.csdn.net/luoshengyang/article/details/6618363/
Binder的介绍和使用

Binder本质上只是一种底层通信方式,和具体服务没有关系。为了提供具体服务,Server必须提供一套接口函数以便Client通过远程访问使用各种服务。这时通常采用Proxy设计模式:将接口函数定义在一个抽象类中,Server和Client都会以该抽象类为基类实现所有接口函数,所不同的是Server端是真正的功能实现,而Client端是对这些函数远程调用请求的包装。
http://blog.csdn.net/zhaokaiqiang1992/article/details/49428287

18、常用的加密算法:

对称加密
对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。
DES,3DES,AES,IDEA,TDEA,RC5。

非对称加密
非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
RSA、Elgamal、背包算法、Rabin、HD,ECC(椭圆曲线加密算法)。

hash哈希算法
Hash算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用在不可还原的密码存储、信息完整性校验等。
MD2、MD4、MD5 和 SHA-1

19、Activity创建过程

http://blog.csdn.net/zhaokaiqiang1992/article/details/49428287

所有Activity的启动都是由ActivityManagerService(简称Ams)通过Bindler进程间通信机制向客户端进程ActivityThread发送创建新的Activity对象通知,所有Activity的创建都在对应应用程序进程ActivityThread类中完成。Activity类的创建完成之后会调用Activity#attach方法

Android开发常见的面试题_第1张图片
Paste_Image.png

20、rsa加密过程

l 加密过程:
A提取消息的消息摘要,并使用自己的私钥对摘要进行加密,生成签名
A将签名和消息一起,使用B的公钥进行加密,生成密文,发送给B。

l 解密过程:
B接收到密文,使用自己的私钥解密得到明文和数字签名
B使用A的公钥解密数字签名解密得到消息摘要.
B使用两边约定好的相同方法提取消息的消息摘要
B比较两个消息摘要。相同则验证成功;不同则验证失败。

RSA的加密算法
KeyGen(密钥生成算法),Encrypt(加密算法)以及Decrypt(解密算法)
公钥用于对数据进行加密,私钥用于对数据进行解密

RSA签名体制
KeyGen(密钥生成算法),Sign(签名算法),Verify(验证算法)
私钥用于对数据进行签名,公钥用于对签名进行验证

21、Retrofit的使用

动态代理
首先构造retrofit,几个核心的参数呢,主要就是baseurl,callFactory(默认okhttpclient),converterFactories,adapterFactories,excallbackExecutor。
然后通过create方法拿到接口的实现类,这里利用Java的Proxy类完成动态代理的相关代理
在invoke方法内部,拿到我们所声明的注解以及实参等,构造ServiceMethod,ServiceMethod中解析了大量的信息,最终可以通过toRequest构造出okhttp3.Request对象。有了okhttp3.Request对象就可以很自然的构建出okhttp3.call,最后calladapter对Call进行装饰返回。
拿到Call就可以执行enqueue或者execute方法了

外观模式(门面模式)
Retrofit给我们暴露的方法和类不多。核心类就是Retrofit,我们只管配置Retrofit,然后做请求。剩下的事情就跟上层无关了,只需要等待回调。这样大大降低了系统的耦合度。对于这种写法,我们叫外观模式(门面模式)。
几乎所有优秀的开源library都有一个门面。比如Glide.with() ImageLoader.load() Alamofire.request()。有个门面方便记忆,学习成本低,利于推广品牌。 Retrofit的门面就是retrofit.create()
当我们自己写的代码的时候尽量也要这样来做。
比如我们有一个独立并公用的模块,需要供其他模块来调用。比如download,location,socialshare等
最好我们写一个module,将所有相关的代码都放在这个module中。这是第一步。
第二步,为你的module提供一个漂亮的门面。比如下载的DownloadManager, 经纬度的LocationTracker, 社交分享的SocialManager。它们做为功能模块的入口,要尽量的简洁,方法命名好记易理解,类上要有完整的示例注释
第三步,闭门造车。不管你在里面干什么,外面都是不知道的,就像薛定谔的那只猫,外层不调用它,永远不知道它是否好用。
不过为了以后好维护,不给他人留坑,还是尽量写的工整一些。

动态代理
Retrofit里的动态代理比较巧妙。实际上它根本就没有delegate。因为这个方法没有真正的实现。使用动态代理,只是单纯的为了拿到这个method上所有的注解。所有的工作都是由proxy做了。

适配器模式
将OkHttpCall转换成rxjava(Scheduler)的写法。再后来又支持了java8(CompletableFuture)甚至居然还有iOS支持。大概就是这样一个套路。当然我相信square的大神肯定一开始就考虑了这种情况,从而设计了CallAdapter。
适配器模式就是,已经存在的OkHttpCall,要被不同的标准,平台来调用。设计了一个接口CallAdapter,让其他平台都是做不同的实现来转换,这样不花很大的代价就能再兼容一个平台。

22、AsyncTask

http://www.jianshu.com/p/3b839d7a3fcf

23、AMS、PMS、WMS

http://blog.csdn.net/shareus/article/details/51145601

24、Android从启动到程序运行发生的事情

初始化init进程->初始化zygote进程->初始化SystemService->初始化ActivityThread,系统设备上下文开启mActivityManagerService ,mPowerManagerService ,mActivityManagerService,mDisplayManagerService ,mPackageManagerService
->初始化Launcher_Activity->接着Launcher_Activity调用Launcher.startActivity()方法,内部调用Instrumentation.execStartActivity(),内部调用ActivityManagerNative.getDefault()
.startActivity

http://blog.csdn.net/zhaokaiqiang1992/article/details/49428287
http://blog.csdn.net/jonstank2013/article/details/51118563

25、HTTP长连接和短连接原理浅析

HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。
HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。

在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。
但从 HTTP/1.1起,默认使用长连接,用以保持连接特性。
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。
HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。

TCP连接
当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的

26、Android 事件分发机制

图解 Android 事件分发机制

27、Android过渡绘制

Android避免过度绘制

什么是过渡绘制,如何防止过渡绘制

28、View的绘制流程

Android View的绘制流程

29、分析为什么有时在非UI线程更新UI会崩溃

http://www.jianshu.com/p/5916ae4eb21b

30、HashMap和HashSet

HashSet、HashMap,散列表数据结构(哈希表)

HashMap原理及实现学习总结

【数据结构】HashMap原理及实现学习总结

31、排序算法

http://blog.csdn.net/jianyuerensheng/article/category/6203559

面试经历:
http://www.jianshu.com/p/cf5092fa2694
http://note.youdao.com/share/?id=0fe41c74e9355eb8c6349343bdb10368&type=note#/
http://blog.csdn.net/jianyuerensheng/article/category/6197111

你可能感兴趣的:(Android开发常见的面试题)