上一篇文章咱們談到了如何實現一個路由庫,那本篇文章就給你們推薦一個好用的路由庫,來確認下眼神,這就是你要的路由庫。java
EasyRouter:一個簡單、穩定、強大、高性能的組件化路由框架。github地址:https://github.com/liuzhao2007/EasyRouter。android
歡迎使用、star、fork、pr。git
經過url打開Activity,實現界面間解耦;github
經過服務實現方法調用,實現Module間方法調用解耦;api
經過攔截器實現界面跳轉的處理:條件攔截、埋點統計等;bash
界面、服務、攔截器均支持多Module;微信
基於編譯時註解,界面、服務、攔截器等都可自動註冊;app
可傳遞Bundle支持的全部數據類型;框架
支持自動注入參數到目標界面;maven
支持獲取Fragment;
支持全局、局部過程監聽:降級、打開後等;
Api簡單、實現高性能;
Module內、跨Module界面跳轉,界面解耦;
界面跳轉過程攔截:條件攔截(eg:未登陸)、重定向等;
跨Module方法調用,Module間解耦;
外部Url跳轉應用內界面;
android {
defaultConfig {
javaCompileOptions {
annotationProcessorOptions {
arguments = [ moduleName : project.getName() ]
}
}
}
}
dependencies {
compile 'com.easyrouter:router-api:1.2.3'
compile 'com.easyrouter:router-annotation:1.2.3'
annotationProcessor 'com.easyrouter:router-compiler:1.2.3'
}
複製代碼
在Project級別的build.gradle中添加:
allprojects {
repositories {
jcenter()
maven { url "https://dl.bintray.com/liuzhaowy2007/maven" }
}
}
複製代碼
EasyRouterConfig.getInstance().setScheme()必調,別的設置選調;
EasyRouterConfig.getInstance()
.setDebug(true)
.setScheme("easyrouter")
.setDefaultRouterCallBack(new IRouterCallBack() {
@Override
public void onFound() {
LogUtil.i("default onFound");
}
@Override
public void onLost() {
LogUtil.i("default onLost");
}
@Override
public void onOpenSuccess() {
LogUtil.i("default onOpenSuccess");
}
@Override
public void onOpenFailed() {
LogUtil.i("default onOpenFailed");
}
})
.init(EasyRouterApp.this);
複製代碼
例如:@DispatcherModules({"app","moduleinteract"});
複製代碼
@DisPatcher({"easyrouter://main", "easyrouter://maintwo"})
public class MainActivity extends Activity
複製代碼
1. EasyRouter.open("easyrouter://main");//方式一
2. EasyRouter.with("easyrouter://main").open();//方式二
複製代碼
EasyRouter.with("easyrouter://main").withString("stringparams","")// 傳遞基本數據類型;
.withParcelable("parcelable",null)// 傳遞系列化對象;
.withFlags(Intent.FLAG_ACTIVITY_NEW_TASK)// 設置Flag;
.withTransition(0,0)// 設置動畫;
.open(Activity,requestCode);// 設置RequestCode
複製代碼
EasyRouter.open("easyrouter://main?name=liuzhao&sex=man");
這樣傳遞了兩個參數:name與sex;在目標Activity中能夠經過getIntent.getString("name")方式來獲取;
複製代碼
註解聲明:
@DisPatcher({"easyrouter://main/i:tab"}) // 註解聲明須要一個必備參數tab,而且聲明其類型爲int;
public class MainActivity extends Activity
調用:
EasyRouter.open("easyrouter://main/3");
這樣傳遞了一個參數:tab;在目標Activity中能夠經過getIntent.getInt("tab",0)方式來獲取;
複製代碼
備註:必須參數與非必須參數可搭配使用,區別在於必須參數參與url匹配過程;經過url傳參與不經過url傳參兩種方式可搭配使用。
配置稍微複雜,但使用極其簡單;可參考modulelib中的BaseModuleService。
在項目的Library中建立繼承IBaseModuleService的接口文件com.android.easyrouter.service.BaseModuleService;(包名、類名及繼承關係不可變)
各Module須要向外提供的方法在BaseModuleService中新建接口類並暴露接口;
public interface ModuleInteractService extends BaseModuleService {
void runModuleInteract(Context context);
}
複製代碼
在Module中建立Module的接口實現類,類名須要和接口名同樣;
打上註解@ModuleService、並編譯;
在別的Module中直接以方法調用;
EasyRouter.getModuleService(BaseModuleService.ModuleInteractService.class).runModuleInteract(context);
複製代碼
備註:配置複雜帶來的優點是方法的直接調用,無需強轉也不限定調用方法的方法簽名;
實現IInterceptor接口;
打上註解@Interceptor;
@Interceptor
public class RouterTestInterceptor implements IInterceptor{
@Override
public boolean intercept() {
LogUtil.i("intercept by me");
return true;// if true intercept; false go on;
}
@Override
public void onIntercepted() {
}
}
複製代碼
備註:在intercept方法中進行攔截與否的判斷,例如登陸態、重定向等;
EasyRouter.open("easyrouter://routertest",new IRouterCallBack(){
@Override
public void onFound() {
//匹配到
}
@Override
public void onLost() {
//匹配不到,可作降級;
}
@Override
public void onOpenSuccess() {
//界面打開成功
}
@Override
public void onOpenFailed() {
//界面打開失敗,可作降級;
}
});
複製代碼
備註:能夠對每一次路由作監聽,也能夠設置全局默認的監聽;
EasyRouter.init(EasyRouterApp.this).setScheme("easyrouter").setDefaultRouterCallBack();
複製代碼
// 傳入Fragment繼承的類,android.app.Fragment或者android.support.v4.app.Fragment
Fragment fragment = EasyRouter.with("easyrouter://fragmenttest").getFragment(Fragment.class);
複製代碼
AndroidManifest.xml中註冊
<activity
android:name="com.android.easyrouter.url.EasyRouterUrlActivity"
android:theme="@android:style/Theme.Translucent.NoTitleBar">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="easyrouter" /><!--改爲本身的Scheme-->
</intent-filter>
</activity>
複製代碼
備註:也可使用本身的Activity:
只須要調用EasyRouter.open(Uri.toString());便可
在目標Activity中加上EasyRouter.inject(this);
在Activity中須要自動傳參的參數上加上註解@AutoAssign,則會自動經過Intent賦值。例如:
@AutoAssign
long time;
@AutoAssign
int age;
@AutoAssign
String url;
複製代碼
備註:自動注入參數功能目前僅支持基本數據類型和String;
今日頭條各Android客戶端團隊招人火爆進行中,各個級別和應屆實習生都須要,業務增加快、日活高、挑戰大、待遇給力,各位大佬走過路過千萬不要錯過!
本科以上學歷、非頻繁跳槽(如兩年兩跳),歡迎加個人微信詳聊:KOBE8242011