作者:我-是二毛控控控_ | 来源:互联网 | 2023-07-01 11:42
前言 前几年移动互联网创业的风口,如今渐渐消失,移动互联网被巨头公司瓜分,一些创业公司倒闭了,Android 开发需求慢慢趋近于饱和。而当初移动互联网处于风口时,自学、转行以及培训机构出来了大量 Android 开发从业者,导致目前看起来市场供大于求。
那么 Android 开发工程师们应该如何面对当下的局面呢? 其实当下的供需关系不平衡不代表没有需求,市场上过多的是只会写 xml 和 Activity、只会用代码堆需求的初级 Android 程序员,而高级 Android 开发工程师仍然紧缺,并且薪资很可观。
那么接下来,问题就变成了“如何提升自己在 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的区别
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的区别
3、Service启动方式
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的种类
4、Broadcast Receiver的实现
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的引用而无法释放,解决方案如下
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串行
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()中执行耗时操作 文末
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
小编将自己6年以来的面试经验和学习笔记 都整理成了一个**937页的PDF,**以及我学习进阶过程中看过的一些优质视频教程。**上传在我的文档中:Android架构视频+BATJ面试专题PDF+学习笔记**请君自取,无偿分享!
方法和onHandlerIntent()方法
在onHandlerIntent()中执行耗时操作 文末
不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
小编将自己6年以来的面试经验和学习笔记 都整理成了一个**937页的PDF,**以及我学习进阶过程中看过的一些优质视频教程。**上传在我的文档中:Android架构视频+BATJ面试专题PDF+学习笔记**请君自取,无偿分享!
[外链图片转存中…(img-u5F4nOLs-1618154616731)]
其实看到身边很多朋友抱怨自己的工资很低,包括笔者也是一样的,其原因是在面试过程中没有给面试官一个很好的答案。所以笔者会持续更新面试过程中遇到的问题,也希望大家和笔者一起进步,一起学习。