2019 年 Android 面试题汇总

1.跨进程通讯的几种方式

Intent,好比拨打电话 ContentProvider 数据库存储数据 Broadcast 广播通讯 AIDL通讯,经过接口共享数据java

2.wait和sleep 的区别

wait是Object的方法,wait是对象锁,锁定方法不让继续执行,当执行notify方法后就会继续执行,sellp是Thread的方法,sellp是使线程睡眠,让出cpu,结束后自动继续执行数据库

3.String,StringBuffer,StringBuilder的区别

String不可改变对象,一旦建立就不能修改编程

String str="aaa";
str="bbb";
复制代码

以上代码虽然改变了str,可是执行过程是回收str,把值赋给一个新的str StringBuffer建立以后,能够去修改 StringBuilder也可修改,执行效率高于StringBuffer,不安全 当字符赋值少使用String 字符赋值频繁使用StringBuilder 当多个线程同步操做数据,使用StringBuffercanvas

4.View和SurfaceView的区别

View基于主线程刷新UI,SurfaceView子线程又能够刷新UI缓存

5.View的绘制原理

View为全部图形控件的基类,View的绘制由3个函数完成 measure,计算视图的大小 layout,提供视图要显示的位置 draw,绘制安全

6.简述JNI

是java和c语言之间的桥梁,因为java是一种半解释语言,能够被反编译出来,一种重要涉及安全的代码就使用了C编程,再者不少底层功能调用C语言都实现了Java不必重复造轮子,因此定义了JNI接口的实现性能优化

7.简述TCP,UDP,Socket

TCP是通过3次握手,4次挥手完成一串数据的传送 UDP是无链接的,知道IP地址和端口号,向其发送数据便可,无论数据是否发送成功 Socket是一种不一样计算机,实时链接,好比说传送文件,即时通信bash

8.音视频相关类

整体来讲,分为几个类 视频录制方面,Camear摄像头录制视频类,MediaProjection屏幕录制视频类 编码方面,MediaCodec,MediaRecorder 预览方面,SurfaceView,GLSurfaceView,TextureView,VideoView多线程

9.进程和线程的区别

概念:进程包括多个线程,一个程序一个进程,多线程的优势能够提升执行效率,提升资源利用率 建立:Thread类和Runnable接口, 经常使用方法有:框架

start()用于启动线程

run()调用线程对象中的run方法

join()合并插队到当前线程

sellp()睡眠释放cpu资源

setPriority()设置线程优先级

10.内存泄露如何查看和解决

**概念:**有些对象只有有限的生命周期,当他们的任务完成以后,它们将被垃圾回收,若是在对象的生命周期本该结束的时候,这个对象还被一系列的引用,着就会致使内存泄露。 解决方法:使用开源框架LeakCanary检测针对性解决

常见的内存泄露有: 单例形成的内存泄露,例如单例中的Context生命周期大于自己Context生命周期 线程使用Hander形成的内存卸扣,当activity已经结束,线程依然在运行更新UI 非静态类使用静态变量致使没法回收释放形成泄露 WebView网页过多形成内存泄露 资源未关闭形成泄露,例如数据库使用完以后关闭链接

11.View的分发机制,滑动冲突

View的事件传递顺序有3个重要的方法,dispatchTouchEvent()是否消耗了本次事件,onInterceptTouchEvent()是否拦截了本次事件,onTouchEvent()是否处理本次事件,滑动冲突分为同方向滑动冲突,例如ScrollView和ListView,同方向滑动冲突,能够计算ListView高度而动态设置ListView的高度,ScrollView高度可变。例如ViewPager和ListView,不一样方向滑动冲突,一个是横向滑动一个是竖直滑动,不一样方向滑动能够判断滑动的x,y轴是横向仍是竖直滑动,若是判断获得是横向滑动,就拦截ListView的事件,竖则反之。

12.RecyclerView和ListView的区别

缓存上:前者缓存的是View+ViewHolder+flag,不用每次调用findViewById,后者则只是缓存View 刷新数据方面,前者提供了局部刷新,后者则所有刷新

13.recyclerView嵌套卡顿解决如何解决

设置预加载的数量LinearLayoutManager.setInitialPrefetchItemCount(4),默认是预加载2个, 设置子项缓存,设置自带滑动冲突解决属性rv.setHasFixedSize(true); rv.setNestedScrollingEnabled(false); 能够完美解决,不过Google不推荐RecyClerView嵌套使用,须要嵌套尽可能找相似于ExpandableListView 第三方控件来解决

14,谈MVC ,MVP,MVVM

MVC:View是能够直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些 业务逻辑。 在MVC模型里,更关注的Model的不变,而同时有多个对Model的不一样显示,及View。因此,在MVC模型里,Model不依赖于View,可是 View是依赖于Model的。不只如此,由于有一些业务逻辑在View里实现了,致使要更改View也是比较困难的,至少那些业务逻辑是没法重用的。

MV:MVP 是从经典的模式MVC演变而来,它们的基本思想有相通的地方:Controller/Presenter负责逻辑的处理,Model提供数据,View负 责显示。做为一种新的模式,MVP与MVC有着一个重大的区别:在MVP中View并不直接使用Model,它们之间的通讯是经过Presenter (MVC中的Controller)来进行的,全部的交互都发生在Presenter内部,而在MVC中View会从直接Model中读取数据而不是经过 Controller。

MVVM:数据双向绑定,经过数据驱动UI,M提供数据,V视图,VM即数据驱动层

15.dagger2

Dagger2是一个主要用于依赖注入的框架,减小初始化对象操做,下降耦合度

16.Android性能优化

布局优化 :减小布局层级,使用ViewStub提升显示速度,布局服用,尽量少使用warp_content,删除空间中无用的属性,避免过分绘制移除window默认背景,按需显示展位图,自定义View优化,使用canvas.clipRect()识别可见区域

启动速度:采用分布加载,异步加载,延期加载提升应用初始化速度,采用线程初始化数据等,合理的刷新机制

内存方面:防止内存泄露,使用一些第三方工具检测解决

代码优化:遵循Java生命周期

安装包优化:删除无用资源,优化图片,代码混淆,避免重复库存在,插件化

17.Hander原理

Handler,loop轮询检测发送消息到MessagerQuery,MessageQuery对Message入列,Handler回调方法处理消息,重写handMessage方法刷新ui

18.SharedPreference跨进程使用会怎么样?如何保证跨进程使用安全?

在两个应用的manifest配置中好相同的shartdUserId属性,A应用正常保存数据,B应用 createPackageContext("com.netease.nim.demo", CONTEXT_IGNORE_SECURITY) 获取context而后获取应用数据,为保证数据安全,使用加密存储

19.推送到达率如何提升

判手机系统,小米使用小米推送,华为使用华为推送,其余手机使用友盟推送

20.activity,fragment传值问题

经过Bundle传值,在activty定义变量传值,扩展fragment建立传值

最后

后续会持续更新Android专题知识,你们以为不错能够点个赞在关注下,之后还会分享更多文章!

相关文章
相关标签/搜索