首先,为了所有子类模块都能共享这个方法,我们在lib_base中定义一个服务接口:
package tsou.cn.lib_base.provider;
import com.alibaba.android.arouter.facade.template.IProvider;
/**
* Created by Administrator on 2017/12/5 0005.
* 如果是共有的module_base里的方法,不同模块都可以调用。
* 但如果属于两个模块的独有方法,其他模块是不能调用的,
* 此时使用ARouter的IProvider来实现
*/
public interface IChatModuleService extends IProvider {
String getUserName(String userId);
}
该接口有个未实现的方法叫getUserName,获取用户名称,接口写好了由谁来实现呢?获取用户所在的地址只有chat模块才有这个方法,所以就需要在chat模块中来实现这个接口了,我们把它叫做ChatModuleService
package tsou.cn.module_chat.module_service;
import android.content.Context;
import com.alibaba.android.arouter.facade.annotation.Route;
import tsou.cn.lib_base.provider.IChatModuleService;
import tsou.cn.lib_base.utils.RouteUtils;
import tsou.cn.module_chat.net.ChatService;
/**
* Created by Administrator on 2017/12/5 0005.
*/
@Route(path = RouteUtils.Service_Chat)
public class ChatModuleService implements IChatModuleService {
@Override
public String getUserName(String userId) {
return ChatService.getUserName();
}
@Override
public void init(Context context) {
}
}
和Activity和Fragment一样,我们也需要在实现的Service上加上path路由注解,这样ARouter框架才能发现这个服务,而且不同模块的Service的path前的组“/chat/”一定要是不一样的,不然会出现找不到的情况:
//模块间服务调用,调用chat模块的接口
public static final String Service_Chat = "/chat/service";
ChatService类中简单的写了一个getUserName方法,返回用户的名称
package tsou.cn.module_chat.net;
/**
* Created by Administrator on 2017/12/5 0005.
*/
public class ChatService {
public static String getUserName() {
return "从服务器获取的数据“hangxiaoguo”";
}
}
接下来就是服务的发现(我放在了base中方便各个模块的使用),调用方法:
package tsou.cn.lib_base.route_service;
/**
* Created by Administrator on 2017/12/5 0005.
* <p>
* 服务的发现
*/
public class ModuleRouteService {
public static String getUserName(String userId) {
IChatModuleService chatModuleService = ARouter.getInstance().navigation(IChatModuleService.class);
if (chatModuleService != null) {
return chatModuleService.getUserName(userId);
}
return "";
}
}
- 模块间服务调用(普通调用)
//模块间服务调用 //例如home模块调用chat模块的方法 String userName = ModuleRouteService.getUserName("userId"); UIUtils.showToast(userName);
- 模块间通过路径名称调用服务
//模块间通过路径名称调用服务
String userName = ((IChatModuleService) ARouter.getInstance()
.build(RouteUtils.Service_Chat)
.navigation())
.getUserName("userid");
UIUtils.showToast(userName);
- 模块间通过类名调用服务
//模块间通过类名调用服务 String userName = ARouter.getInstance() .navigation(IChatModuleService.class) .getUserName("userid"); UIUtils.showToast(userName);
//跳转失败
ARouter.getInstance().build("/xxx/xxx").navigation(getContext(), new NavCallback() {
@Override
public void onFound(Postcard postcard) {
UIUtils.showToast("找到了");
}
@Override
public void onLost(Postcard postcard) {
UIUtils.showToast("找不到了");
}
@Override
public void onArrival(Postcard postcard) {
UIUtils.showToast("跳转完了");
}
@Override
public void onInterrupt(Postcard postcard) {
UIUtils.showToast("被拦截了");
}
});
因为/xxx/xxx这个路径没有对应的activity或fragment所以会跳转失败,走onLost方法。
需要详细的介绍或者混淆等操作请看:http://download.csdn.net/download/huangxiaoguo1/10151401
我的博客地址:http://blog.csdn.net/huangxiaoguo1/article/details/78753555