- 业务库工程可以快速拆分出来,集成到其他App中。
- 迭代频繁的业务模块采用组件方式,业务线研发可以互不干扰、提升协作效率,并控制产品质量,加强稳定性。
- 并行开发,团队成员只关注自己的开发的小模块,降低耦合性,后期维护方便等。
2 组件化通信
2.1 组件化通信
?组件化互相不直接依赖,如果组件A想调用组件B的方法是不行的。很多开发者因为组件化之间通信比较复杂 则放弃了组件化的使用
组件通信有以下几种方式:
####### 1.本地广播
本地广播,也就是LoacalBroadcastRecevier。更多是用在同一个应用内的不同系统规定的组件进行通信,好处在于:发送的广播只会在自己的APP内传播,不会泄漏给其他的APP,其他APP无法向自己的APP发送广播,不用被其他APP干扰。本地广播好比对讲通信,成本低,效率高,但有个缺点就是两者通信机制全部委托与系统负责,我们无法干预传输途中的任何步骤,不可控制,一般在组件化通信过程中采用比例不高。
2.进程间的AIDL
?进程间的AIDL。这个粒度在于进程,而我们组件化通信过程往往是在线程中,况且AIDL通信也是属于系统级通信,底层以Binder机制,虽说Android提供模板供我们实现,但往往使用者不好理解,交互比较复杂,往往也不适用应用于组件化通信过程中。
3.匿名的内存共享
匿名的内存共享。比如用Sharedpreferences,在处于多线程场景下,往往会线程不安全,这种更多是存储一一些变化很少的信息,比如说组件里的配置信息等等
4.Intent Bundle传递
Intent Bundle传递。包括显性和隐性传递,显性传递需要明确包名路径,组件与组件往往是需要互相依赖,这背离组件化中SOP(关注点分离原则),如果走隐性的话,不仅包名路径不能重复,需要定义一套规则,只有一个包名路径出错,排查起来也稍显麻烦,这个方式往往在组件间内部传递会比较合适,组件外与其他组件打交道则使用场景不多。
2.2 目前主流做法之一就是引入第三者,比如图中的Base Module。
3 ARouter组件通信框架
3.1 ARouter 简介
是ARouter是阿里巴巴开源的Android平台中对页面、服务提供路由功能的中间件,提倡的是简单且够用。主要用作组件化通信
GitHub:[https://github.com/alibaba/ARouter](
)
前言
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中页面的需求,不过就算是简简单单的页面跳转,随着时间的推移,也会遇到一些问题:
-
集中式的URL管理:谈到集中式的管理,总是比较蛋疼,多人协同开发的时候,大家都去AndroidManifest.xml中定义各种IntentFilter,使用隐式Intent,最终发现AndroidManifest.xml中充斥着各种Schame,各种Path,需要经常解决Path重叠覆盖、过多的Activity被导出,引发安全风险等问题
-
可配置性较差:Manifest限制于xml格式,书写麻烦,配置复杂,可以自定义的东西也较少
-
跳转过程中无法插手:直接通过Intent的方式跳转,跳转过程开发者无法干预,一些面向切面的事情难以实施,比方说登录、埋点这种非常通用的逻辑,在每个子页面中判断又很不合理,毕竟activity已经实例化了
- 跨模块无法显式依赖:在App小有规模的时候,我们会对App做水平拆分,按照业务拆分成多个子模块,之间完全解耦,通过打包流程控制App功能,这样方便应对大团队多人协作,互相逻辑不干扰,这时候只能依赖隐式Intent跳转,书写麻烦,成功与否难以控制。
为了解决以上问题,我们需要一款能够解耦、简单、功能多、定制性较强、支持拦截逻辑的路由组件:我们选择了Alibaba的ARouter,偷个懒,直接贴ARouter的中文介绍文档:
3.2 ARouter 优势
从 ARouter Github 了解到它的优势:
支持直接解析标准URL进行跳转,并自动注入参数到目标页面中 支持多模块工程使用 支持添加多个拦截器,自定义拦截顺序 支持依赖注入,可单独作为依赖注入框架使用 支持InstantRun 支持MultiDex(Google方案) 映射关系按组分类、多级管理,按需初始化 支持用户指定全局降级与局部降级策略 页面、拦截器、服务等组件均自动注册到框架 支持多种方式配置转场动画 支持获取Fragment 完全支持Kotlin以及混编 典型的应用:
从外部URL映射到内部页面,以及参数传递与解析 跨模块页面跳转,模块间解耦 拦截跳转过程,处理登陆、埋点等逻辑
跨模块API调用,通过控制反转来做组件解耦
三、典型应用场景
- 从外部URL映射到内部页面,以及参数传递与解析
- 跨模块页面跳转,模块间解耦
- 拦截跳转过程,处理登陆、埋点等逻辑
- 跨模块API调用,模块间解耦(注册ARouter服务的形式,通过接口互相调用)
四、基础功能
- 添加依赖和配置
- apply plugin: ‘com.neenbedankt.android-apt’
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
}
}
apt {
arguments {
moduleName project.getName();
}
}
dependencies {
apt 'com.alibaba:arouter-compiler:x.x.x'
compile 'com.alibaba:arouter-api:x.x.x'
...
}
添加注解
// 在支持路由的页面、服务上添加注解(必选)
// 这是最小化配置,后面有详细配置
@Route(path = "/test/1")
public class YourActivity extend Activity {
...
}
初始化SDK
ARouter.init(mApplication); // 尽可能早,推荐在Application中初始化
发起路由操作 // 1. 应用内简单的跳转(通过URL跳转在’中阶使用’中) ARouter.getInstance().build("/test/1").navigation();
// 2. 跳转并携带参数
ARouter.getInstance().build("/test/1")
.withLong("key1", 666L)
.withString("key3", "888")
.navigation();
五、进阶用法
通过URL跳转
// 新建一个Activity用于监听Schame事件
// 监听到Schame事件之后直接传递给ARouter即可
// 也可以做一些自定义玩法,比方说改改URL之类的
// http://www.example.com/test/1
public class SchameFilterActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 外面用户点击的URL
Uri uri = getIntent().getData();
// 直接传递给ARouter即可
ARouter.getInstance().build(uri).navigation();
finish();
}
}
// AndroidManifest.xml 中 的参考配置
<activity android:name=".activity.SchameFilterActivity">
<!-- Schame -->
<intent-filter>
<data
android:host="m.aliyun.com"
android:scheme="arouter"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
<!-- App Links -->
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data
android:host="m.aliyun.com"
android:scheme="http"/>
<data
android:host="m.aliyun.com"
android:scheme="https"/>
</intent-filter>
</activity>
使用ARouter协助解析参数类型
// URL中的参数会默认以String的形式保存在Bundle中
// 如果希望ARouter协助解析参数(按照不同类型保存进Bundle中)
// 只需要在需要解析的参数上添加 @Param 注解
@Route(path = "/test/1")
public class Test1Activity extends Activity {
@Param // 声明之后,ARouter会从URL中解析对应名字的参数,并按照类型存入Bundle
public String name;
@Param
private int age;
@Param(name = "girl") // 可以通过name来映射URL中的不同参数
private boolean boy;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
name = getIntent().getStringExtra("name");
age = getIntent().getIntExtra("age", -1);
boy = getIntent().getBooleanExtra("girl", false); // 注意:使用映射之后,要从Girl中获取,而不是boy
}
}
开启ARouter参数自动注入(实验性功能,不建议使用,正在开发保护策略)
// 首先在Application中重写 attachBaseContext方法,并加入ARouter.attachBaseContext();
@Override
protected void attachBaseContext(Context base) {
### 最后我想说
**为什么很多程序员做不了架构师?**
1、良好健康的职业规划很重要,但大多数人都忽略了
2、学习的习惯很重要,持之以恒才是正解。
3、编程思维没能提升一个台阶,局限在了编码,业务,没考虑过选型、扩展
4、身边没有好的架构师引导、培养。所处的圈子对程序员的成长影响巨大。
金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!**在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。**
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
![](https://s2.51cto.com/images/20210913/1631471987326844.jpg)
**里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…**
##### **[CodeChina开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》](https://ali1024.coding.net/public/P7/Android/git)**
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/150563.html