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

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

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

歡迎使用、star、fork、pr。git

1、功能特性

  1. 經過url打開Activity,實現界面間解耦;github

  2. 經過服務實現方法調用,實現Module間方法調用解耦;api

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

  4. 界面、服務、攔截器均支持多Module;微信

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

  6. 可傳遞Bundle支持的全部數據類型;框架

  7. 支持自動注入參數到目標界面;maven

  8. 支持獲取Fragment;

  9. 支持全局、局部過程監聽:降級、打開後等;

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

2、應用場景

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

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

  3. 跨Module方法調用,Module間解耦;

  4. 外部Url跳轉應用內界面;

3、集成使用

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" }
        }
    }
複製代碼

二、初始化

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);
複製代碼

三、添加註解

  1. 在app裏任意一個類中添加註解@DispatcherModules,裏面寫上全部使用此框架的Module的name;
例如:@DispatcherModules({"app","moduleinteract"});
複製代碼
  1. 在任意須要路由打開的Activity加上註解@DisPatcher,裏面寫上其對應的url;
@DisPatcher({"easyrouter://main", "easyrouter://maintwo"})
    public class MainActivity extends Activity
複製代碼

四、發起路由

1. EasyRouter.open("easyrouter://main");//方式一
    2. EasyRouter.with("easyrouter://main").open();//方式二
複製代碼

4、進階使用

一、傳遞參數

  • 不經過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傳參兩種方式可搭配使用。

二、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);
複製代碼

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

三、攔截器

  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方法中進行攔截與否的判斷,例如登陸態、重定向等;

四、過程監聽

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;

// 傳入Fragment繼承的類,android.app.Fragment或者android.support.v4.app.Fragment
    Fragment fragment = EasyRouter.with("easyrouter://fragmenttest").getFragment(Fragment.class);
複製代碼

六、外部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());便可

七、自動注入參數到界面;

  • 在目標Activity中加上EasyRouter.inject(this);

  • 在Activity中須要自動傳參的參數上加上註解@AutoAssign,則會自動經過Intent賦值。例如:

@AutoAssign
    long time;
    @AutoAssign
    int age;
    @AutoAssign
    String url;
複製代碼

備註:自動注入參數功能目前僅支持基本數據類型和String;

廣告時間

今日頭條各Android客戶端團隊招人火爆進行中,各個級別和應屆實習生都須要,業務增加快、日活高、挑戰大、待遇給力,各位大佬走過路過千萬不要錯過!

本科以上學歷、非頻繁跳槽(如兩年兩跳),歡迎加個人微信詳聊:KOBE8242011

歡迎關注
相關文章
相關標籤/搜索