Android组件化开发思想与实践( 二 )

ARouter.openDebug; // 开启调试模式(如果在InstantRun模式下运行 , 必须开启调试模式!线上版本需要关闭,否则有安全风险) } ARouter.init(application); //尽可能早 , 推荐在Application中初始化 }}4、在Activity中添加注解Route
public interface RouterPaths { String LOGIN_ACTIVITY = "/login/login_activity";}// 在支持路由的页面上添加注解(必选)// 这里的路径需要注意的是至少需要有两级 , /xx/xx@Route(path = RouterPaths.LOGIN_ACTIVITY)public class LoginActivity extends BaseActivity {}path是指跳转路径 , 要求至少两级 , 即/xx/xx的形式 , 第一个xx是指group , 如果不同module中出现相同的group会报错 , 所以建议group用module名称标识 。
5、发起跳转操作
ARouter.getInstance.build(RouterPaths. LOGIN_ACTIVITY).navigation;ARouter的还有很多其他功能 , 这里不作详细说明 。
 
二 , Aplication动态加载Application作为程序的入口通常做一些初始化 , 如上面提到的ARouter , 由于ARouter是所有模块层组件都要用到 , 所以把它放在BaseApplication进行初始化 。如果某个初始化操作只属于某个模块 , 为了降低耦合 , 我们应该把该初始化操作放在对应模块module的Application里 。如下:
1、在BaseModule定义接口
public interface BaseApplicationImpl { void init; ...}2、在ModuleConfig中进行配置
public interface ModuleConfig { String LOGIN = "com.linda.login.LoginApplication"; String DETAIL = "com.linda.detail.DetailApplication"; String PAY = "com.linda.pay.PayApplication"; String modules = { LOGIN, DETAIL, PAY };}3、在BaseApplicatiion通过反射的方式获取各个module中Application的实例并调用init方法 。
public abstract class BaseApplication extends Application implements BaseApplicationImpl { @Override public void onCreate { super.onCreate; initComponent; initARouter; } /** * 初始化各组件 */ public void initComponent { for (String module : ModuleConfig.modules) { try { Class clazz = Class.forName(module); BaseApplicationImpl baseApplication = (BaseApplicationImpl) clazz.newInstance; baseApplication.init; } catch (ClassNotFoundException e) { e.printStackTrace; } catch (IllegalAccessException e) { e.printStackTrace; } catch (InstantiationException e) { e.printStackTrace; } } } ...}4、子module中实现init方法 , 并进行相关初始化操作
public class LiveApplication extends BaseApplication { public void init { //在这里做一些的Live相关的初始化操作 }} 
三 , 模块间通信BroadcastReceiver:系统提供 , 比较笨重 , 使用不够优雅 。
EventBus:使用简单优雅 , 将发送这与接收者解耦 , 2.x使用反射方式比较耗性能 , 3.x使用注解方式比反射快得多 。
但是有些情况是BroadcastReceiver、EventBus解决不了的 , 例如想在detail模块中获取mine模块中的数据 。因为detail和mine都依赖了base,所以我们可以借助base来实现 。
1、在base中定义接口并继承ARouter的IProvider 。
public interface IMineDataProvider extends IProvider { String getMineData;}2、在mine模块中新建MineDataProvider类实现IMineDataProvider , 并实现getMineData方法
@Route(path = RouterPaths.MINE_DATA_PROVIDER)public class MineDataProvider implements IMineDataProvider { @Override public String getMineData { return "***已获取到mine模块中的数据***"; } @Override public void init(Context context) { }}3、在detail中获取MineDataProvider实例并调用IMineDataProvider接口中定义的方法
IMineDataProvider mineDataProvider = (IMineDataProvider) ARouter.getInstance.build(RouterPaths.MINE_DATA_PROVIDER).navigation;


推荐阅读