当前位置:网站首页>2022年大厂Android面试题汇总(一)(含答案)
2022年大厂Android面试题汇总(一)(含答案)
2022-07-06 09:38:00 【代码不难写】
前言
如今,Android开发岗的就业形势逐渐严峻,想要在众多面试者中脱颖而出,拿下大厂offer,就必须全面梳理知识点,扩充题库,并针对面试中可能遇到的关键知识,进行深入分析。
本文是专为Android工程师准备的高薪面试真题汇总题库,涵盖多年大厂面经总结+核心考点深度解析,让你秒变offer收割机。
由于篇幅原因分为上下两篇:
下接:2022年大厂Android面试题汇总(二)(含答案)
Android面试真题
1.跨进程通信的几种方式
Intent,比如拨打电话
ContentProvider数据库存储数据
Broadcast广播通信
AIDL通信,通过接口共享数据
2.wait和 sleep 的区别
wait是Object的方法,wait是对象锁,锁定方法不让继续执行,当执行notify方法后就会继续执行,sleep 是Thread的方法,sleep 是使线程睡眠,让出cpu,结束后自动继续执行
3.String,StringBuffer,StringBuilder的区别
String不可改变对象,一旦创建就不能修改
String str=“aaa”;
str=“bbb”;
以上代码虽然改变了str,但是执行过程是回收str,把值赋给一个新的str
StringBuffer创建之后,可以去修改
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是一个主要用于依赖注入的框架,减少初始化对象操作,降低耦合度
16Android性能优化
布局优化: 减少布局层级,使用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创建传值
21.activity与fragment区别
生命周期:
fragment从创建倒销毁整个生命周期依次为onAttach()→onCreate()→onCreateView()→onActivityCreated()→onStart()→onResume()→onPause()→onStop()→onDestroyView()→onDestroy()→onDetach()
与activity不同的方法有
onAttach():当Fragment和Activity建立关联的时候调用;
onCreateView():当Fragment创建视图调用;
onActivityCreated:与Fragment相关联的Activity完成onCreate()之后调用;
onDestoryView():在Fragment中的布局被移除时调用;
onDetach():当Fragment和Activity解除关联时调用;
activity常用的生命周期只有以下几个;
onCreate(): 表示 Activity 正在被创建,常用来 初始化工作,比如调用 setContentView 加载界面布局资源,初始化 Activity 所需数据等;
onRestart():表示 Activity 正在重新启动,一般情况下,当前Acitivty 从不可见重新变为可见时,OnRestart就会被调用;
onStart(): 表示 Activity 正在被启动,此时 Activity 可见但不在前台,还处于后台,无法与用户交互;
onResume(): 表示 Activity 获得焦点,此时 Activity 可见且在前台并开始活动,这是与 onStart 的区别所在;
onPause(): 表示 Activity 正在停止,此时可做一些 存储数据、停止动画等工作,但是不能太耗时,因为这会影响到新 Activity的显示,onPause 必须先执行完,新 Activity 的 onResume 才会执行;
onStop(): 表示 Activity 即将停止,可以做一些稍微重量级的回收工作,比如注销广播接收器、关闭网络连接等,同样不能太耗时;
onDestroy(): 表示 Activity 即将被销毁,这是 Activity 生命周期中的最后一个回调,常做 回收工作、资源释放;
区别:
Fragment比Activity多出四个回调周期,控制操作上更灵活;
Fragment可以在xml文件中直接写入,也可以在Activity中动态添加;
Fragment可以使用show()/hide()或者replace()对Fragment进行切换,切换的时候不会出现明显的效果,Activity切换的时候会有明显的翻页或其他效果;
22.Fragment中add与replace的区别?
add不会重新初始化fragment,replace每次都会;
添加相同的fragment时,replace不会有任何变化,add会报IllegalStateException 异常;
replace 先 remove 掉相同 id 的所有 fragment,然后在add 当前的这个 fragment,而 add 是覆盖前一个fragment。所以如果使用 add 一般会伴随 hide()和show(),避免布局重叠;
使用 add,如果应用放在后台,或以其他方式被系统销毁,再打开时,hide()中引用的 fragment 会销毁,所以依然会出现布局重叠 bug,可以使用 replace 或使用 add时,添加一个 tag 参数;
23.FragmentPagerAdapter 与 与 FragmentStatePagerAdapter 的区别与使用场景?
FragmentPagerAdapter 的每个 Fragment 会持久的保存在 FragmentManager 中,只要用户可以返回到页面中,它都不会被销毁。因此适用于那些数据 相对静态的页,Fragment 数量也比较少的那种;FragmentStatePagerAdapter 只保留当前页面,当页面不可见时,该 Fragment 就会被消除,释放其资源。因此适用于那些 数据动态性较大、 占用内存较多,多 Fragment 的情况;
24.说下Activity 的四种启动模式、应用场景 ?
standard 标准模式: 每次启动一个 Activity 都会重新创建一个新的实例,不管这个实例是否已经存在,此模式的 Activity 默认会进入启动它的 Activity 所属的任务栈中;
singleTop 栈顶复用模式: 如果新 Activity 已经位于任务栈的栈顶,那么此 Activity 不会被重新创建,同时会回调 onNewIntent方法,如果新 Activity 实例已经存在但不在栈顶,那么Activity 依然会被重新创建;
singleTask 栈内复用模式: 只要 Activity 在一个任务栈中存在,那么多次启动此 Activity 都不会重新创建实例,并回调onNewIntent 方法,此模式启动 Activity A,系统首先会寻找是否存在 A 想要的任务栈,如果不存在,就会重新创建一个任务栈,然后把创建好 A 的实例放到栈中;
singleInstance单实例模式: 这是一种加强的 singleTask 模式,具有此种模式的 Activity 只能单独地位于一个任务栈中,且此任务栈中只有唯一一个实例;
25.说下 Activity 跟 跟 window , view 之间的关系?
Activity 创建时通过 attach()初始化了一个 Window 也就是PhoneWindow,一个 PhoneWindow 持有一个DecorView 的实例,DecorView 本身是一个 FrameLayout,继承于 View,Activty 通过setContentView 将xml 布局控件不断 addView()添加到 View 中,最终显示到 Window 于我们交互;
26.横竖屏切换的Activity 生命周期变化?
不设置 Activity 的 android:configChanges 时,切屏会销毁当前Activity,然后重新加载调用各个生命周期,切横屏时会执行一次,切竖屏时会执行两次;onPause()→onStop()→onDestory()→onCreate()→onStart()→onResume()
设置 Activity 的 android:configChanges=" orientation",经过机型测试
在 Android5.1 即 即 API 3 23 级别下,切屏还是会重新调用各个生命周期,切横、竖屏时只会执行一次
在 Android9 即 即 API 8 28 级别下,切屏不会重新调用各个生命周期,只会执行 onConfigurationChanged方法
官方纠正后,原话如下
如果您的应用面向 Android 2 3.2 即 即 API 级别 3 13 或更
高级别(按照 minSdkVersion 和 targetSdkVersion)
未完待续…
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。
现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
【详细可整理扫描下方二维码免费领取】
边栏推荐
- 04个人研发的产品及推广-数据推送工具
- Garbage first of JVM garbage collector
- The problem of "syntax error" when uipath executes insert statement is solved
- Display picture of DataGridView cell in C WinForm
- Redis installation on centos7
- Interpretation of Flink source code (I): Interpretation of streamgraph source code
- Solr appears write Lock, solrexception: could not get leader props in the log
- Total / statistics function of MySQL
- Application service configurator (regular, database backup, file backup, remote backup)
- Flink analysis (I): basic concept analysis
猜你喜欢
Flink parsing (VII): time window
C# WinForm系列-Button简单使用
PyTorch 提取中间层特征?
04 products and promotion developed by individuals - data push tool
TCP连接不止用TCP协议沟通
Grafana 9 正式发布,更易用,更酷炫了!
Connect to LAN MySQL
06 products and promotion developed by individuals - code statistical tools
[elastic] elastic lacks xpack and cannot create template unknown setting index lifecycle. name index. lifecycle. rollover_ alias
Chrome prompts the solution of "your company management" (the startup page is bound to the company's official website and cannot be modified)
随机推荐
Akamai talking about risk control principles and Solutions
Flink parsing (VII): time window
04个人研发的产品及推广-数据推送工具
pip install pyodbc : ERROR: Command errored out with exit status 1
Grafana 9 is officially released, which is easier to use and more cool!
当前系统缺少NTFS格式转换器(convert.exe)
TCP connection is more than communicating with TCP protocol
Quick start of Hongmeng system
Detailed explanation of data types of MySQL columns
connection reset by peer
[CISCN 2021 华南赛区]rsa Writeup
Flink analysis (I): basic concept analysis
PySpark算子处理空间数据全解析(5): 如何在PySpark里面使用空间运算接口
Flink parsing (III): memory management
Redis quick start
Hongmeng introduction and development environment construction
C # nanoframework lighting and key esp32
信息与网络安全期末复习(基于老师给的重点)
Final review of information and network security (based on the key points given by the teacher)
Kali2021 installation and basic configuration