ARouter簡單入門和介紹

1.路由介紹

什么是路由框架啥纸?

說簡單點(diǎn)就是映射頁面跳轉(zhuǎn)關(guān)系的,當(dāng)然它也包含跳轉(zhuǎn)相關(guān)的一切功能

為什么使用ARouter?

我們先從適用場景來分析:

  1. 動(dòng)態(tài)跳轉(zhuǎn):一般來說復(fù)雜的電商跳轉(zhuǎn)多頁面需要很強(qiáng)的靈活性婴氮,很多情況下是運(yùn)營人員動(dòng)態(tài)配置的下發(fā)活動(dòng)頁面斯棒,需要靈活的進(jìn)行跳轉(zhuǎn)。

  2. 組件化:隨著業(yè)務(wù)量的不斷增長主经,app也會(huì)不斷的膨脹荣暮,開發(fā)團(tuán)隊(duì)的規(guī)模和工作量也會(huì)逐漸增大,面對所衍生的64K問題旨怠、協(xié)作開發(fā)問題等渠驼,app一般都會(huì)走向組件化。組件化就是將APP按照一定的功能和業(yè)務(wù)拆分成多個(gè)組件module,不同的組件獨(dú)立開發(fā)迷扇,組件化不僅能夠提供團(tuán)隊(duì)的工作效率百揭,還能夠提高應(yīng)用性能。而組件化的前提就是解耦蜓席,那么我們首先要做的就是解耦頁面之間的依賴關(guān)系

  3. Native與H5的問題:現(xiàn)在的APP很少是純Native的器一,也很少會(huì)有純H5的,一般情況下都是將兩者進(jìn)行結(jié)合厨内。這時(shí)候就需要非常便捷并且統(tǒng)一的跳轉(zhuǎn)方案祈秕,因?yàn)樵贖5中是無法使用StartActivity()跳轉(zhuǎn)到Native頁面的,而從Native跳轉(zhuǎn)到H5頁面也只能通過配置瀏覽器的方式實(shí)現(xiàn)

  4. 其他等場景

原生跳轉(zhuǎn)方式的不足

  • 顯式跳轉(zhuǎn)雏胃, Intent intent = new Intent(activity, XXActivity.class);
    由于需要直接持有對應(yīng)class请毛,從而導(dǎo)致了強(qiáng)依賴關(guān)系,提高了耦合度
  • 隱式跳轉(zhuǎn)瞭亮,譬如 Intent intent = new Intent(); intent.setAction(“com.android.activity.MY_ACTION”);
    action等屬性的定義在Manifest方仿,導(dǎo)致了擴(kuò)展性較差
    規(guī)則集中式管理,導(dǎo)致協(xié)作變得非常困難统翩。
  • 原生的路由方案會(huì)出現(xiàn)跳轉(zhuǎn)過程無法控制的問題仙蚜,因?yàn)橐坏┦褂昧薙tartActivity()就無法插手其中任何環(huán)節(jié)了,只能交給系統(tǒng)管理厂汗,這就導(dǎo)致了在跳轉(zhuǎn)失敗的情況下無法降級委粉,而是會(huì)直接拋出運(yùn)行時(shí)的異常。

2.ARouter的使用

1.添加框架的依賴和配置

在各個(gè)模塊的build.gradle中添加編譯參數(shù)和依賴的框架

android {
    defaultConfig {
    ...
    javaCompileOptions {
        annotationProcessorOptions {
        arguments = [ moduleName : project.getName() ]
        }
    }
    }
}

dependencies {
    // 替換成最新版本, 需要注意的是api
    // 要與compiler匹配使用娶桦,均使用最新版可以保證兼容
    compile 'com.alibaba:arouter-api:1.2.2'
    annotationProcessor 'com.alibaba:arouter-compiler:1.1.3'
    ...
}

// 舊版本gradle插件(< 2.2)贾节,可以使用apt插件,在根build.gradle中配置方法
apply plugin: 'com.neenbedankt.android-apt'

buildscript {
    repositories {
        jcenter()    
    }

    dependencies {
    classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
}

2.添加注解

// 在支持路由的頁面上添加注解(必選)
// 這里的路徑需要注意的是至少需要有兩級趟紊,/xx/xx
@Route(path = "/test/activity")
public class YourActivity extend Activity {
    ...
}

3.初始化SDK

if (isDebug()) {           // 這兩行必須寫在init之前氮双,否則這些配置在init過程中將無效
    ARouter.openLog();     // 打印日志
    ARouter.openDebug();   // 開啟調(diào)試模式(如果在InstantRun模式下運(yùn)行,必須開啟調(diào)試模式霎匈!線上版本需要關(guān)閉,否則有安全風(fēng)險(xiǎn))
}
ARouter.init(mApplication); // 盡可能早戴差,推薦在Application中初始化

4.路由操作

// 1.普通跳轉(zhuǎn)
ARouter.getInstance().build("/test/activity").navigation();

// 2.跳轉(zhuǎn)并攜帶參數(shù)
ARouter.getInstance().build("/test/activity2").navigation();
// 3.跳轉(zhuǎn)并攜帶請求碼
ARouter.getInstance().build("/test/activity2").navigation(this, requestCode);

// 4.URI跳轉(zhuǎn) 
/*這種使用URi的方式中,URi的Scheme 和 host不影響結(jié)果铛嘱,可以隨便設(shè)暖释,關(guān)鍵的是path
*  - build(URI)會(huì)把URI解析為path,并把當(dāng)前URI存入PostCard
*  - build(String)構(gòu)造的PostCard不存儲(chǔ)URI*/
Uri testUriMix = Uri.parse("xx://xxx/test/activity2");
ARouter.getInstance().build(testUriMix)
                        .withString("name", "老王")
                        .withInt("age", 18)
                        .withBoolean("boy", true)
                        .withLong("high", 180)
                        .withString("url", "https://a.b.c")
                        .withParcelable("pac", testParcelable)
                        .withObject("obj", testObj)
                        .navigation();

// 5.跳轉(zhuǎn)包含回調(diào) 單次降級策略可以在這里使用
ARouter.getInstance().build("/test/activity2").navigation(Context mContext, int requestCode, NavigationCallback callback);

5.配置自定義序列化方式

上訴的代碼中有withObject進(jìn)行傳參墨吓,沒有定義序列化方式是無法進(jìn)行解析因此需要定義一個(gè)序列化方式,以下采用FastJson進(jìn)行序列化

// 如果需要傳遞自定義對象球匕,需要實(shí)現(xiàn) SerializationService,并使用@Route注解標(biāo)注(方便用戶自行選擇序列化方式),例如:
@Route(path = "/service/json")
public class JsonServiceImpl implements SerializationService {
    @Override
    public void init(Context context) {

    }

    @Override
    public <T> T json2Object(String text, Class<T> clazz) {
        return JSON.parseObject(text, clazz);
    }

    @Override
    public String object2Json(Object instance) {
        return JSON.toJSONString(instance);
    }
}

6.聲明攔截器(攔截跳轉(zhuǎn)過程帖烘,面向切面編程)

// 比較經(jīng)典的應(yīng)用就是在跳轉(zhuǎn)過程中處理登陸事件亮曹,這樣就不需要在目標(biāo)頁重復(fù)做登陸檢查
// 攔截器會(huì)在跳轉(zhuǎn)之間執(zhí)行,多個(gè)攔截器會(huì)按優(yōu)先級順序依次執(zhí)行
@Interceptor(priority = 8, name = "測試用攔截器")
public class TestInterceptor implements IInterceptor {
    @Override
    public void process(Postcard postcard, InterceptorCallback callback) {
    ...
    callback.onContinue(postcard);  // 處理完成,交還控制權(quán)
    // callback.onInterrupt(new RuntimeException("我覺得有點(diǎn)異常"));      // 覺得有問題照卦,中斷路由流程

    // 以上兩種至少需要調(diào)用其中一種式矫,否則不會(huì)繼續(xù)路由
    }

    @Override
    public void init(Context context) {
    // 攔截器的初始化,會(huì)在sdk初始化的時(shí)候調(diào)用該方法役耕,僅會(huì)調(diào)用一次
    }
}

// 我們經(jīng)常需要在目標(biāo)頁面中配置一些屬性采转,比方說"是否需要登陸"之類的
// 可以通過 Route 注解中的 extras 屬性進(jìn)行擴(kuò)展,這個(gè)屬性是一個(gè) int值瞬痘,換句話說故慈,單個(gè)int有4字節(jié),也就是32位框全,可以配置32個(gè)開關(guān)
// 剩下的可以自行發(fā)揮察绷,通過字節(jié)操作可以標(biāo)識32個(gè)開關(guān),通過開關(guān)標(biāo)記目標(biāo)頁面的一些屬性津辩,在攔截器中可以拿到這個(gè)標(biāo)記進(jìn)行業(yè)務(wù)邏輯判斷
@Route(path = "/test/activity", extras = Consts.XXXX)

7.通過依賴注入解耦:服務(wù)管理(一) 暴露服務(wù)

// 聲明接口,其他組件通過接口來調(diào)用服務(wù)
public interface HelloService extends IProvider {
    String sayHello(String name);
}

// 實(shí)現(xiàn)接口
@Route(path = "/service/hello", name = "測試服務(wù)")
public class HelloServiceImpl implements HelloService {

    @Override
    public String sayHello(String name) {
    return "hello, " + name;
    }

    @Override
    public void init(Context context) {

    }
}

8.通過依賴注入解耦:服務(wù)管理(二) 發(fā)現(xiàn)服務(wù)

public class Test {
    @Autowired
    HelloService helloService;

    @Autowired(name = "/service/hello")
    HelloService helloService2;

    HelloService helloService3;

    HelloService helloService4;

    public Test() {
    ARouter.getInstance().inject(this);
    }

    public void testService() {
     // 1. (推薦)使用依賴注入的方式發(fā)現(xiàn)服務(wù),通過注解標(biāo)注字段,即可使用克婶,無需主動(dòng)獲取
     // Autowired注解中標(biāo)注name之后,將會(huì)使用byName的方式注入對應(yīng)的字段丹泉,不設(shè)置name屬性,會(huì)默認(rèn)使用byType的方式發(fā)現(xiàn)服務(wù)(當(dāng)同一接口有多個(gè)實(shí)現(xiàn)的時(shí)候鸭蛙,必須使用byName的方式發(fā)現(xiàn)服務(wù))
    helloService.sayHello("Vergil");
    helloService2.sayHello("Vergil");

    // 2. 使用依賴查找的方式發(fā)現(xiàn)服務(wù)摹恨,主動(dòng)去發(fā)現(xiàn)服務(wù)并使用,下面兩種方式分別是byName和byType
    helloService3 = ARouter.getInstance().navigation(HelloService.class);
    helloService4 = (HelloService) ARouter.getInstance().build("/service/hello").navigation();
    helloService3.sayHello("Vergil");
    helloService4.sayHello("Vergil");
    }

小結(jié)

官方的文檔Github很詳細(xì)可以去看看

以上方式可以進(jìn)行簡單的入門使用了娶视,下一步我們從源碼分析晒哄。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市肪获,隨后出現(xiàn)的幾起案子寝凌,更是在濱河造成了極大的恐慌,老刑警劉巖孝赫,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件较木,死亡現(xiàn)場離奇詭異,居然都是意外死亡青柄,警方通過查閱死者的電腦和手機(jī)伐债,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來致开,“玉大人峰锁,你說我怎么就攤上這事∷粒” “怎么了虹蒋?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我魄衅,道長峭竣,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任徐绑,我火速辦了婚禮邪驮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘傲茄。我一直安慰自己毅访,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布盘榨。 她就那樣靜靜地躺著喻粹,像睡著了一般。 火紅的嫁衣襯著肌膚如雪草巡。 梳的紋絲不亂的頭發(fā)上守呜,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機(jī)與錄音山憨,去河邊找鬼查乒。 笑死,一個(gè)胖子當(dāng)著我的面吹牛郁竟,可吹牛的內(nèi)容都是我干的玛迄。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼棚亩,長吁一口氣:“原來是場噩夢啊……” “哼蓖议!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起讥蟆,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤勒虾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瘸彤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體修然,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年质况,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了低零。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,724評論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拯杠,死狀恐怖赞咙,靈堂內(nèi)的尸體忽然破棺而出贯卦,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜瘟则,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望枝秤。 院中可真熱鬧醋拧,春花似錦、人聲如沸淀弹。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽薇溃。三九已至菌赖,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間沐序,已是汗流浹背琉用。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留策幼,地道東北人邑时。 一個(gè)月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像特姐,于是被迫代替她去往敵國和親刁愿。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,846評論 25 707
  • 前言 隨著用戶的需求越來越多到逊,對App的用戶體驗(yàn)也變的要求越來越高。為了更好的應(yīng)對各種需求滤钱,開發(fā)人員從軟件工程的角...
    一縷殤流化隱半邊冰霜閱讀 87,059評論 214 1,098
  • 來大理已有旬日觉壶,日日見蒼山負(fù)雪巍立,心向往之件缸,知有今日之登臨也铜靶。 至蒼山腳下,仰望他炊,青松被覆争剿。以其山之高也,故綠有...
    胡斐閱讀 644評論 3 4
  • 獨(dú)對空閣秋草衰痊末,輕風(fēng)斜掛鳳凰釵蚕苇。 七夕鵲樹雙呢語,長晝鶯枝獨(dú)旋徘凿叠。 殘酒盞涩笤,玉燭腮嚼吞,癡心欲喚夢中來。 天涯自此吾心...
    七文七步一顰閱讀 552評論 16 27
  • 大概是由于我愛情觀有問題蹬碧,所以每次遇到的人都很怪吧
    和太陽肩并肩閱讀 365評論 0 1