写点什么

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 开发的朋友们有所参考以及少走弯路,本文的重点是你有没有收获与成长,其余的都不重要,希望读者们能谨记这一点。


不论遇到什么困难,都不应该成为我们放弃的理由!


如果有什么疑问的可以直接私我,我尽自己最大力量帮助你!


最后祝各位新人都能坚持下来,学有所成。


本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

用户头像

极客开源

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
Android大厂高级面试题灵魂100问,Android经典面试