介紹
AnnoRouter是一個用於協助Android元件化的路由框架。它參考了Retrofit的介面設計,將路由跳轉API轉化為Java介面,使用註解來配置跳轉資訊。
Usage
初始化全域性Router
Router.Builder builder = new Router.Builder()
.application(this)
...
Router.init(builder);
複製程式碼
攔截過濾url
new Router.Builder()
.routerUrlFilter(new IRouterUrlFilter() {
@Override
public String filter(String url) {
...
return url;
}
})
...
複製程式碼
異常錯誤處理
new Router.Builder()
.exceptionHandler(new IExceptionHandler() {
@Override
public void handler(String url, Exception e) {
}
})
...
複製程式碼
定義路由Api
使用 @RouterScheme
, @RouterHost
, @Path
及 @Param
來定義一個路由地址。
@RouterScheme("scheme")
@RouterHost("host")
public interface RouterApi {
@Path("path")
...
void jump(@Param("paramName") int paramValue);
}
public interface RouterApi {
@RouterScheme("scheme")
@RouterHost("host")
@Path("path")
...
void jump(@Param("paramName") int paramValue);
}
複製程式碼
有時候,存在 scheme://host/path
相同但引數不一樣的路由地址,就需要使用註解 @Strict
來作區別。
e.g.
@RouterScheme("scheme")
@RouterHost("host")
public interface RouterApi {
@Path("path")
...
void jumpToActivity1(@Param("param1") String param1);
@Strict
@Path("path")
...
void jumpToActivity2(@Param("param1") String param1, @Param("param2") int param2);
}
複製程式碼
scheme://host/path?param1=a
將會匹配上方法jumpToActivity1
scheme://host/path?param1=a¶m2=1
將會匹配上方法jumpToActivity2
scheme://host/path?param1=a¶m2=1¶m3=1
將會匹配上方法jumpToActivity1
, 但param2=1¶m3=1
會被忽略掉。
處理前置校驗或準備任務
public interface RouterApi {
@Task(CustomRouterTask.class)
...
void jumpToActivity();
}
// ----------------
public class CustomRouterTask implements IRouterTask {
@Override
public void execute(Context context, RouterInfo routerInfo, OnTaskResult onTaskResult) {
// do something...
onTaskResult.success();
}
}
複製程式碼
跳轉到Activity或自定義處理
public interface RouterApi {
...
@Activity(LoginActivity.class)
void jumpToLogin();
...
@RouterHandler(CustomRouterHandler.class)
void jumpToLogin();
}
// ----------------
public class CustomRouterHandler implements IRouterHandler {
@Override
public void applyRouter(Context context, RouterInfo routerInfo, OnRouterResult routerResult) {
// do what you want to do.
if(routerResult != null) {
routerResult.onSuccess();
}
}
}
複製程式碼
自定義Activity轉場動畫
public interface RouterApi {
...
@Transition(CustomeTransition.class)
void jumpToLogin();
}
// ----------------
public class CustomeTransition implements IActivityTransition {
@Override
public int enterAnim() {
return R.anim.fade_in;
}
@Override
public int exitAnim() {
return R.anim.fade_out;
}
}
複製程式碼
設定Activity launchMode
public interface RouterApi {
...
@Flags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
void jump(@Flags int flags);
...
void jump(@Flags int flags);
}
// ----------------
Router.create(RouterApi.class).jump(Intent.FLAG_ACTIVITY_CLEAR_TOP);
複製程式碼
新增路由Api
需要將定義好的路由Api新增至Router
。如果只通過介面而不通過url跳轉,可以不新增。
Router.addRouterIndex(RouterApi.class);
複製程式碼
自定義協議處理
主要處理一些特殊url協議,比如 http
, https
public class HttpSchemeHandler implements ISchemeHandler {
@Override
public void applyRouter(Context context, String url, OnRouterResult routerResult) {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
Uri content_url = Uri.parse(url);
intent.setData(content_url);
context.startActivity(intent);
if(routerResult != null) {
routerResult.onSuccess();
}
}
}
// ----------------
HttpSchemeHandler httpSchemeHandler = new HttpSchemeHandler();
Router.addSchemeHandler("https", httpSchemeHandler);
Router.addSchemeHandler("http", httpSchemeHandler);
複製程式碼
使用路由Api進行跳轉
兩種跳轉呼叫方式:介面跳轉,url跳轉。
// The Router class generates an implementation of the RouterApi interface.
RouterApi routerApi = Router.create(RouterApi .class);
routerApi.jump("value");
// or use url instead.
Router.execute("scheme://host/path?param=value");
複製程式碼
獲取Activity Result
@RouterScheme("app")
@RouterHost("usercenter")
public interface LoginRouterApi {
@Path("login")
@Activity(LoginActivity.class)
@RequestCode(1001)
void jumpToLogin(@Param("mobile") String mobile);
@Activity(LoginActivity.class)
@RequestCode(1001)
void jumpToLogin(@Param("mobile") String mobile, OnActivityResult onActivityResult);
}
// ----------------
OnActivityResult onActivityResult = new OnActivityResult() {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
}
@Override
public void onSuccess() {
}
@Override
public void onFailure(Exception e) {
}
};
Router.execute("app://usercenter/login?mobile=0123456789", onActivityResult);
// or
Router.create(LoginRouterApi.class).jumpToLogin("0123456789", onActivityResult);
複製程式碼
Get it
AnnoAdapter is now available on JCentral.
implementation 'com.eastwood.common:anno-router:1.0.2'
複製程式碼
結語
AnnoRouter已上傳Github,歡迎Star交流 github.com/EastWoodYan…