Android前沿最新面试题总结

2017年12月16日 11:23 79 次阅读 来源: 素文宅 作者: 假诗人

普通市面上的安卓的面试题以及不为现在的互联网公所用了,而且现在安卓的面试也越来越难了,本人针对市场上的常问面试问题做了一个总结这套面试题包含市场上的高端技术以及底层的分析。

对大家面试绝对会有加分的功能:

热更新:APP在开发完成后,发布上线后由于测试的不严谨以及开发人员的书库会导致一些

不可避免的BUG而传统的方式就是提示用户更新来解决BUG这样对用户体验非常不好热更新就是在用

户不知情的情况下我们已经通过我们的操作来自动的解决BUG它的基本的步骤就是

1、注册Tinker账号并新建项目,

2、配置gradle和代码

3、生成基准包

4、修复Bug

5、生成补丁包

6、发布补丁包


您能说一下Picasso和Glide的区别吗?

Glide加载的图片没有Picasso那么平滑Picasso缓存的是全尺寸的,而Glide缓存的是

跟ImageView尺寸相同的Picasso虽然也能加载GIF图片但是不会动Glide就可以完美加载


OkhTTP 与Volley 的区别你能说一下吗?

这两个都是来访问网络的,但是不同的是Volley是一个

开源的库它只是封装了访问网络的一些操作,但是底层还是

用的谷歌提供的OKHTTPcLIE但是okhttp虽然也是这样但是okhttp用

到是sink和source,这两个是在Okio这个开源库里的,sink相当于outputStream,

source相当于是inputStream。sink和source比InputStream和OutputStream更加强大,

单拿sink举例,他的子类有BufferedSink(支持缓冲)、GzipSink(支持Gzip压缩)


你能说一下事件分发机制吗?

当一个Touch事件(触摸事件为例)到达根节点,即Acitivty的ViewGroup时,

它会依次下发,下发的过程是调用子View(ViewGroup)的dispatchTouchEvent方法实现的。

简单来说,就是ViewGroup遍历它包含着的子View,调用每个View的dispatchTouchEvent方法,

而当子View为ViewGroup时,又会通过调用ViwGroup的dispatchTouchEvent方法继续调用其内部的View的dispatchTouchEvent方法。


内存溢出与内存泄漏的区别以及处理方案?

内存溢出就是要求分配的内存超出了系统能给的,系统不能满足需求,于是产生溢出。 

内存泄漏是指向系统申请分配内存进行使用(new),可是使用完了以后却不归还(delete),

结果申请到的那块内存自己也不能再访问(也许把它的地址给弄丢了),而系统也不能再次将它分配给需要的程序。

引起内存溢出的原因有很多种,常见的有以下几种:

1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

3.代码中存在死循环或循环产生过多重复的对象实体;

4.使用的第三方软件中的BUG;

5.启动参数内存值设定的过小

1、使用monkey工具

因为有些内存问题藏的比较深,要长期使用才能出现异常。所以可以使用monKey工具 来对我们的应用程序进行压力测试。

模拟20000次用户操作的参考命令: adb shell monkey -s 23 -p comq.example.msi.jd

 --ignore-crashes --ignore-timeouts -v -v -v 200000 > D:\文件名.log

回车之后,我们所需要测试的应用程序就启动了,并且还有不断触摸事件被促发,程序 生成的log会保存在D目录下。

2、捕获OOM异常

自定义Application并让它实现UncaughtExceptionHandler 接口,

在onCreate方法中让自己成为系统的默认异常处理机制。Thread.setDefaultUncaughtExceptionHandler(this);

这样子设置之后,如果应用程序出现异常,

就会调用Application中的uncaughtException 方法。

我们就在这个方法中判断异常是否为OOM异常。如果是OOM异常,就将内存快照导到sd卡中去。

3.用第三方开源框架分析

leakcanary 是一个开源项目,一个内存泄露自动检测工具,

是著名的 GitHub 开源组织 Square 贡献的,它的主要优势就在于自动化过早的发觉内存泄露、

配置简单、抓取贴心,缺点在于还存在一些bug,不过正常使用百分之九十情况是OK的,其核心原理与MAT工具类似。


您能解释一下瀑布式开发模式和敏捷式开发模式以及区别吗?

这两个开发模式都要经过市场调查 需求分析 开发 测试 上线 

这些流程但是不同的是瀑布式开发就专注于完成这个

最终的形态而敏捷式开发则更多的是更新迭代式的开发


你之前做这个视频播放的时候出现什么问题?

之前出现过最严重的问题就是视频的播放使用MP4格式的延迟特别

严重后来我们采用Ts一种流媒体封装格式,流媒体封装有一个好处,

就是不需要加载索 引再播放,大大减少了首次载入的延迟.


什么事JNI和NDK?

Java通过JNI机制和C/C++沟通的具体步骤

1、编写包含native本地方法的java类

2、通过javah工具生成C/C++语言的头文件

3、使用C/C++语言实现头文件

4、使用交叉编译工具对C/C++本地代码进行编译,最后通过链接生成*.so可执行的C/C++库

5、实际执行Java代码去和本地的C/C++代码互相沟通


JNI是Java调用Native机制,是Java语言自己的特性全称

为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提供的库和函数功能很有限,仅仅处理些算法效率敏感的问题


什么是Android的三级缓存技术?

android默认给每个应用只分配内存,所以如果加载过多的图片,为了防止内存溢出,应该将图片缓存起来。图片的三级缓存分别是:

内存缓存

本地缓存

网络缓存


其中,内存缓存应优先加载,它速度最快;本地缓存次优先加载,它速度也快;网络缓存不应该优先加载,它走网络,速度慢且耗流量。(总的来说由快到慢)


什么是ANR,OOM?

app一段时间点击卡顿(进程阻塞5秒,广播是10秒),然后弹出一个对话空,是等待还是关闭,

Activity Manager和WindowManager操作的,说白了就是程序无响应

主线程不可以执行操作IO,主线程开启耗时操作(数据库读取,网络访问)

Service不可以耗时操作,如果想要耗时操作,请启动IntentService

广播接收者的回掉,也是主线程


解决anr:

耗时操作,开启子线程

HandlerThread里面有个Looper关联这消息队列,可发送消息到主线程

生命周期中,避免耗时操作


说一下OOM:

当前占用的内存加上我们申请的内存资源,超过了,Dalvik虚拟机的内存最大限制,就抛出了Out of Memory

图片的显示,缩略图,不去网络请求,只有滑动停止,加载大图

及时释放内存空间---recycle


讲一下你了解的网络访问?

物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。

简单来说,三种网络访问框架,我最常用过的是Volley,

不论是稳定性还是各方面来讲都是不错的,而且也简单易懂,

Okhttp是用于请求大量数据时的不错选择,但Volley速度快,

可以用作于频繁操作请求数据,而且Okhttp如果要用的话,

就要对它进行一个简单的封装,鸿洋大神封装的Okhttp3.0我也用过,

如果运用再项目中也是不错的选择,但我现在的更倾向于Retrofit,

因为它也是基于Okhttp的,但性能上却可以和Volley相媲美,

而且能更好的配合Rxjava,Rxandroid的编程方式来开发项目,所以对比下来,感觉还是Retrofit更占优势,但缺点是比前两者难。


支付开发流程?

.1.申请开发者资质

2.申请APP_ID/APP_KEY

3.申请支付能力

4.代码集成微信支付


1.客户端代码得到用户购买的商品信息,将之传给自己公司app服务器,参数包含但不限于以下:

2.app服务器调用微信“统一下单”接口,得到?prePayId?订单号并返回?prePayId?给手机客户端;

3.手机客户端使用?prePayId?及商品信息调起微信客户端进行支付;

4.微信客户端回调支付结果给咱们的APP客户端;

5.微信服务器异步通知咱们公司app服务器支付结果(服务器的工作,与客户端无关)。


即时通信基于Xmpp好处?

1. 开放性

XMPP协议是自由、开放、公开的,并且易于了解。而且在客户端、服务器、组件、源码库等方面,都已经各自有多种实现。

2.跨平台

客户端只要基于XMPP协议,不管是什么平台(包括不同的移动终端)都可以互联互通。


XMPP中定义了三个角色:XMPP客户端、XMPP服务器、网关。

1.客户端通过TCP/IP协议连接到服务器,然后通过XML传输数据。

2.XMPP的核心部分就是一个在网络上分片断发送XML的流协议。这个流协议是XMPP的即时通讯指令的传递基础,

也是一个非常重要的可以被进一步利用的网络基础协议。所以可以说,XMPP用TCP传的是XML流。


直播App,你做过哪些优化:?

采集优化:在网络情况不好的情况下,降低码率进行播放,减少延迟。

传输优化:使用定制的UDP协议来替换TCP协议,省去弱网环节下的丢包重传也可以起到降低延迟的作用。

网络优化:选择一个好的直播云服务器也是解决延迟的关键。

编码上的优化:开启Codec上的最低延迟设置,在一定程度上是可以降低视频直播APP的延迟现象。


Mvp和mvc和mvvm?

一、MVC(Model-View-Controller)

MVC是比较直观的架构模式,用户操作->View(负责接收用户的输入操作)->

Controller(业务逻辑处理)->Model(数据持久化)->View(将结果反馈给View)。

MVC使用非常广泛,比如JavaEE中的SSH框架(Struts/Spring/Hibernate),

Struts(View, STL)-Spring(Controller, Ioc、Spring MVC)-Hibernate(Model, ORM)以及ASP.NET 中的ASP.NET 


MVC框架,xxx.cshtml-xxxcontroller-xxxmodel。

(实际上后端开发过程中是v-c-m-c-v,v和m并没有关系,下图仅代表经典的mvc模型)

二、MVP(Model-View-Presenter)

MVP是把MVC中的Controller换成了Presenter(呈现),

目的就是为了完全切断View跟Model之间的联系,由Presenter充当桥梁,做到View-Model之间通信的完全隔离。

.NET程序员熟知的ASP.NET 


webform、winform基于事件驱动的开发技术就是使用的MVP模式。

控件组成的页面充当View,实体数据库操作充当Model,而View和Model之间的控件数据绑定操作则属于Presenter。

控件事件的处理可以通过自定义的IView接口实现,而View和IView都将对Presenter负责。


三、MVVM(Model-View-ViewModel)

如果说MVP是对MVC的进一步改进,那么MVVM则是思想的完全变革。

它是将“数据模型数据双向绑定”的思想作为核心,因此在View和Model之间没有联系,通过ViewModel进行交互,

而且Model和ViewModel之间的交互是双向的,因此视图的数据的变化会同时修改数据源,而数据源数据的变化也会立即反应到View上。

这方面典型的应用有.NET的WPF,js框架Knockout、AngularJS等。


ndroid与其他前端技术交互开发?

WebView在布局文件中,销毁Activity的时候,一定要把WebView销毁掉,通过Remove

Android3.0开始后,WebView有个硬件加速,容易出现页面白块,界面闪烁。设置WebView关闭硬件加速。

WebView关联的Activity,导致不能回收,为了避免内存泄露,独立进程,简单暴力,进程间的通信。


什么是插件化开发和组件化开发?

组件化开发就是将一个app分成多个模块,每个模块都是一个组件(Module),

开发的过程中我们可以让这些组件相互依赖或者单独调试部分组件等,

但是最终发布的时候是将这些组件合并统一成一个apk,这就是组件化开发。

插件化开发和组件化开发略有不用,插件化开发时将整个app拆分成很多模块,

这些模块包括一个宿主和多个插件,每个模块都是一个apk(组件化的每个模块是个lib),

最终打包的时候将宿主apk和插件apk分开或者联合打包。


为什么要用组件化开发?

·稍微改动一个模块的一点代码都要编译整个工程,耗时耗力

·公共资源、业务、模块混在一起耦合度太高

·不方便测试


为什么有插件化?

有了组件化,为什么还要用插件化呢?插件化开发总的来说有以下几点好处(不同插件框架不一样):

·宿主和插件分开编译

·并发开发

·动态更新插件

·按需下载模块

·方法数或变量数爆棚


什么是9path图片?

.9.PNG是安卓开发里面的一种特殊的图片,

这种格式的图片通过ADT自带的编辑工具生成,

使用九宫格切分的方法,使图片支持在android 环境下的自适应展示。


多线程和多进程?

多线程可以使程序逻辑和控制方式简单;

所有线程可以直接共享内存和变量

线程方式消耗的总资源比进程方式好

每个线程与主程序共用地址空间,受限于2GB地址空间;?

线程之间的同步和加锁控制比较麻烦

每个进程互相独立,不影响主程序的稳定性,子进程崩溃没关系;?

通过增加CPU,就可以容易扩充性能;?

可以尽量减少线程加锁/解锁的影响,极大提高性能,就算是线程运行的模块算法效率低也没关系;?

每个子进程都有2GB地址空间和相关资源,总体能够达到的性能上限非常大

1. Handler+Thread

2. AsyncTask

3. ThreadPoolExecutor

4. IntentService


说一下Android的常用存储方式:

第一种: 使用SharedPreferences存储数据

第二种: 文件存储数据

第三种: Sqlite数据库

第四种: ContentProvider内容提供者

第五种: 网络存储(服务器)


什么是面向对象思想?

面向对象编程:英文名叫Object-Oriented Programming,在面向对象编写的程序当中,

一切事物皆为对象,准确的说,对象就是一个自包含的实体,

用一组可识别的特性和行为来标识,以对象为依托来进行程序逻辑的编写。通过单个控制对象或者批量处理来实现逻辑。


请讲一下什么是自定义View

其实自定义View可以分为两种,第一种是Viwe,

第二种是ViewGroup,其中ViewGroup其实还是继承自View的。

自定义View的绘制流程主要是Measure,layout,draw,分别是获取宽高,

获取位置和绘制。确定了基本的东西后,我们就再Ondraw方法中,使用Paint画笔绘制View就可以的,


什么是RecyclerView?

自Android?5.0之后,谷歌公司推出了RecylerView控件是一个强大的滑动组件,

与经典的ListView相比,同样拥有item回收复用的功能RecylerView封装了viewholder的回收复用简单的来说就是把数据以列表的方式给展示出来。

还可以输入136 讨论区:
评 论