写点什么

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

用户头像
Android架构
关注
发布于: 13 小时前

因为 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 反射


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


将跳转服务进行实例化**


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 接口的一个空实现,目的只是为了避免这个空指针异常,就不贴代码了。


方法 2:


采用路由来实现页面跳转,比较成熟的有:


[美团的 WMRouter:](


)

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

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