继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

阿里ARouter路由实现模块化开发流程(五)

晓果
关注TA
已关注
手记 13
粉丝 50
获赞 188

使用阿里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.
 * <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

打开App,阅读手记
3人推荐
发表评论
随时随地看视频慕课网APP