2021最新Android大厂面试题来袭,Android自学教程

2021年09月15日 阅读数:3
这篇文章主要向大家介绍2021最新Android大厂面试题来袭,Android自学教程,主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

组件化

1.1 组件化初衷

  • APP版本不断的迭代,新功能的不断增长,业务也会变的愈来愈复杂,维护成本高。
  • 业务耦合度高,代码愈来愈臃肿,团队内部多人协做开发困难。
  • Android项目在编译代码的时候电脑会很是卡,又由于单一工程下代码耦合严重,每修改一处代码后都要从新编译打包测试,致使很是耗时。
  • 方便单元测试,改动单独一个业务模块,不须要着重于关注其余模块被影响。

1.2 什么是组件化

组件化就是将一个app分红多个Module,以下图,每一个Module都是一个组件(也能够是一个基础库供组件依赖),开发的过程当中咱们能够单独调试部分组件,组件间不须要互相依赖,但能够相互调用,最终发布的时候全部组件以lib的形式被主app工程依赖并打包成一个apk。git

1.3 组件化优点

  • 组件化就是将通用模块独立出来,统一管理,以提升复用,将页面拆分为粒度更小的组件,组件内部除了包含UI实现,还包含数据层和逻辑层。
  • 每一个工程均可以独立编译、加快编译速度,独立打包。
  • 每一个工程内部的修改,不会影响其余工程。
  • 业务库工程能够快速拆分出来,集成到其余App中。
  • 迭代频繁的业务模块采用组件方式,业务线研发能够互不干扰、提高协做效率,并控制产品质量,增强稳定性。
  • 并行开发,团队成员只关注本身的开发的小模块,下降耦合性,后期维护方便等。

2 组件化通讯

2.1 组件化通讯

组件化互相不直接依赖,若是组件A想调用组件B的方法是不行的。不少开发者由于组件化之间通讯比较复杂 则放弃了组件化的使用面试

组件通讯有如下几种方式:编程

####### 1.本地广播 浏览器

本地广播,也就是LoacalBroadcastRecevier。更可能是用在同一个应用内的不一样系统规定的组件进行通讯,好处在于:发送的广播只会在本身的APP内传播,不会泄漏给其余的APP,其余APP没法向本身的APP发送广播,不用被其余APP干扰。本地广播比如对讲通讯,成本低,效率高,但有个缺点就是二者通讯机制所有委托与系统负责,咱们没法干预传输途中的任何步骤,不可控制,通常在组件化通讯过程当中采用比例不高。安全

2.进程间的AIDL

进程间的AIDL。这个粒度在于进程,而咱们组件化通讯过程每每是在线程中,何况AIDL通讯也是属于系统级通讯,底层以Binder机制,虽然说Android提供模板供咱们实现,但每每使用者很差理解,交互比较复杂,每每也不适用应用于组件化通讯过程当中。markdown

3.匿名的内存共享

匿名的内存共享。好比用Sharedpreferences,在处于多线程场景下,每每会线程不安全,这种更可能是存储一一些变化不多的信息,好比说组件里的配置信息等等多线程

4.Intent Bundle传递

Intent Bundle传递。包括显性和隐性传递,显性传递须要明确包名路径,组件与组件每每是须要互相依赖,这背离组件化中SOP(关注点分离原则),若是走隐性的话,不只包名路径不能重复,须要定义一套规则,只有一个包名路径出错,排查起来也稍显麻烦,这个方式每每在组件间内部传递会比较合适,组件外与其余组件打交道则使用场景很少。app

2.2 目前主流作法之一就是引入第三者,好比图中的Base Module。

2021最新Android大厂面试题来袭,Android自学教程

3 ARouter组件通讯框架

3.1 ARouter 简介

是ARouter是阿里巴巴开源的Android平台中对页面、服务提供路由功能的中间件,提倡的是简单且够用。主要用做组件化通讯框架

        Intent intent = new Intent(mContext, XxxActivity.class);
 intent.putExtra("key","value");
 startActivity(intent);

 Intent intent = new Intent(mContext, XxxActivity.class);
 intent.putExtra("key","value");
 startActivityForResult(intent, 666);

上面一段代码,在Android开发中,最多见也是最经常使用的功能就是页面的跳转,咱们常常须要面对从浏览器或者其余App跳转到本身App中页面的需求,不过就算是简简单单的页面跳转,随着时间的推移,也会遇到一些问题:ide

  1. 集中式的URL管理:谈到集中式的管理,老是比较蛋疼,多人协同开发的时候,你们都去AndroidManifest.xml中定义各类IntentFilter,使用隐式Intent,最终发现AndroidManifest.xml中充斥着各类Schame,各类Path,须要常常解决Path重叠覆盖、过多的Activity被导出,引起安全风险等问题

  2. 可配置性较差:Manifest限制于xml格式,书写麻烦,配置复杂,能够自定义的东西也较少

  3. 跳转过程当中没法插手:直接经过Intent的方式跳转,跳转过程开发者没法干预,一些面向切面的事情难以实施,比方说登陆、埋点这种很是通用的逻辑,在每一个子页面中判断又很不合理,毕竟activity已经实例化了

  4. 跨模块没法显式依赖:在App小有规模的时候,咱们会对App作水平拆分,按照业务拆分红多个子模块,之间彻底解耦,经过打包流程控制App功能,这样方便应对大团队多人协做,互相逻辑不干扰,这时候只能依赖隐式Intent跳转,书写麻烦,成功与否难以控制。

为了解决以上问题,咱们须要一款可以解耦、简单、功能多、定制性较强、支持拦截逻辑的路由组件:咱们选择了Alibaba的ARouter,偷个懒,直接贴ARouter的中文介绍文档:

3.2 ARouter 优点

从 ARouter Github 了解到它的优点:

支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独做为依赖注入框架使用 支持InstantRun 支持MultiDex(Google方案) 映射关系按组分类、多级管理,按需初始化 支持用户指定全局降级与局部降级策略 页面、拦截器、服务等组件均自动注册到框架 支持多种方式配置转场动画 支持获取Fragment 彻底支持Kotlin以及混编 典型的应用:

从外部URL映射到内部页面,以及参数传递与解析 跨模块页面跳转,模块间解耦 拦截跳转过程,处理登录、埋点等逻辑

跨模块API调用,经过控制反转来作组件解耦

3、典型应用场景

  1. 从外部URL映射到内部页面,以及参数传递与解析
  2. 跨模块页面跳转,模块间解耦
  3. 拦截跳转过程,处理登录、埋点等逻辑
  4. 跨模块API调用,模块间解耦(注册ARouter服务的形式,经过接口互相调用)

学习路线+知识梳理

花了很长时间,就为了整理这张详细的知识路线脑图。固然因为时间有限、能力也都有限,毕竟嵌入式全体系实在太庞大了,包括我那作嵌入式的同窗,也不可能什么都懂,有些东西可能没覆盖到,不足之处,还但愿小伙伴们一块儿交流补充,一块儿完善进步。

img

本文在CodeChina开源项目:Android开发不会这些?如何面试拿高薪 中已收录,里面包含不一样方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

此次就分享到这里吧,下篇见