Android 多模塊暴露接口調(diào)用功能

在模塊化開發(fā)中,時(shí)不時(shí)會(huì)遇到跨模塊調(diào)用功能,引入了ARouter可以做到跨模塊調(diào)用,那如果項(xiàng)目沒有引入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();
這里是Github代碼參考
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容