在模塊化開(kāi)發(fā)中,時(shí)不時(shí)會(huì)遇到跨模塊調(diào)用功能,引入了ARouter可以做到跨模塊調(diào)用丈钙,那如果項(xiàng)目沒(méi)有引入ARouter呢,那這里可以自己做多模塊暴露接口調(diào)用功能交汤。
這里示例做了從業(yè)務(wù)模塊中調(diào)用主app module中的一個(gè)用戶信息著恩,從角色上分為app模塊,base-module模塊蜻展,module-one模塊和module-two模塊喉誊。
在公共模塊base-module模塊中
用戶實(shí)體類:
data class UserBean(val id: String, val name: String)
ServiceCreator類:
interface ServiceCreator<T> {
fun create(): T
}
ServiceManager類:用于對(duì)暴露接口和實(shí)現(xiàn)類的綁定關(guān)系:
public final class ServiceManager {
private static final ConcurrentHashMap<String, Object> sServices = new ConcurrentHashMap<>();
private static final ConcurrentHashMap<String, ServiceCreator<?>> sServiceCreators = new ConcurrentHashMap<>();
private ServiceManager() {
}
@SuppressWarnings("unchecked")
public static <T> T getService(@NonNull Class<T> iCls) {
return getService(iCls.getName());
}
@SuppressWarnings("unchecked")
public static <T> T getService(@NonNull String name) {
T service = (T) sServices.get(name);
if (service == null) {
synchronized (sServices) {
service = (T) sServices.get(name);
if (service == null) {
ServiceCreator<T> creator = (ServiceCreator) sServiceCreators.get(name);
if (creator != null) {
service = creator.create();
sServices.put(name, service);
sServiceCreators.remove(name);
}
}
}
}
return service;
}
public static <T> void registerService(@NonNull Class<T> iCls, @NonNull T obj) {
registerService(iCls.getName(), obj);
}
public static <T> void registerService(@NonNull String name, @NonNull T obj) {
sServices.put(name, obj);
}
public static <T> void registerService(@NonNull Class<T> iCls, @NonNull ServiceCreator<T> creator) {
registerService(iCls.getName(), creator);
}
public static <T> void registerService(@NonNull String name, @NonNull ServiceCreator<T> creator) {
sServiceCreators.put(name, creator);
}
public static <T> void unregisterService(@NonNull Class<T> iCls) {
unregisterService(iCls.getName());
}
public static <T> void unregisterService(@NonNull String name) {
sServices.remove(name);
sServiceCreators.remove(name);
}
public static void clearAll(){
sServices.clear();
sServiceCreators.clear();
}
}
base模塊中聲明需要暴露功能的接口:
public interface IModuleConnect {
UserBean getUserBean();
}
在module-two模塊中:
實(shí)現(xiàn)該接口功能:
public class IModuleConnectImp implements IModuleConnect {
@Override
public UserBean getUserBean() {
UserBean userBean = new UserBean("", "IModuleConnectImp");
return userBean;
}
}
在application中
注冊(cè)該暴露接口和實(shí)現(xiàn)類,將接口和實(shí)現(xiàn)類在map中進(jìn)行一一綁定纵顾。
//注冊(cè)service
ServiceManager.registerService(IModuleConnect::class.java, IModuleConnectImp())
在module-one業(yè)務(wù)模塊中:
從ServiceManager的hashmap中獲取實(shí)現(xiàn)接口伍茄,調(diào)用接口類實(shí)現(xiàn)的方法:
IModuleConnect service = ServiceManager.getService(IModuleConnect.class);
UserBean userBean = service.getUserBean();