你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转

组件化就是要将项目的各个功能拆成多个模块,可分为app主模块,登录注册模块,个人中心模块,功能模块等。

组件化架构设计:

1、主工程模块,主要是APP壳,里面不涉及任何逻辑代码,只有权限等配置写在app模块下的AndroidManifest.xml中。

2、常规业务模块,该层的组件就是我们真正的业务组件了。我们通常按照功能模块来划分业务组件,例如注册登录、用户个人中心、APP的首页模块等。这里的每个业务组件都是一个小的APP,只需要修改一下对应的module的build.gradle,就可以单独编译,单独打包成APK在手机上运行。

3、功能组件,一个公共模块,所有的常规业务模块都依赖他。字符串、颜色、尺寸资源等写在该模块下,该组件是一些通用的工具类。

组件之间必须遵循以下规则:

1、只有上层的组件才能依赖下层组件,不能反向依赖,否则可能会出现循环依赖的情况;

2、同一层之间的组件不能相互依赖,这也是为了组件之间的彻底解耦;

常规业务模块间的Activity跳转

==================

由于常规业务模块之间是不能相互依赖的,所以不能直接使用startActivity进行跳转。在这里介绍两种方法:

方法1:

用功能组件(common组件)来统一管理业务组件间的跳转。

业务组件间不能相互依赖,而A组件需要跳转到B组件,那么我们可以让B组件来提供具体的跳转方法,让common组件来承担这个跳转方法的调用,然后A组件依赖common组件即可,是一个迂回的策略。

其他的组件要跳转到另外的组件,也是同样的处理。随着业务增加可能会有X组件,Y组件等等,那么X组件负责提供跳转到X组件的方法,Y组件负责提供跳转到Y组件的方法,并且这些方法,都要经由common组件来管理。

具体代码实现:

1.各个组件应该提供跳转到自己的方法,供别的组件调用

具体如何实现呢?对于A组件的跳转来说,首先,common组件要给别的组件提供一个接口,用于跳转到A组件。

这个接口写在common组件里:

/**

  • 安装用户组件对外暴露的接口

*/

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”

};

}

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

最后

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司2021年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

img

当程序员容易,当一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

一个优秀的程序员是需要不断学习的,从初级程序员到高级程序员,从初级架构师到资深架构师,或者走向管理,从技术经理到技术总监,每个阶段都需要掌握不同的能力。早早确定自己的职业方向,才能在工作和能力提升中甩开同龄人。

  • 无论你现在水平怎么样一定要 持续学习 没有鸡汤,别人看起来的毫不费力,其实费了很大力,这四个字就是我的建议!!!
  • 我希望每一个努力生活的IT工程师,都会得到自己想要的,因为我们很辛苦,我们应得的。

当我们在抱怨环境,抱怨怀才不遇的时候,没有别的原因,一定是你做的还不够好!

《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值