確認過眼神,這就是你要的路由庫

Bacer發表於2021-09-09

上一篇文章我們談到了如何實現一個路由庫,那本篇文章就給大家推薦一個好用的路由庫,來確認下眼神,這就是你要的路由庫。

EasyRouter:一個簡單、穩定、強大、高效能的元件化路由框架。github地址:https://github.com/liuzhao2007/EasyRouter

歡迎使用、star、fork、pr。

確認過眼神,這就是你要的路由庫

一、功能特性

  1. 通過url開啟Activity,實現介面間解耦;

  2. 通過服務實現方法呼叫,實現Module間方法呼叫解耦;

  3. 通過攔截器實現介面跳轉的處理:條件攔截、埋點統計等;

  4. 介面、服務、攔截器均支援多Module;

  5. 基於編譯時註解,介面、服務、攔截器等均可自動註冊;

  6. 可傳遞Bundle支援的所有資料型別;

  7. 支援自動注入引數到目標介面;

  8. 支援獲取Fragment;

  9. 支援全域性、區域性過程監聽:降級、開啟後等;

  10. Api簡單、實現高效能;

確認過眼神,這就是你要的路由庫

二、應用場景

  1. Module內、跨Module介面跳轉,介面解耦;

  2. 介面跳轉過程攔截:條件攔截(eg:未登入)、重定向等;

  3. 跨Module方法呼叫,Module間解耦;

  4. 外部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、新增註解

  1. 在app裡任意一個類中新增註解@DispatcherModules,裡面寫上所有使用此框架的Module的name;
    例如:@DispatcherModules({"app","moduleinteract"});
複製程式碼
  1. 在任意需要路由開啟的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。

  1. 在專案的Library中建立繼承IBaseModuleService的介面檔案com.android.easyrouter.service.BaseModuleService;(包名、類名及繼承關係不可變)

  2. 各Module需要向外提供的方法在BaseModuleService中新建介面類並暴露介面;

  public interface ModuleInteractService extends BaseModuleService {
      void runModuleInteract(Context context);
  }
複製程式碼
  1. 在Module中建立Module的介面實現類,類名需要和介面名一樣;

  2. 打上註解@ModuleService、並編譯;

  3. 在別的Module中直接以方法呼叫;

  EasyRouter.getModuleService(BaseModuleService.ModuleInteractService.class).runModuleInteract(context);
複製程式碼

備註:配置複雜帶來的優勢是方法的直接呼叫,無需強轉也不限定呼叫方法的方法簽名;

3、攔截器

  1. 實現IInterceptor介面;

  2. 打上註解@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

歡迎關注

相關文章