上一篇文章我們談到了如何實現一個路由庫,那本篇文章就給大家推薦一個好用的路由庫,來確認下眼神,這就是你要的路由庫。
EasyRouter:一個簡單、穩定、強大、高效能的元件化路由框架。github地址:https://github.com/liuzhao2007/EasyRouter。
歡迎使用、star、fork、pr。
一、功能特性
-
通過url開啟Activity,實現介面間解耦;
-
通過服務實現方法呼叫,實現Module間方法呼叫解耦;
-
通過攔截器實現介面跳轉的處理:條件攔截、埋點統計等;
-
介面、服務、攔截器均支援多Module;
-
基於編譯時註解,介面、服務、攔截器等均可自動註冊;
-
可傳遞Bundle支援的所有資料型別;
-
支援自動注入引數到目標介面;
-
支援獲取Fragment;
-
支援全域性、區域性過程監聽:降級、開啟後等;
-
Api簡單、實現高效能;
二、應用場景
-
Module內、跨Module介面跳轉,介面解耦;
-
介面跳轉過程攔截:條件攔截(eg:未登入)、重定向等;
-
跨Module方法呼叫,Module間解耦;
-
外部Url跳轉應用內介面;
三、整合使用
1. 新增依賴與配置
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" }
}
}
複製程式碼
2、初始化
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);
複製程式碼
3、新增註解
- 在app裡任意一個類中新增註解@DispatcherModules,裡面寫上所有使用此框架的Module的name;
例如:@DispatcherModules({"app","moduleinteract"});
複製程式碼
- 在任意需要路由開啟的Activity加上註解@DisPatcher,裡面寫上其對應的url;
@DisPatcher({"easyrouter://main", "easyrouter://maintwo"})
public class MainActivity extends Activity
複製程式碼
4、發起路由
1. EasyRouter.open("easyrouter://main");//方式一
2. EasyRouter.with("easyrouter://main").open();//方式二
複製程式碼
四、進階使用
1、傳遞引數
- 不通過url傳參;
EasyRouter.with("easyrouter://main").withString("stringparams","")// 傳遞基本資料型別;
.withParcelable("parcelable",null)// 傳遞系列化物件;
.withFlags(Intent.FLAG_ACTIVITY_NEW_TASK)// 設定Flag;
.withTransition(0,0)// 設定動畫;
.open(Activity,requestCode);// 設定RequestCode
複製程式碼
- 通過url傳參:非必須引數;
EasyRouter.open("easyrouter://main?name=liuzhao&sex=man");
這樣傳遞了兩個引數:name與sex;在目標Activity中可以通過getIntent.getString("name")方式來獲取;
複製程式碼
- 通過url傳參:必須引數;
註解宣告:
@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傳參兩種方式可搭配使用。
2、Module間通訊(方法呼叫)
配置稍微複雜,但使用極其簡單;可參考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);
複製程式碼
備註:配置複雜帶來的優勢是方法的直接呼叫,無需強轉也不限定呼叫方法的方法簽名;
3、攔截器
-
實現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方法中進行攔截與否的判斷,例如登入態、重定向等;
4、過程監聽
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();
複製程式碼
5、獲取Fragment;
// 傳入Fragment繼承的類,android.app.Fragment或者android.support.v4.app.Fragment
Fragment fragment = EasyRouter.with("easyrouter://fragmenttest").getFragment(Fragment.class);
複製程式碼
6、外部Url跳轉應用內介面;
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());即可
7、自動注入引數到介面;
-
在目標Activity中加上EasyRouter.inject(this);
-
在Activity中需要自動傳參的引數上加上註解@AutoAssign,則會自動通過Intent賦值。例如:
@AutoAssign
long time;
@AutoAssign
int age;
@AutoAssign
String url;
複製程式碼
備註:自動注入引數功能目前僅支援基本資料型別和String;
廣告時間
今日頭條各Android客戶端團隊招人火爆進行中,各個級別和應屆實習生都需要,業務增長快、日活高、挑戰大、待遇給力,各位大佬走過路過千萬不要錯過!
本科以上學歷、非頻繁跳槽(如兩年兩跳),歡迎加我的微信詳聊:KOBE8242011