Skip to content

支持多工程项目&混合工程

Wiki edited this page Sep 8, 2019 · 1 revision

支持多工程项目&混合工程

当工程的业务较多,可能会出现一个项目是由多个工程组成,每个工程可能是由不同的团队负责,分别是由不同的仓库管理,在这种情况,我们如何做到数据交换,页面跳转呢,通过GRouter就可以很轻松地实现工程之间的页面跳转,服务调用。

  1. 通过RouterActivity实现通过URL跳转页面。
  2. 通过RouterTask实现工程之间的服务调用。
  3. 一般性建议不同的工程都使用相同的scheme,如果不同的团队之间的隔离较大,建议不同的工程使用不同的scheme。
  4. 两个工程之间通过Gradle maven的方式引入依赖到主工程。
A 工程修改 gradle.properties
# --- 基本参数 ---
# 必填,填写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
B 工程修改 gradle.properties
# --- 基本参数 ---
# 必填,填写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_MODEtrue,并且为每一个工程配置独特的 GROUTER_MULTI_PROJECT_NAME

在主工程的 MyApplication.create 进行配置
GRouter.getInstance().registerMultiProject(WaimaiRouterInitializer())
GRouter.getInstance().registerMultiProject(MovieRouterInitializer())
在 A 工程使用自动构造器
MovieActivityCenter.MovieDetailActivity().start(context)
MovieComponentCenter.MovieServiceImpl()
MovieDelegateCenter.MovieService()
MovieTaskCenter.GetMovieTask()
在 B 工程使用自动构造器
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。

Flutter

创建插件类

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);
  	}
  }

Hybrid H5

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>