Android 面试心得(面试题+答案)

这篇博客分享了Android开发面试中的常见问题,涵盖了手机适配、界面优化、自定义View、进程线程管理、内存问题、混合开发、组件化模块化、UI更新、设计模式、Activity启动模式、网络通信、线程通信、ANR及其避免策略等核心知识点,揭示了当前行业面临的‘内卷’现象和技术挑战。

分享面试心得和一些些吐槽

任何行业发展过程中难免面临“内卷”化问题,呈现出企业招人才难,人才找工作难现象。

1、各种手机适配问题

xml进行手机匹配
刘海屏适配
implementation 'com.android.support:percent:28.+'

2、界面优化

布局重用,少嵌套,减少布局层级,避免过度绘制,去掉无用的背景,资源;

3、自定义view

自定义View和自定义ViewGroup的区别在于

自定义View主要是实现onMeasure + onDraw(注重绘制-/drɔː/)
自定义ViewGroup主要是实现onMeasure + onLayout(注重布局-/ˈleɪaʊt/

4、进程和线程区别+如何保证安全

进程是程序资源管理器最小单元,线程是程序执行的最小单元,
进程包括多个线程组成,同一个进程中的多个线程享受相同的资源。

5、内存泄漏、溢出、抖动

内存泄露:程序在向系统申请分配内存空间后(new),在使用完毕后未释放。结果导致一直占据该内存单元,我们和程序都无法再使用该内存单元,直到程序结束,这是内存泄露。

内存溢出:程序向系统申请的内存空间超出了系统能给的。比如内存只能分配一个int类型,我却要塞给他一个long类型,系统就出现oom。

大量的内存泄露会导致内存溢出(oom)。
容易产生内存泄漏的情况
ActivityContextstatic Activity activity; static view;
Inner Classes(内部类---内部类持有外部类实例的强引用)
Handler/ˈhændlə(r)/)、Threads/θredz/

6、混合开发,Android调用前端问题

7、组件化、模块化开发

8、Android 更新UI有哪几种方法

1. 直接在主线程更新(仅限 UI 线程)
2. 使用 Handler 切换回主线程
3. 使用组件内置的 runOnUiThread()
4. 使用 View.post()
适用场景:在某个 UI 组件上执行操作,确保其 UI 任务运行在主线程。
textView.post(() -> textView.setText("View.post 更新 UI"));
📌 原理:View.post() 会把任务提交到 View 关联的 UI 线程。
5、ViewModel 监听数据变化时自动更新 UI
6、Kotlin 协程 + Dispatchers.Main 实现 UI 更新。

9、MVC、MVP、MVVM、MVI

MVC:数据和视图分离
MVPP持有view接口
MVVPModel、view、ViewModel
它将用户界面(View)与数据和逻辑(ViewModel)分开,并允许两个组件之间进行数据绑定。ViewModel 负责为 View 准备数据并处理用户输入。
MVI:单向数据流,唯一可信数据源
模型(Model-/ˈmɑːdl/):负责管理应用的状态数据,并对外部事件做出响应。
视图(View):负责显示界面,并将用户的操作转化为意图(Intent)。
意图(Intent):代表用户的行为,如点击按钮、输入文本等,它们被发送到模型层以改变应用的状态。

10、ListView和RecycleView的区别是什么,优缺点是什么

ListView 和 RecyclerView 都用于显示长列表数据,但 RecyclerView 是 ListView 的增强版本,提供更高效的性能和更丰富的功能。
ListView	适用于较简单的列表,性能需求不高,功能较少的情况下可以使用
RecyclerView	适用于大数据量列表、复杂布局、多种 item 类型,支持更灵活的定制
布局:
ListView:只能垂直滚动列表,不支持网格或瀑布流布局。
RecyclerView:使用 LayoutManager 管理布局,可以支持:
点击事件
ListView:提供 setOnItemClickListener() 直接监听 item 点击事件。
RecyclerView:没有内置的点击监听器,必须在 Adapter 里手动实现 setOnClickListener()。
数据更新
ListView:数据变化后,通常使用 notifyDataSetChanged(),但无法局部刷新,性能较低。
RecyclerView:提供更细粒度的刷新方法,如:
notifyItemInserted(position)(插入某个 item)
notifyItemRemoved(position)(删除某个 item)
notifyItemChanged(position)(更新某个 item)
notifyItemMoved(fromPosition, toPosition)(移动 item)
动画支持
ListView:没有内置动画,动画效果需要手动实现。
RecyclerView:支持 ItemAnimator,可以轻松实现添加、删除、移动动画。

11、Java设计模式有哪些

1、单例模式;2、工厂模式;3、建造(Builder)模式;4、观察者模式;
5、适配器(Adapter)模式;6、代理模式;7、装饰模式。 

12、Activity启动模式

标准模式、栈顶模式、栈内模式,唯一模式

13、网络相关

五层通信 :应用层、网络层、ip层、传输层、物理层
TCP:对数据进行排序发送,速度慢,不易丢包,超时支持重新发送
UDP:速度快,容易丢包
HTTP:三次握手,四次挥手,一问一答
HTTPS:加密数据
Socket:即套接字,是一个对 TCP / IP协议进行封装的编程调用接口(API)。双全工通信,可相互发信息。
Socket不是一种协议,而是一个编程调用接口(API),属于传输层(主要解决数据如何在网络中传输)
WebSocket

14、进/线程间的通信

通信方式:
进程间通信(IPC):由于不同进程的内存独立,进程间通信需要使用 Binder、AIDL、Messenger、ContentProvider 或者广播(Broadcast)等机制。
线程间通信:同一进程内的线程可以直接共享数据,但需要同步机制(如 synchronized、Handler、ExecutorService)防止数据竞争。

15、ANR

ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定
的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。
一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。

 那么哪些场景会造成ANR呢?
Service Timeout:前台服务在20s内未执行完成;
BroadcastQueue Timeout:前台广播在10s内未执行完成
ContentProvider Timeout:内容提供者在publish过超时10s;
InputDispatching Timeout:输入事件分发超时5s,包括按键和触摸事件。

16、Android 事件分发机制

dispatchTouchEvent() 负责事件分发。
onInterceptTouchEvent() 负责拦截子 View 事件(仅 ViewGroup)。
onTouchEvent() 负责事件处理。
事件传递是 自顶向下(ActivityViewGroupView。),处理是 自底向上。
true 表示消费事件,false 表示事件继续传递。

17、应用优化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值