Android 大厂高级面试题灵魂 100 问,Android 经典面试
正文如下
Activity 面试题
Fragment 面试题
Service 面试题
Broadcast Receiver 面试题
WebView 面试题
Binder 面试题
Handler 面试题
AsyncTask 面试题
HandlerThread 面试题
IntentService 面试题
视图工作机制面试题
事件分发机制面试题
ListView 面试题
Android 项目构建面试题(由于篇幅太长,今天就先分享到这里)
ANR 面试题
OOM 面试题
Bitmap 面试题
UI 卡顿面试题
内存泄漏面试题
内存管理面试题
冷启动和热启动面试题
其他优化面试题
架构模式面试题
插件化面试题
热更新面试题
进程保活面试题
Lint 面试题
Kotlin 面试题
Activity 面试题
1、Activity 是什么
Activity 是四大组件之一,它提供一个界面让用户点击和各种滑动操作,这就是 Activity
2、Activity 四种状态
runing
paused
stopped
killed
3、Activity 生命周期
onCreate()
onStart()
onResume()
onPause()
onStop()
onDestroy()
onRestart()
4、进程的优先级
空进程
后台进程
服务进程
可见进程
前台进程
5、Activity 任务栈
先进后出
6、Activity 启动模式
standard
singletop
singletask
singleinstance
7、scheme 跳转协议
Android 中的 scheme 是一种页面内跳转协议,通过定义自己的 scheme 协议,可以跳转到 app 中的各个页面
服务器可以定制化告诉 app 跳转哪个页面
App 可以通过跳转到另一个 App 页面
可以通过 H5 页面跳转页面
Fragment 面试题
1、Fragment 为什么被称为第五大组件
Fragment 比 Activity 更节省内存,其切换模式也更加舒适,使用频率不低于四大组件,且有自己的生命周期,而且必须依附于 Activity
2、Activity 创建 Fragment 的方式
静态创建
动态创建
3、FragmentPageAdapter 和 FragmentPageStateAdapter 的区别
FragmentPageAdapter 在每次切换页面的的时候,是将 Fragment 进行分离,适合页面较少的 Fragment 使用以保存一些内存,对系统内存不会多大影响
FragmentPageStateAdapter 在每次切换页面的时候,是将 Fragment 进行回收,适合页面较多的 Fragment 使用,这样就不会消耗更多的内存
4、Fragment 生命周期
onAttach()
onCreate()
onCreateView()
onActivityCreated()
onStart()
onResume()
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
5、Fragment 的通信
Fragment 调用 Activity 中的方法:getActivity
Activity 调用 Fragment 中的方法:接口回调
Fragment 调用 Fragment 中的方法:FragmentManager.findFragmentById
6、Fragment 的 replace、add、remove 方法
replace:替代 Fragment 的栈顶页面
add:添加 Fragment 到栈顶页面
remove:移除 Fragment 栈顶页面
Service 面试题
1、Service 是什么
Service 是四大组件之一,它可以在后台执行长时间运行操作而没有用户界面的应用组件
2、Service 和 Thread 的区别
Service 是安卓中系统的组件,它运行在独立进程的主线程中,不可以执行耗时操作。Thread 是程序执行的最小单元,分配 CPU 的基本单位,可以开启子线程执行耗时操作
Service 在不同 Activity 中可以获取自身实例,可以方便的对 Service 进行操作。Thread 在不同的 Activity 中难以获取自身实例,如果 Activity 被销毁,Thread 实例就很难再获取得到
3、Service 启动方式
startService
bindService
4、Service 生命周期
startService
onCreate()
onStartCommand()
onDestroy()
bindService
onCreate()
onBind()
onUnbind()
onDestroy()
Broadcast Receiver 面试题
1、Broadcast Receiver 是什么
Broadcast 是四大组件之一,是一种广泛运用在应用程序之间传输信息的机制,通过发送 Intent 来传送我们的数据
2、Broadcast Receiver 的使用场景
同一 App 具有多个进程的不同组件之间的消息通信
不同 App 之间的组件之间的消息通信
3、Broadcast Receiver 的种类
普通广播
有序广播
本地广播
Sticky 广播
4、Broadcast Receiver 的实现
静态注册:注册后一直运行,尽管 Activity、进程、App 被杀死还是可以接收到广播
动态注册:跟随 Activity 的生命周期
5、Broadcast Receiver 实现机制
自定义广播类继承 BroadcastReceiver,复写 onReceiver()
通过 Binder 机制向 AMS 进行注册广播
广播发送者通过 Binder 机制向 AMS 发送广播
AMS 查找符合相应条件的广播发送到 BroadcastReceiver 相应的循环队列中
消息队列执行拿到广播,回调 BroadcastReceiver 的 onReceiver()
6、LocalBroadcastManager 特点
本地广播只能在自身 App 内传播,不必担心泄漏隐私数据
本地广播不允许其他 App 对你的 App 发送该广播,不必担心安全漏洞被利用
本地广播比全局广播更高效
以上三点都是源于其内部是用 Handler 实现的
WebView 面试题
1、WebView 安全漏洞
API16 之前存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用 WebView.addJavascriptInterface 方法,远程攻击者可通过使用 Java 反射机制利用该漏洞执行任意 Java 对象的方法
2、WebView 销毁步骤
WebView 在其他容器上时(如:LinearLayout),当销毁 Activity 时,需要在 onDestroy()中先移除容器上的 WebView,然后再将 WebView.destroy(),这样就不会导致内存泄漏
3、WebView 的 jsbridge
客户端和服务端之间可以通过 Javascript 来互相调用各自的方法
4、WebViewClient 的 onPageFinished
WebViewClient 的 onPageFinished 在每次完成页面的时候调用,但是遇到未加载完成的页面跳转其他页面时,就会一直调用,使用 WebChromeClient.onProgressChanged 可以替代
5、WebView 后台耗电
在 WebView 加载页面的时候,会自动开启线程去加载,如果不很好的关闭这些线程,就会导致电量消耗加大,可以采用暴力的方法,直接在 onDestroy 方法中 System.exit(0)结束当前正在运行中的 java 虚拟机
6、WebView 硬件加速
Android3.0 引入硬件加速,默认会开启,WebView 在硬件加速的情况下滑动更加平滑,性能更加好,但是会出现白块或者页面闪烁的副作用,建议 WebView 暂时关闭硬件加速
7、WebView 内存泄漏
由于 WebView 是依附于 Activity 的,Activity 的生命周期和 WebView 启动的线程的生命周期是不一致的,这会导致 WebView 一直持有对这个 Activity 的引用而无法释放,解决方案如下
独立进程,简单暴力,不过可能涉及到进程间通信(推荐)
动态添加 WebView,对传入 WebView 中使用的 Context 使用弱引用
Binder 面试题
1、Linux 内核的基本知识
进程隔离/虚拟地址空间:进程间是不可以共享数据的,相当于被隔离,每个进程被分配到不同的虚拟地址中
系统调用:Linux 内核对应用有访问权限,用户只能在应用层通过系统调用,调用内核的某些程序
binder 驱动:它负责各个用户的进程,通过 binder 通信内核来进行交互的模块
2、为什么使用 Binder
性能上,相比传统的 Socket 更加高效
安全性高,支持协议双方互相校验
3、Binder 通信模型
Service 服务端通过 Binder 驱动在 ServiceManager 的查找表中注册 Object 对象的 add 方法
Client 客户端通过 Binder 驱动在 ServiceManager 的查找表中找到 Object 对象的 add 方法,并返回 proxy 的 add 方法,add 方法是个空实现,proxy 也不是真正的 Object 对象,是通过 Binder 驱动封装好的代理类的 add 方法
当 Client 客户端调用 add 方法时,Client 客户端通过 Binder 驱动将 proxy 的 add 方法,请求 ServiceManager 来找到 Service 服务端真正对象的 add 方法,进行调用
4、AIDL
客户端通过 aidl 文件的 Stub.asInterface()方法,拿到 Proxy 代理类
通过调用 Proxy 代理类的方法,将参数进行封包后,调用底层的 transact()方法
transact()方法会回调 onTransact()方法,进行参数的解封
在 onTransact()方法中调用服务端对应的方法,并将结果返回
Handler 面试题
1、Handler 是什么
Handler 通过发送和处理 Message 和 Runnable 对象来关联相对应线程的 MessageQueue
2、Handler 使用方法
post(runnable)
sendMessage(message)
3、Handler 工作原理
4、Handler 引起的内存泄漏
原因:非静态内部类持有外部类的匿名引用,导致 Activity 无法释放
解决:
Handler 内部持有外部 Activity 的弱引用
Handler 改为静态内部类
Handler.removeCallback()
AsyncTask 面试题
1、AsyncTask 是什么
它本质上就是一个封装了线程池和 Handler 的异步框架
2、AsyncTask 使用方法
三个参数
Params:表示后台任务执行时的参数类型,该参数会传给 AysncTask 的 doInBackground()方法
Progress:表示后台任务的执行进度的参数类型,该参数会作为 onProgressUpdate()方法的参数
Result:表示后台任务的返回结果的参数类型,该参数会作为 onPostExecute()方法的参数
五个方法
onPreExecute():异步任务开启之前回调,在主线程中执行
doInBackground():执行异步任务,在线程池中执行
onProgressUpdate():当 doInBackground 中调用 publishProgress 时回调,在主线程中执行
onPostExecute():在异步任务执行之后回调,在主线程中执行
onCancelled():在异步任务被取消时回调
3、AsyncTask 工作原理
4、AsyncTask 引起的内存泄漏
原因:非静态内部类持有外部类的匿名引用,导致 Activity 无法释放
解决:
AsyncTask 内部持有外部 Activity 的弱引用
AsyncTask 改为静态内部类
AsyncTask.cancel()
5、AsyncTask 生命周期
在 Activity 销毁之前,取消 AsyncTask 的运行,以此来保证程序的稳定
6、AsyncTask 结果丢失
由于屏幕旋转、Activity 在内存紧张时被回收等情况下,Activity 会被重新创建,此时,旧的 AsyncTask 持有旧的 Activity 引用,这个时候会导致 AsyncTask 的 onPostExecute()对 UI 更新无效
7、AsyncTask 并行 or 串行
AsyncTask 在 Android 2.3 之前默认采用并行执行任务,AsyncTask 在 Android 2.3 之后默认采用串行执行任务
如果需要在 Android 2.3 之后采用并行执行任务,可以调用 AsyncTask 的 executeOnExecutor()
HandlerThread 面试题
1、HandlerThread 产生背景
当系统有多个耗时任务需要执行时,每个任务都会开启一个新线程去执行耗时任务,这样会导致系统多次创建和销毁线程,从而影响性能。为了解决这一问题,Google 提供了 HandlerThread,HandlerThread 是在线程中创建一个 Looper 循环器,让 Looper 轮询消息队列,当有耗时任务进入队列时,则不需要开启新线程,在原有的线程中执行耗时任务即可,否则线程阻塞
2、HanlderThread 的特点、
HandlerThread 本质上是一个线程,继承自 Thread
HandlerThread 有自己的 Looper 对象,可以进行 Looper 循环,可以创建 Handler
HandlerThread 可以在 Handler 的 handlerMessage 中执行异步方法
HandlerThread 优点是异步不会堵塞,减少对性能的消耗
HandlerThread 缺点是不能同时继续进行多任务处理,需要等待进行处理,处理效率较低
HandlerThread 与线程池不同,HandlerThread 是一个串行队列,背后只有一个线程。
IntentService 面试题
1、IntentService 是什么
IntentService 是继承自 Service 并处理异步请求的一个类,其内部采用 HandlerThread 和 Handler 实现的,在 IntentService 内有一个工作线程来处理耗时操作,其优先级比普通 Service 高。当任务完成后,IntentService 会自动停止,而不需要手动调用 stopSelf()。另外,可以多次启动 IntentService,每个耗时操作都会以工作队列的方式在 IntentService 中 onHandlerIntent()回调方法中执行,并且每次只会执行一个工作线程
2、IntentService 使用方法
创建 Service 继承自 IntentService
覆写构造方法和 onHandlerIntent()方法
在 onHandlerIntent()中执行耗时操作
最后
**一个零基础的新人,我认为坚持是最最重要的。**我的很多朋友都找我来学习过,我也很用心的教他们,可是不到一个月就坚持不下来了。我认为他们坚持不下来有两点主要原因:
他们打算入行不是因为兴趣,而是因为所谓的 IT 行业工资高,或者说完全对未来没有任何规划。
刚开始学的时候确实很枯燥,这确实对你是个考验,所以说坚持下来也很不容易,但是如果你有兴趣就不会认为这是累,不会认为这很枯燥,总之还是贵在坚持。
技术提升遇到瓶颈了?缺高级 Android 进阶视频学习提升自己吗?还有大量大厂面试题为你面试做准备!
提升自己去挑战一下 BAT 面试难关吧
对于很多 Android 工程师而言,想要提升技能,往往是自己摸索成长,不成体系的学习效果低效漫长且无助。整理的这些知识图谱希望对 Android 开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。
不论遇到什么困难,都不应该成为我们放弃的理由!
如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!
最后祝各位新人都能坚持下来,学有所成。
评论