/**
- 安装用户组件对外暴露的接口
*/
public interface IUserInstallService {
// 跳转到安装用户页面,其中extra是要传递的数据
void launch(Context context, String extra);
}
然后在A组件里,实现此接口(当然A组件的gradle文件得添加对common组件的依赖):
public class UserInstallService implements IUserInstallService {
@Override
public void launch(Context context, String extra) {
Intent intent = new Intent(context, UserInstallActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putExtra(“extra_data”, extra); // 传递数据
context.startActivity(intent);
}
}
这样,跳转方法就已经暴露出来可以供其他组件调用了,那在B组件里,我们怎么调用呢?得想办法拿到UserInstallService 的实例,然后就能调用它的launch方法来跳转了。
因为common组件还要管理其它组件的跳转,所以这些跳转得统一管理起来:
2.对组件间的跳转进行统一管理
我们在common组件里写一个工厂类,用于分配这些跳转:
public class ServiceFactory {
private static ServiceFactory instance;//单例模式
private ServiceFactory() {
}
public static ServiceFactory getInstance() {
if (instance == null) {
synchronized (ServiceFactory.class) {
if (instance == null)
instance = new ServiceFactory();
}
}
return instance;
}
// 安装用户组件的跳转服务的注册和获取
private IUserInstallService mIUserInstallService;
public IUserInstallService getIUserInstallService() {
return mIUserInstallService;
}
public void setIUserInstallService(IUserInstallService mIUserInstallService) {
this.mIUserInstallService = mIUserInstallService;
}
// 其他组件的跳转服务的注册和获取,与A组件的一样
}
那么很显然,在B组件里,我们就要想办法通过common组件的ServiceFactory 的getLoginService()方法来获取A组件的UserInstallService 的实例。要get,就首先要set,否则拿到的是一个null对象。那么这个set应该放在哪里实现呢?
3.利用Java反射将跳转服务进行实例化
set UserInstallService 对象的操作肯定得放在跳转之前,即get之前。最好在B组件初始化的时候就完成set,而且这个set 操作得放在A组件里,要不然又产生依赖了。
有了这个思路,就可以实现如下:
在common组件里,再增加一个接口:
public interface IAppComponent {
public void initialize(Application app);
}
这个接口用来表示各个组件的初始化。各个组件都要重写自己的Application,实现这个接口。比如A组件重写的Application类如下:
public class OrgApp extends Application implements IAppComponent{
@Override
public void onCreate() {
super.onCreate();
initialize(this);
}
@Override
public void initialize(Application app) {
ServiceFactory.getInstance().setIUserInstallService(new UserInstallService());
}
}
如果想让A组件的用于组件单独运行时,需要在A组件的AndroidManifest.xml里,指定这个类为组件的application:(注:作为module运行时记得删除android:name=“.OrgApp”,不然程序会报错。)
<application
android:name=“.OrgApp”
android:allowBackup=“true”
android:label=“@string/app_name”
android:theme=“@style/AppTheme”>
但是别忘了,当组件单独运行时,Application类的onCreate()可以走到;而A组件作为module集成之后,Application类是不会被加载的。
怎么办呢?因为app壳组件的Application是肯定会被加载的,所以可以在这里,用反射来加载其他组件的Application类。这也是为什么要在common组件里新建IAppComponent 接口类的原因。app壳组件的Application类也要重写并在manifest里指定。在app壳组件的Application初始化时,可以对其他的组件进行挨个加载,这样,上面我们想要的set 操作就可以在这里完成了。
为了管理要加载的组件,我们在common组件里新建一个AppConfig类,如下;
public class AppConfig {
public static String[] COMPONENTS = {
“mod.activity.com.orginfo.application.OrgApp”,//这个是A组件的Application类
// 还有其他的组件的Application类的全名,也都放这里
“mod.activity.com.login.application.LoginApp”
};
}
上面这个AppConfig类用来记录所有的组件的Application类的全名。
下面是app壳组件的新Application类:
public class AppApplication extends Application implements IAppComponent {
@Override
public void onCreate() {
super.onCreate();
initialize(this);
}
@Override
public void initialize(Application app) {
// 遍历所有的组件的Application类,依次用反射的方式实例化
for (String component : AppConfig.COMPONENTS) {
try {
Class<?> clazz = Class.forName(component);
Object object = clazz.newInstance();
// 实例化后,调用各个组件的 set 方法
if (object instanceof IAppComponent) {
((IAppComponent) object).initialize(app);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
经过这样的处理,上面第二步最后“该在哪里set 跳转服务”的问题就解决了。总结本篇实现的组件间跳转原理如下:
在应用启动的时候,它的APP壳组件的Application类会进行初始化,在这里我们通过反射的方式初始化了其他各组件的Application类,而各组件的Application类在初始化时,又会通过set操作把自己的跳转服务注册到common组件。这样的话,通过common组件get对应的服务,即可实现跳转。
我们来试一下,在B组件里,跳转到A组件,就可以这么写了;
// 安装用户
ServiceFactory.getInstance().getIUserInstallService().launch(mContext, “”);
这样B组件就不依赖A组件也可以进行跳转,实现了我们的期望。
还有一点,要是A组件没有被集成到app里,那么ServiceFactory.getInstance().getIUserInstallService()就是null,会报空指针异常。我们需要把getIUserInstallService()补充下:
public IUserInstallService getIUserInstallService() {
if (mIUserInstallService == null)
mIUserInstallService = new EmptyUserInstallService();
return mIUserInstallService;
}
这里EmptyUserInstallService是对IUserInstallService 接口的一个空实现,目的只是为了避免这个空指针异常,就不贴代码了。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/6d120395a038030dae405f89d357f47f.jpeg)
最后
都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。
技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;
我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 PDF(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。
Java语言与原理;
大厂,小厂。Android面试先看你熟不熟悉Java语言
高级UI与自定义view;
自定义view,Android开发的基本功。
性能调优;
数据结构算法,设计模式。都是这里面的关键基础和重点需要熟练的。
NDK开发;
未来的方向,高薪必会。
前沿技术;
组件化,热升级,热修复,框架设计
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
化,热升级,热修复,框架设计
[外链图片转存中…(img-yHQ1u54L-1713511099502)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
我在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多
当然,想要深入学习并掌握这些能力,并不简单。关于如何学习,做程序员这一行什么工作强度大家都懂,但是不管工作多忙,每周也要雷打不动的抽出 2 小时用来学习。
不出半年,你就能看出变化!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!