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;
推荐阅读
- 自动化运维工具Ansible之LNMP实践环境部署
- 淘宝产品优化从几个方面进行 如何提升产品的竞争力
- 男性也有更年期?当你身体出现这些变化时要注意
- 刚学会化妆?这几种平价化妆品,好用又便宜!
- 日化线和专业线的区别??
- 淘宝直通车点击率低怎么优化 淘宝直通车怎么优化
- 淘宝点击转化率 淘宝关键词转化率在哪里看
- 关键词推广方式 超级推荐的关键词怎么优化
- 服装转化率多少比较好 淘宝转化率怎么提高
- 售前转化率是什么 淘宝店铺转化率怎么算