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

Posted m0_65320833

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转相关的知识,希望对你有一定的参考价值。

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”

最后

本文在开源项目GitHub中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

目前已经更新的部分资料,需要的自己取:



D%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…**

目前已经更新的部分资料,需要的自己取:

[外链图片转存中…(img-8mgycEbB-1643966933272)]
[外链图片转存中…(img-j1Po1dZH-1643966933274)]
[外链图片转存中…(img-foxUEAvk-1643966933274)]

Android开发奇葩问题整理

1、 在新App开发的过程中,突然发现整个app的文字都变大了,图片变得模糊,通过查看代码,没有发现style之类的异常,^_^,肿么办?

解: 我遇到这个问题的时候,着实花费了2个小时的时间,新应用是协作开发,单独的看提交没有任何问题,而且程序也能正常的run,只是文字和图标变大和虚了,后来定位到了AndroidManifest.xml,代码如下:

<uses-permission android:name="android.permission.XXX"/>
<uses-permission android:name="android.permission.XXX"/>

或者

 <uses-sdk tools:overrideLibrary="com.facebook"/>
 <uses-sdk tools:overrideLibrary="com.facebook"/>

如代码所示,重复的在AndroidManifest.xml中定义uses-sdk或者uses-permission就会出现上述问题,如果你也遇到了这种情况,百思不得其解,可以试试看AndroidManifest.xml中是否有重复定义的元素。

以上是关于你曾遇到的某大厂奇葩问题:Android组件化开发,组件间的Activity页面跳转的主要内容,如果未能解决你的问题,请参考以下文章

Android开发奇葩问题整理

Android组件化与插件化开发项目实战整理分享(含支付宝360美团滴滴等大厂项目实战)

Android解决请求接口的一些奇葩路径参数等

Android解决请求接口的一些奇葩路径参数等

2021年BATJ30套大厂Android经典高频面试题,使用指南

聊聊那些年遇到过的奇葩代码