针对自己的简历设计面试题目:
第一天完成的内容
第一题:谈谈你对Android消息机制的理解(搞定)
答:Android的消息处理机制核心的类有:Looper,Handler和Message。其中Looper类内部维护一个Message Queue [kju](消息队列)。
1)handler通过sendMessage方法往MQ上添加消息以及通过handleMessage方法处理消息,整个过程是异步的。
handler在创建时会关联当前线程的looper,其默认的构造函数中直接调用了Looper的myLooper()函数得到一个looper对象,紧接着将looper对象中的MQ实例作为自己的MQ。handler发送消息的时候message对象的target属性会被赋值为this,然后调用MQ的enqueueMessage方法将Message对象添加到MQ上。
2)Looper类的loop()方法调用后,开始不断从队列中取出消息,然后通过消息的target来调用dispatchMessage来分发消息。
3)Handle类中dispatchMessage函数则判断该Message对象是否有callback,有则调用callback的handleMessage方法处理消息,否则调用handle的handleMessage函数来处理。
第六题:Android适配需要关注哪些地方(如何进行适配)(搞定)
答:进行适配的话,一般需要针对兼容多种屏幕尺寸以及支持各种屏幕密度来做适配。
要实现兼容多种屏幕尺寸我们可以通过:
1、使用wrap_content、match_parent、weight等属性来写布局,尽量避免写死控件大小。
2、同时我们使用相对布局,禁用绝对布局
3、使用限定符,比如:1)使用尺寸限定符,就是在资源文件中写一套layout文件,一套layout-large文件 2)使用最小宽度限定符 ,就是在资源文件中多写一套layout-sw600dp的文件 3)使用布局别名 来减少重复出现的布局文件,也就是在资源文件的value文件夹中新增values-large以及values-sw600dp.
4、还有就是使用自动拉伸位图(.9图) 这些步骤就差不多能够实现兼容多种屏幕。
要支持多种屏幕密度的话:
1)使用非密度制约像素,字体使用sp、长度使用dp。同时应该编写多套dimens文件
2)提供备用位图:针对中等密度、高密度、超高密度等提供不同的图片
第十题:Fragment的使用(add和replace的区别、如何管理Fragment回退栈”或者“FragmentTransaction中remove和detach的区别”、或者Fragment与Activity的通信,Fragment与Fragment的通信,Activity与Fragment的通信)----(搞定)
add和replace的区别
答:transaction的add方法是直接将一个Fragment添加到容器中,replace的话实际上可以看成分解为:add一个新的Fragment,show出来,然后hide掉之前的,在remove掉之前的。
如何管理Fragment回退栈
答:我们可以通过使用addToBackStack()\fragmentManager.popBackStack()\fragmentManager.getBackStackEntryCount()等方法来管理回退栈。
FragmentTransaction中remove和detach的区别
答:remove是将一个Fragment移除队列(如果被移除的Fragment没有添加到回退栈)、
detach是会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护
Fragment与Activity的通信,Activity与Fragment的通信,Fragment与Fragment的通信,
答:Fragment直接使用getActivity即可获取Activity对象;
Activity可以通过接口的实现与Fragment的通信;
Fragment与Fragment可以通过getFragmentManager在通过findFragmentById获取到Fragment对象;
第二天完成的内容
第四题:谈谈Android进程间通信机制(搞定)
答:Android中主要的跨进程间通信是通过Binder来实现的,Binder连接着客户端、服务端、Service Manger三个进程。
进程空间被分为用户空间与内核空间。不同进程之间用户空间是不共享的,而内核空间是可以共享的。同一个进程中,用户空间可以通过系统调度的方式与内核空间进行通信。而Binder,就是充当连接两个进程(内核空间)的通道。
Binder的通信机制是:
注册服务:服务端进程通过向Binder驱动发起服务注册请求-------->Binder驱动将注册请求转发给Service Manager--------->Service Manager 添加该服务端进程。
获取服务:客户端向Binder驱动发起获取服务请求,传递需要获取的服务名称-------Binder驱动将获取服务请求转发给Service Manager-----------Service Manager找到客户端需要的服务信息---------通过Binder驱动返回给客户端进程。
使用服务:
1)客户端发起调用服务端方法
客户端将需要传递的数据放入客户端共享内存(当前线程被挂起)------Binder驱动读取客户端共享数据,并根据Service Manager找到服务端对应的进程----------Binder驱动将读取出来的数据拷贝一份到服务端共享内存,并通知服务端进程执行解包操作。
2)服务端根据客户端要求调用目标方法
收到Binder驱动通知后,服务端进程从线程池中取出线程并进行数据解包以及调用目标函数------------>将方法结果写入共享内存
3)服务端将目标方法结果返回给客户端进程
Binder驱动将服务端共享内存中的结果拷贝到客户端内存------------>通知客户端获取结果(这时候客户端进程之前挂起的线程重新被唤醒)
Android中进程之间的通信主要是通过Binder机制来实现的。Binder机制主要是通过Binder驱动来充当客户端、服务端、Service Manager之间通信的桥梁。服务端如果希望对外提供服务,首先需要通过使用系统调度的方式,在自己的进程内部的用户内存向内核内存发起注册服务的请求,内核内存中的Binder驱动将该请求转发给Service Manager进程,Service Manager进程将该服务注册。客户端如果需要使用该服务,首先需要通过Binder驱动发起获取到该服务,Binder驱动将该请求转给Service Manager ,Service Manager找到对应的服务信息并通过Binder驱动将服务的代理对象返回给客户端。客户端接着开始发起调用服务端方法,首先先将需要传递给服务端的数据拷贝到进程共享内存(当前线程被挂起),Binder驱动将数据拷贝一份到服务端的共享内存并通知服务端进程进行解包数据。收到Binder通知后,服务器端进程从线程池中取出线程进行数据解包以及调用目标函数,将返回结果写入共享内存。随后Binder驱动将结果拷贝一份到客户端的共享内存,通知客户端获取结果
第七题:说一下MVP模式(明天)
谈谈你对MVC与MVP模式的认识
答:
MVC的概念:
MVC一种常见的客户端软件开发框架。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层,采用MVC模式的好处是便于UI界面部分的显示和业务逻辑,数据处理分开。
视图层(View)一般采用XML文件进行界面的描述,这些XML可以理解为AndroidApp的View。
控制层(Controller)通常落在了众多的Activity的肩上。通过Activity交割Model业务逻辑层处理。
模型层(Model)是我们针对业务模型,建立的数据结构和相关的类,Model是与View无关,而与业务相关的。对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。
MVC的优缺点:
优点:
(1)耦合性低。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,减少模块代码之间的相互影响。
(2)可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。
(3)模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。
缺点:
(1)Activity并不是一个标准的MVC模式中的Controller,它的首要职责是加载应用的布局和初始化用户界面,并接受并处理来自用户的操作请求,进而作出响应。随着界面及其逻辑的复杂度不断提升,以致变得庞大臃肿。
(2)MVC还有一个重要的缺陷,view层和model层是相互可知的,这意味着两层之间存在耦合,耦合对于一个大型程序来说是非常致命的,因为这表示开发,测试,维护都需要花大量的精力。
MVP的概念
MVP从MVC框架演变过来,与MVC有一定的相似性:Controller/Presenter负责逻辑的处理,Model提供数据,View负责显示。
它与MVC的主要区别:
(1)View与Model并不直接交互(最主要区别),而是通过与Presenter交互来与Model间接交互。而在MVC中View可以与Model直接交互
(2)通常View与Presenter是一对一的,但复杂的View可能绑定多个Presenter来处理逻辑。而Controller是基于行为的,并且可以被多个View共享,Controller可以负责决定显示哪个View。
(3)Presenter与View的交互是通过接口来进行的,更有利于添加单元测试。
MVP的优点:
(1)模型与视图完全分离,我们可以修改视图而不影响模型,降低了耦合;
(2)可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部;
(3)我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;
(4)Presenter 被抽象成接口,可以有多种具体的实现,所以方便进行单元测试;
(5)把业务逻辑抽到 Presenter 中去,避免后台线程引用着 Activity 导致 Activity 的资源无法被系统回收从而引起内存泄露和 OOM;
谈谈MVP模式中单元测试
答:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0425/4178.html
第八题:会使用Git吗?Gitfork原理(明天)
Git常用命令
答:http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html
Git 工作流
答:https://coding.net/help/doc/practice/git-workflow.html#_Centralized_Workflow
1、集中式工作流
团队人数少
开发不是很频繁
团队沟通方便
不需同时维护多个版本
2、Git-flow工作流
3、Fork Workflow
4、分支工作流
功能分支工作流仍然用中央仓库,并且master
分支还是代表了正式项目的历史。但不是直接提交本地历史到各自的本地master
分支,开发者每次在开始新功能前先创建一个新分支
第五题:如何进行UI优化以及内存优化
答:一般在使用App时会发现有些界面启动卡顿、动画不流畅、列表等滑动时也会卡顿出现这种情况,可以考虑对UI性能分析。
使用Hierarchy Viewer分析UI性能。
使用Lint进行资源及冗余UI布局等优化
使用Memory监测及GC打印与Allocation Tracker进行UI卡顿分析
如何优化:
1、避免嵌套过多层级的布局
2、使用标签来优化:merge标签、include标签、ViewStub标签
3、使用ViewHolder技术来优化ListView
4、为不同尺寸、像素密度的设备提供对应分别率的图片资源
5、去掉没必要的背景
如何检测内存泄露,如何进行内存优化?(如何避免OOM异常?)?
答:通过内存监测工具 DDMS -->Heap检测内存。通过MAT对内存进行分析。还可以集成LeakCanary来检测内存泄漏。
造成内存泄漏的原因有哪些:
1)静态变量持有对象
2)单例模式持有Activity对象,单例模式的特点是生命周期跟Application的保持一致
3)属性动画播放没有在onDestroy函数中停止动画,造成Activity中的View被动画持有
4)Handle持有Activity即内部类持有外部类
5) 监听器没有取消
6)WebView的泄漏
7)Cursor对象是否及时关闭
如何避免OOM:
1、减小对象的内存占用
2、内存对象的重复利用
3、避免对象的内存泄露
4、内存使用策略优化:优化布局层次,减少内存消耗;资源文件需要选择合适的文件夹进行存放;
第十四题:WebView与JS交互
webview如何跟JS进行交互?
答:Java调用JS可以通过LoadURL函数;JS调用Java可以通过添加JS回调接口
https://zhuanlan.zhihu.com/p/27588089
|
|
第一题:谈谈你对Android消息机制的理解(搞定)
第二题:关于OKHttp的使用(明天)
第三题:关于Glide提问(缓存的原理)
http://www.10tiao.com/html/227/201705/2650239697/1.html
第四题:谈谈Android进程间通信机制(搞定)
第五题:如何进行UI优化以及内存优化(搞定)
第六题:Android适配需要关注哪些地方(搞定)
第七题:说一下MVP模式(搞定)
第八题:会使用Git吗?Git工作流原理(搞定)
https://www.jianshu.com/p/e1e9692f3d88
第九题:你是如何处理用户统计行为的以及进行bug追踪(集成友盟等第三方sdk来进行统计,集成bugly等sdk来进行bug追踪)
第十题:Fragment的使用(add和replace的区别、如何管理Fragment回退栈”或者“FragmentTransaction中remove和detach的区别”) (搞定)
第十一题:如何实现多图上传
第十二题:你是如何搭建一个项目框架的,使用哪些库?
第十三题:说说自动化构建,批量打包(明天)
第十四题:WebView与JS交互(搞定)
分析:
关于OKHttp的使用
1、如何使用OkHttp进行异步网络请求,并根据请求结果刷新UI
使用enqueue函数进行异步请求。
2、可否介绍一下OkHttp的整个异步请求流程
3、OkHttp对于网络请求都有哪些优化,如何实现的
使用连接池技术减少请求的延迟
使用GZIP压缩减少传输的数据量,缓存响应避免重复的网络请求、拦截器
4、OkHttp框架中都用到了哪些设计模式
5、OkHttp和Volley的有什么区别?
答:1、从占用储存空间上OkHttp相对于Volley稍微多出一两百k
2、从功能上
OkHttp 特点:
1)提供了对 HTTP/2 和 SPDY 的支持,并提供了连接池,GZIP 压缩和 HTTP 响应缓存功能。
2)使用的是HttpURLConnection,支持http以及https请求。
3)不可以直接在主线程中处理callback的结果。
Volley 的特点:
1)特别适合数据量小,通信频繁的网络操作。
2)对大文件下载 Volley的表现非常糟糕,只支持http请求。
3)内部分装了异步线程,可直接在主线程调用服务端并处理返回结果。