android 模块通信和Scheme的配套使用

今天聊聊android的跨模块通信 对之前写的跨模块通信做简化

https://blog.csdn.net/lixiaoshuai_91/article/details/86526848 

在之前的博客里面我聊到了模块间通信的一种机制,利用interface事件回调进行模块间通信

由于其实现起来代码量比较多,今天在这里做一个简化

首先我们讲述下需要的准备工作,

1.需要跳转的Activity注册Scheme协议

<activity android:name="com.ansier.moduleb.ModuleBActivity">
    <intent-filter>
        <data
            android:host="scheme"
            android:path="/moduleBActivity"
            android:scheme="lishuai"/>
        <!--下面这几行也必须得设置-->
        <category android:name="android.intent.category.DEFAULT"/>
        <action android:name="android.intent.action.VIEW"/>
        <category android:name="android.intent.category.BROWSABLE"/>
    </intent-filter>
</activity>

2.在根目录模块下创建一个接口

public interface SendDataCanback {

    void sendData(String dataBean);

}

3.在根目录模块创建一个管理接口的工具方法,用来管理页面跳转和interface

/**
 * 接口管理类
 */
public class CanBackManage {

    public static final String TAG_NAME = "TAG";

    private static CanBackManage canBackManage;
    private HashMap<String, Object> hashMap = new HashMap<>();

    public static CanBackManage getInstance() {
        if (null == canBackManage) {
            canBackManage = new CanBackManage();
        }
        return canBackManage;
    }

    /**
     * 暴获取接口
     *
     * @param key
     * @return
     */
    public SendDataCanback getInterface(String key) {
        if (hashMap.containsKey(key)) {
            return (SendDataCanback) hashMap.get(key);
        } else {
            return null;
        }
    }

    /**
     * 存储接口
     *
     * @param key
     * @param valeu
     */
    public boolean setInterface(String key, Object valeu) {
        hashMap.put(key, valeu);
        return hashMap.containsKey(key);
    }

    /**
     * 删除接口
     *
     * @param key
     */
    public void remakeInterface(String key) {
        hashMap.remove(key);
    }

    /**
     * 用来跳转的工具类
     * @param retUrl
     * @param context
     * @param sendDataCanback
     */
    public void startToActivity(String retUrl, Activity context, SendDataCanback sendDataCanback) {
        setInterface(context.toString(), sendDataCanback);
        Intent action = new Intent(Intent.ACTION_VIEW);
        action.setData(Uri.parse(retUrl));
        context.startActivityForResult(action,11);
    }


}

接下来讲述下跨模块Activity跳转,之前还说用的原生的startActivity,这期我们替换为Scheme跳转,这样我们就不用在App层做中间转换操作了

在使用Scheme跳转的时候我们实现一个根目录模块下的interface(用来回调参数) 

String retUrl = Uri.parse("").buildUpon()
            .scheme("lishuai")
            .authority("scheme")
            .path("moduleNextActivity")
            .appendQueryParameter(CanBackManage.TAG_NAME, MainActivity.this.toString())
            .build().toString();
    CanBackManage.getInstance().startToActivity(retUrl, MainActivity.this, new SendDataCanback() {
        @Override
        public void sendData(String dataBean) {
            //这个数据你可以随意定义,这里建议传Json串,这样和H5和ReactNative交互没有局限   }
    });
}

在需要返回参数的页面我们获取Map里面存储的interface

Uri data = getIntent().getData();
final String canBack1 = data.getQueryParameter(CanBackManage.TAG_NAME);//这只是一个标记

//用这个标记取出interface

CanBackManage.getInstance().getInterface(canBack1).sendData(sendDataBean.toJson);

通过以上操作就完成了所有数据回参数的统一

 

因为我们要和ReactNative/H5 交互比较多,原生提供的工具也比较多,所以研究出这么一条交互逻辑

希望对大家有所帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值