元件和模組間Activity路由框架

冰冰棒冰冰發表於2017-10-15

AFRouter

元件和模組間Activity路由框架,通過動態代理技術實現,輕量、靈活

特性

  • 支援絕大多數引數型別(Intent可攜帶的資料型別)
  • 專為元件和模組間Activity路由設計,元件化UI路由解耦
  • 支援options(Android 5.0 啟動Activity方式)
  • 支援Context、Activity和Fragment作為呼叫者(Activity.startActivity()、Context.startActivity()和Fragment.startActivity())
  • 支援設定request code(startActivityForResult())
  • 提供攔截器(Interceptor),全域性過濾Activity
  • 支援安全啟動Activity(未找到目標Activity時路由到預設的Activity)
  • 可以得到Intent包裝類Wrapper,然後可以自己作處理
  • 支援Android 2.3及以上版本

使用

新增依賴

dependencies {
    api 'com.tubb.afrouter:afrouter:0.3.0'
}複製程式碼

定義Router Service

首先要定義Router Service,告訴框架如何來啟動一個Activity,直接來看示例

public interface AFRouterService {
    /**
     * 以Activity類全名的方式來啟動Activity
     */
    @ActivityName("com.tubb.afrouter.sample.NormalActivity") // 類全名
    void start();
    /**
     * 指定Action的方式來啟動Activity
     * @param action intent action
     * @param reqCode startActivityForResult() request code
     */
    void actionStart(@ParamKey("action") String action, @ParamKey("reqCode") int reqCode);
    @ActivityName("com.tubb.afrouter.sample.NormalActivity")
    void forResult(@ParamKey("reqCode") int reqCode);
    @ActivityName("com.tubb.afrouter.sample.BackStartActivity")
    void backStart();
    /**
     * 自己手動處理Activity的啟動
     * @return Intent Wrapper
     */
    @ActivityName("com.tubb.afrouter.sample.NormalActivity")
    Wrapper returnTypeStart();

    /**
     * 攜帶options
     * @param bundle 5.0 options
     */
    @ActivityName("com.tubb.afrouter.sample.NormalActivity")
    void activityOptionsStart(@ParamKey("options") Bundle bundle);
    /**
     * 支援攜帶的引數型別
     */
    @ActivityName("com.tubb.afrouter.sample.VerifyParamsActivity")
    void verifyParams(@ParamKey("strP") String strP, @ParamKey("strsP") String[] strsP,
                      @ParamKey("intP") int intP, @ParamKey("intsP") int[] intsP,
                      @ParamKey("shortP") short shortP, @ParamKey("shortsP") short[] shortsP,
                      @ParamKey("longP") long longP, @ParamKey("longsP") long[] longsP,
                      @ParamKey("charP") char charP, @ParamKey("charsP") char[] charsP,
                      @ParamKey("doubleP") double doubleP, @ParamKey("doublesP") double[] doublesP,
                      @ParamKey("floatP") float floatP, @ParamKey("floatsP") float[] floatsP,
                      @ParamKey("byteP") byte byteP, @ParamKey("bytesP") byte[] bytesP,
                      @ParamKey("booleanP") boolean booleanP, @ParamKey("booleansP") boolean[] booleansP,
                      @ParamKey("bundleP") Bundle bundleP,
                      @ParamKey("sparseArrayP") SparseArray<ParcelableEntity> sparseArrayP,
                      @ParamKey("arrayListIntP") ArrayList<Integer> arrayListIntP,
                      @ParamKey("arrayListStringP") ArrayList<String> arrayListStringP,
                      @ParamKey("arrayListCharSequenceP") ArrayList<CharSequence> arrayListCharSequenceP,
                      @ParamKey("arrayListParcelableP") ArrayList<ParcelableEntity> arrayListParcelableP,
                      @ParamKey("parcelableArrayP") ParcelableEntity[] parcelableArrayP,
                      @ParamKey("parcelableP") ParcelableEntity parcelableP,
                      @ParamKey("serializableP") SerializableEntity serializableP
    );
}複製程式碼

快速使用

定義了Router Service後,後面的呼叫流程將非常簡單,一兩行程式碼即可啟動Activity

// Router Service可以儲存在全域性變數中
AFRouterService afService = AFRouter.getInstance().create(AFRouterService.class, this);
afService.forResult(FOR_RESULT_CODE);複製程式碼

通過Wrapper類使用

得到框架對Intent包裝類Wrapper,然後由自己來處理

Wrapper wrapper = afService.returnTypeStart();
// wrapper.addFlags();
// wrapper.setAction();
// wrapper.setClassName();
// // 真實的Intent
// wrapper.getIntent();
wrapper.start();複製程式碼

攔截過濾

支援全域性攔截,可以過濾掉一些Activity

afService = AFRouter.getInstance().create(AFRouterService.class, this, new Interceptor() {
    @Override
    public boolean intercept(Wrapper wrapper) {
        Toast.makeText(wrapper.getContext(), "Interceptor return true", Toast.LENGTH_SHORT).show();
        return true;
    }
});
afService.backStart();複製程式碼

框架內建的幾個引數

"action"    Intent Action   如果傳了這個引數,`Intent.setAction()`將會被呼叫
"reqCode"   startActivityForResult() request code   如果傳了這個引數,最終呼叫的是`startActivityForResult()`
"options"   startActivity(Intent intent, Bundle options) 如果傳了這個引數,`startActivity(Intent intent, Bundle options)`或`startActivityForResult(Intent intent, Bundle options)`將被呼叫複製程式碼

配置預設Activity(找不到目標Activity時顯示的Activity,避免APP崩潰)

<meta-data
    tools:replace="android:value"
    android:name="com.tubb.afrouter.ERROR_ACTIVITY_CLASS_NAME"
    android:value="[預設Activity的類全名(包名.類名)]"/>複製程式碼

詳細使用請參照原始碼工程,強烈建議clone下來檢視

相關文章