接入
Gradle配置
在基础库中增加依赖(1.x为版本号)。
repositories {
jcenter()
}
dependencies {
compile 'com.sankuai.waimai.router:router:1.x'
}
在使用了注解的每个模块中配置注解生成器,包括Application和Library工程。
repositories {
jcenter()
}
dependencies {
annotationProcessor 'com.sankuai.waimai.router:compiler:1.x'
}
在Application工程中,配置Gradle插件。
根目录的
build.gradle
:buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
// 添加WMRouter插件
classpath "com.sankuai.waimai.router:plugin:1.x"
}
}
Application模块中的
build.gradle
:apply plugin: 'com.android.application'
// 应用WMRouter插件
apply plugin: 'WMRouter'
Proguard配置。
WMRouter已经内置的Proguard配置如下(详见源码
router/proguard-rules.pro
),使用AAR依赖时一般不需要重复配置。# 保留ServiceLoaderInit类,需要反射调用
-keep class com.sankuai.waimai.router.generated.ServiceLoaderInit { *; }
# 避免注解在shrink阶段就被移除,导致obfuscate阶段注解失效、实现类仍然被混淆
-keep @interface com.sankuai.waimai.router.annotation.RouterService
如果使用了
@RouterService
注解和ServiceLoader加载实例的功能,会反射调用构造方法,应根据实际情况配置Proguard,避免实现类中的构造方法被移除,示例如下。# 使用了RouterService注解的实现类,需要避免Proguard把构造方法、方法等成员移除(shrink)或混淆(obfuscate),导致无法反射调用。实现类的类名可以混淆。
-keepclassmembers @com.sankuai.waimai.router.annotation.RouterService class * { *; }
初始化
在Application.onCreate
中初始化:
// 创建RootHandler
DefaultRootUriHandler rootHandler = new DefaultRootUriHandler(context);
// 初始化
Router.init(rootHandler);
Manifest与外部跳转配置
跳转的目标Activity不需要配置IntentFilter,也不需要配置exported。
<activity name = ".AccountActivity" />
所有的外部URI跳转建议由一个中转Activity接收,再调用Router跳转到目标页面。由于跳转过程中可能会触发定位、登录等各种异步逻辑,因此中转Activity应该有界面,并监听在跳转结束后关闭Activity。
<activity android:name=".UriProxyActivity" android:exported="true">
<intent-filter>
<!-- 接收所有scheme为demo的外部URI跳转,不区分host和path -->
<data android:scheme="demo"/>
</intent-filter>
</activity>
public class UriProxyActivity extends BaseActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
DefaultUriRequest.startFromProxyActivity(this, new OnCompleteListener() {
@Override
public void onSuccess(@NonNull UriRequest request) {
finish();
}
@Override
public void onError(@NonNull UriRequest request, int resultCode) {
finish();
}
});
}
}
其他可选配置
请参考后文“高级配置”中的说明。