今天聊聊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 交互比较多,原生提供的工具也比较多,所以研究出这么一条交互逻辑
希望对大家有所帮助