写点什么

【绝对干货】超全 Android 中高级面试复习大纲,安卓面试题目 2019

用户头像
Android架构
关注
发布于: 2021 年 11 月 05 日
  • 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、Fragmen


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


t 的 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 使用弱引用


**[腾讯、字节跳动、阿里、百度等 BAT 大厂 2019-2020 面试真题解析](


)**

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 工作原理


[Android 进阶——Android 消息机制之 Looper、Handler、MessageQueen](


)


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 工作原理


  • [Android 进阶——多线程系列之异步任务 AsyncTask 的使用与源码分析](


)


4、AsyncTask 引起的内存泄漏


原因:非静态内部类持有外部类的匿名引用,导致 Activity 无法释放

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
【绝对干货】超全Android中高级面试复习大纲,安卓面试题目2019