-
Notifications
You must be signed in to change notification settings - Fork 67
支持多工程项目&混合工程
Wiki edited this page Sep 8, 2019
·
1 revision
当工程的业务较多,可能会出现一个项目是由多个工程组成,每个工程可能是由不同的团队负责,分别是由不同的仓库管理,在这种情况,我们如何做到数据交换,页面跳转呢,通过GRouter就可以很轻松地实现工程之间的页面跳转,服务调用。
- 通过RouterActivity实现通过URL跳转页面。
- 通过RouterTask实现工程之间的服务调用。
- 一般性建议不同的工程都使用相同的scheme,如果不同的团队之间的隔离较大,建议不同的工程使用不同的scheme。
- 两个工程之间通过Gradle maven的方式引入依赖到主工程。
# --- 基本参数 ---
# 必填,填写BaseModule的源代码目录
GROUTER_SOURCE_PATH=app/src/main/java
# 选填,用于外部APP(或浏览器)打开内部页面,如果无需该功能可以不填写
GROUTER_SCHEME=grouter_movice
# 选填,默认false,如果开启AndroidX模式,将会使用androidx.fragment代替support-v4
GROUTER_ANDROIDX=false
# --- 多工程模式 ---
# 选填,多工程模式开关
GROUTER_MULTI_PROJECT_MODE=true
# 选填,多工程模式生成,如果APP是多工程模式,为每一个工程配置独立的名称,同时需要手工在Application配置
GROUTER_MULTI_PROJECT_NAME=Movie
# --- 基本参数 ---
# 必填,填写BaseModule的源代码目录
GROUTER_SOURCE_PATH=app/src/main/java
# 选填,用于外部APP(或浏览器)打开内部页面,如果无需该功能可以不填写
GROUTER_SCHEME=grouter_waimai
# 选填,默认false,如果开启AndroidX模式,将会使用androidx.fragment代替support-v4
GROUTER_ANDROIDX=false
# --- 多工程模式 ---
# 选填,多工程模式开关
GROUTER_MULTI_PROJECT_MODE=true
# 选填,多工程模式生成,如果APP是多工程模式,为每一个工程配置独立的名称,同时需要手工在Application配置
GROUTER_MULTI_PROJECT_NAME=Waimai
需要设置 GROUTER_MULTI_PROJECT_MODE
为 true
,并且为每一个工程配置独特的 GROUTER_MULTI_PROJECT_NAME
GRouter.getInstance().registerMultiProject(WaimaiRouterInitializer())
GRouter.getInstance().registerMultiProject(MovieRouterInitializer())
MovieActivityCenter.MovieDetailActivity().start(context)
MovieComponentCenter.MovieServiceImpl()
MovieDelegateCenter.MovieService()
MovieTaskCenter.GetMovieTask()
WaimaiActivityCenter.MovieDetailActivity().start(context)
WaimaiComponentCenter.MovieServiceImpl()
WaimaiDelegateCenter.MovieService()
WaimaiTaskCenter.GetMovieTask()
如果使用了不同的scheme的项目,就需要传入scheme
GRouter.getInstance().activityBuilder("movie","movieDetail").start(context)
GRouter.getInstance().taskBuilder("movie","getMovie").put("mid",1).execute()
由于GRouter支持通过URL启动页面,调用服务,所以非常方便和其他的混合开发的工程进行结合,比如Flutter和Hybrid H5。
创建插件类
class GRouterFlutterPlugin(val activity: Activity) : MethodChannel.MethodCallHandler {
fun onMethodCall(methodCall: MethodCall, result: MethodChannel.Result) {
if (methodCall.method.equals("startPage")) {
val url = methodCall.argument("url")
GRouter.getInstance().startActivity(this.activity, url)
}
else if (methodCall.method.equals("executeTask")) {
val url = methodCall.argument("url")
val response = GRouter.getInstance().getTask(url).execute()
if (response.isError){
result.error(response.exception.message,null,null)
}else{
result.success(response.string());
}
}
}
companion object {
fun registerWith(registry: PluginRegistry) {
val CHANNEL = "com.gourer/plugin"
val registrar = registry.registrarFor(CHANNEL)
val methodChannel = MethodChannel(registrar.messenger(), CHANNEL)
val plugin = GRouterFlutterPlugin(registrar.activity())
methodChannel.setMethodCallHandler(plugin)
}
}
}
在Activity中注册
class MainActivity : FlutterActivity() {
override fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
GRouterFlutterPlugin.registerWith(this)
}
}
在Flutter中打开原生Activity
static const grouterPlugin = const MethodChannel('com.gourer/plugin');
grouterPlugin.invokeMethod("startPage", {"url": "grouterdemo://activity/user?uid=1"})
在Flutter中调用服务交互数据
static const grouterPlugin = const MethodChannel('com.gourer/plugin');
void getUser() async {
Map<String, Object> map = {"url": "grouter://task/getUser?uid=1"};
try {
String result = await grouterPlugin.invokeMethod("executeTask", map);
print(result);
} on PlatformException catch (e) {
print(e.message);
}
}
class WebViewActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_web_view)
web_view.settings.javaScriptEnabled = true
web_view.addJavascriptInterface(GRouterJavascriptInterface(this), "grouter")
web_view.webChromeClient = WebChromeClient()
web_view.loadUrl("file:///android_asset/grouter_example.html")
}
}
Javascript
<script>
function navPage(){
window.grouter.startPage("grouter://activity/user?name=Wiki&uid=1")
}
function executeTask(){
var user = window.grouter.executeTask("grouter://task/getUser?name=Wiki&uid=1")
alert(user)
}
</script>