App開發組件化開發,各個Mode間的通信可能第一次接觸的人不太瞭解;其實有很多種方式的,比較流行的是阿里路由,如果在已有的項目上實現組件化,用阿里路由可能有些麻煩,尤其是App層依賴的資源比較多,暫時那些依賴的資源還沒有挪出來,那Mode調用App層的資源就很難受了。
其實Mode層調用App層的資源或者A-Mode調用B-Mode我們用接口回調的方式也可以實現的,原因是App層都會依賴各Mode,在App裏面可以隨意調用各Mode的資源;我們把App作爲一箇中間傳輸層是很合理的;
1.首先我們在Utils-Mode定義一個接口,接口的未實現方法裏面需要傳遞一個Context(用於跳轉各個Mode的頁面)和一個Bean(通用的需要傳遞特殊數據可以很方便的添加),再創見一個Set和Get這個未實現接口的公共類;
/** * 設置接口實例的公共類 */ public class CareerPenCommon { private static final CareerPenCommon INSTANCE = new CareerPenCommon(); public static CareerPenCommon getInstance() { return INSTANCE; } protected ICareerPenMeetingCallback careerPenMeetingCallback; public ICareerPenMeetingCallback getCareerPenMeetingCallback() { return careerPenMeetingCallback; } public void setCareerPenMeetingCallback(ICareerPenMeetingCallback careerPenMeetingCallback) { this.careerPenMeetingCallback = careerPenMeetingCallback; } }
//接口方法
/** * 接口方法 */ public interface ICareerPenMeetingCallback { /** * 實現方法 * * @param context */ void onItemMeetingClick(Context context, Bean typeBean); }
2.A-Mode和B-Mode依賴Utils-Mode,可以通過Utils-Mode的公共類裏面的Get接口實例的接口的方法,往裏面傳參數。
這裏注意我們依賴Utils-Mode的時候必須用api project,這樣我們App就不用依賴Utils-Mode了
//調用公共類的Get接口實例的方法,並傳參數
CareerPenCommon.getInstance().getCareerPenMeetingCallback().onItemMeetingClick(context, typeBean);
//依賴Utils-Mode
api project(':modeutils')
3.在我們的App層創建一個實現接口的類,通過實現接口傳遞的參數去做各種操作,在我們的啓動頁調用Utils-Mode的公共類的Set方法去把這個實現接口的類New出來
/** * 實現接口的類 */ public class CareerPenImpl implements ICareerPenMeetingCallback { @Override public void onItemMeetingClick(Context context, Bean typeBean) { // 會議 //這裏根據typeBean裏面的數據可以做任何操作 } }
//在啓動頁設置這個實現接口
CareerPenCommon.getInstance().setCareerPenMeetingCallback(new CareerPenImpl());
//App層依賴各個Mode
implementation project(':mymode')
到這我們就完成了各個Mode和App的相互通信了