Tutorial Base - SharryChoo/SRouter GitHub Wiki

基础使用

一) 初始化

SRouter 的初始化操作通过 SRouter.init() 方法执行, 推荐在 BaseApplication 的 onCreate 中进行

public class BaseApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 在 BaseApplication 中调用 init 方法执行初始化操作
        SRouter.init(this);
    }
}

二) 模块的装载与卸载

SRouter 根据模块的唯一标识进行装载与卸载, 如下所示

// 装载想要使用的 Module
SRouter.registerModules(xxx, ...);
// 卸载要使用的 Module
SRouter.unregisterModules(xxx, ...);

请确保传入的模块标识与 module 中 build.gradle 中声明的描述一致

三) 声明寻址目标

SRouter 通过 @Route 注解声明一个 Class 为一个路由目标地址, 其可作用的 class 如下

  • Activity
  • Fragment/Fragment(androidx)/Fragment(v4)
  • IService: 用于自己实现目标的服务逻辑
@Route( 
        authority = ModuleConstants.Personal.NAME,
        path = ModuleConstants.Personal.PERSONAL_ACTIVITY,
        desc = "路由描述"
)
class PersonalActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.personal_activity_personal)
    }

}
  • authority: 路由作用页面的所属的模块, 不必与当前类所在的 module 名一致, 用于渐进式组件分割
  • path: 对应的路径

请确保 authority 与 path 的组合是唯一的

四) 寻址发起

1. 普通寻址

SRouter.request(ModuleConstants.Personal.NAME, ModuleConstants.Personal.PERSONAL_ACTIVITY)
        // 设置 Activity 转场动画
        .setActivityOptions(ActivityOptionsCompat.makeBasic())
        // 跳转参数
        .withString("key", "value")
        // 跳转时延
        .setDelay(1000)
        // 执行跳转操作
        .navigation(this)

2. URL 寻址

val url = "{Custom u scheme}://found/found_fragment?title=HelloWorld&amount=12.34"
SRouter.request(url)
        ......
        .navigation(this)

url 跳转即 request 构造时不同, 其他使用方式一致

3. 模板方法寻址

SRouter 可通过 @RouteMethod 注解声明一个方法为寻址入口

public interface RouteApi {

    /**
     * @param context 若无 context 参数, 会使用 application context 跳转
     */
    @RouteMethod(
            authority = ModuleConstants.Personal.NAME,
            path = ModuleConstants.Personal.PERSONAL_ACTIVITY,
    )
    ICall personalCenter(
            Context context,
            @QueryParam(key = "content") String content,
            @RequestCode int requestCode,
            @Flags int flags
    );

}

实例化模板方法

 val routeApi = SRouter.createApi(RouteApi::class.java)

使用接口进行路由寻址

val cancelable: ICancelable = routeApi.personalCenter(this).call()

使用方式与 Retrofit 的模板接口类似, 使用这种方式可以更快捷、更精准的进行寻址操作

4. 中断寻址

如果你想控制路由跳转的时机, 以及中途取消等操作, 可以使用以下方式

// 获取可跳转的 ICall 对象
val call:ICall = SRouter.request(ModuleConstants.Personal.NAME, ModuleConstants.Personal.PERSONAL_ACTIVITY)
        .setActivityOptions(ActivityOptionsCompat.makeBasic())
        .newCall(this)

// 自定义跳转时机
val cancelable: ICancelable = call.post(object : IInterceptor.ChainCallback {
        override fun onSuccess(response: Response) {
            // 寻址成功, 获取 Response
        }

        override fun onFailed(throwable: Throwable?) {
            // 寻址失败
        }

        override fun onCanceled() {
            // 寻址被中途取消了
        }
    })
// 自定义取消时机
cancelable.cancel()

调用 ICall.call() 方法可以获取到一个 ICancelable 对象, 通过 ICancelable.cancel() 可以在路由寻址过程中执行中断操作