arouter跨module传递消息_阿里ARouter路由实现模块化开发流程(五)

模块间服务调用

首先,为了所有子类模块都能共享这个方法,我们在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.

*

* 服务的发现

*/

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方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值