2019 年 Android 面试题汇总

32次阅读

共计 3382 个字符,预计需要花费 9 分钟才能阅读完成。

1. 跨进程通信的几种方式
Intent, 比如拨打电话 ContentProvider 数据库存储数据 Broadcast 广播通信 AIDL 通信,通过接口共享数据
2.wait 和 sleep 的区别
wait 是 Object 的方法,wait 是对象锁,锁定方法不让继续执行,当执行 notify 方法后就会继续执行,sellp 是 Thread 的方法,sellp 是使线程睡眠,让出 cpu,结束后自动继续执行
3.String,StringBuffer,StringBuilder 的区别
String 不可改变对象,一旦创建就不能修改
String str=”aaa”;
str=”bbb”;
以上代码虽然改变了 str,但是执行过程是回收 str,把值赋给一个新的 strStringBuffer 创建之后,可以去修改 StringBuilder 也可修改,执行效率高于 StringBuffer,不安全当字符赋值少使用 String 字符赋值频繁使用 StringBuilder 当多个线程同步操作数据,使用 StringBuffer
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 是一种不同计算机,实时连接,比如说传送文件,即时通讯
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 也是比较困难的,至少那些业务逻辑是无法重用的。MVP: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 创建传值
免费获取更多面试专题和安卓开发架构的资料(包括 Fultter、高级 UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)和一线互联网公司关于 android 面试的题目汇总可以加:936332305 / 链接:点击链接加入【安卓开发架构】

正文完
 0