Android:從零開始打造自己的深度連結庫(一):ARouter簡介
前言
原計劃這是一個系列的收費文章,2塊錢買不了吃虧買不了上當,結果沒想到預訂人數還沒到10人,略微有些尷尬。雖然結局不太完美,但是也反映出大家的水平大部分都在這篇文章的水平之上了,我也可以把文章拆分成多個部分慢慢寫了,也是好事一件。
在應用開發中,原生app經常內嵌Web,節省開發的成本,這種情況我們通過注入JS指令碼來解決原生和Web的通訊問題。那麼相反,在瀏覽器環境中,Web又如何啟動App呢?這就是深度連結的出現的原因。
深度連結看著是一個很6的名字,實際上就是隱式啟動的一種,所以說有文化就是不一樣。隱式啟動最大的優勢在於不明確指定啟動頁面的名字,通過各種過濾引數,找到符合條件頁面,對匹配的過程解耦,堪稱路由模式的鼻祖。
我們談談什麼是路由模式?
以生活中路由器為例,首先路由器連線可以訪問網路的匯流排,我們通過網線或wifi連線路由器,當我們需要訪問網路的時候,路由器幫助我們進行請求轉發,訪問網路有兩種情況:
1、例如看視訊,聊天等等,訪問的是匯流排;
2、如果我們要打局域網遊戲,就要訪問連線同一路由的其他裝置;
那麼把這種設計理念放入到程式設計中:
匯流排 相當於主工程
裝置 相當於獨立模組

路由模式原型圖
再說說程式設計模組化的幾大好處:
1、便於多人協作開發,儘量避免多人操作同一檔案,減少合併程式碼的引發的問題。
2、便於測試,減少打包測試的時間
3、便於維護,修改某一功能儘可能小的影響其他模組。
模組化有這麼多的好處,但同時出現了一個更大的問題:
模組之間如何進行互動?###
例如,使用者登入和評論兩個獨立模組,評論之前需要判斷是否已登入,否則要跳轉到登入頁面去,評論模組無法直接訪問使用者模組的類,所以無法正常編譯執行,為了解決這個問題,我們需要藉助路由模式。
OK,基本知識我們已經都瞭解了,接下來我們學習一下ARouter的用法,看看他怎麼把路由和深度連結結合起來的。
正文
首先推薦大家看一下ARouter在github上的教程,英文版和中文版都有,可以說是非常良心了,這裡我們挑幾個重點介紹一下。
@Router註解
服務註解,用於Activity,Fragment,以及自定義服務介面等等。
@Router註解的類,代表可以被路由的服務,例如跳轉頁面,啟動服務,或者開放服務,例如之前舉例的登入,就可以寫一個LoginService,然後通過路由地址就可以找到這個服務。
// 跳轉頁面 @Route(path = "/main/TestActivity", extras = 1) public class TestActivity extends AppCompatActivity{} ARouter.getInstance().build("/main/TestActivity").navigation(); // 通過路由找到Fragment @Route(path = "/test/fragment", extras = 1) public class Fragment1 extends Fragment{} Fragment fragment = (Fragment) ARouter.getInstance().build("/test/fragment").navigation(); // 通過路由找到開放的服務 @Route(path = "/service/sayHello") public class HelloServiceImpl implements HelloService{} HelloService service4 = (HelloService)ARouter.getInstance().build("/service/sayHello").navigation();
@Interceptor註解
全域性攔截器註解,會在編譯過程中自動裝配到ARouter配置中,無需手動設定
攔截器會在路由過程中被執行,一旦某一個攔截器攔截,此次路由停止。如果跳轉的過程想要跳過攔截器,可以設定greenChannel():
// greenChannel()表示跳過攔截器 ARouter.getInstance().build("/main/TestActivity").greenChannel().navigation();
@Autowired註解
自動裝配註解,自動裝配符合要求的值,例如從intent中或者通過路由建立對應的物件。
ARouter.getInstance() .build("/kotlin/test") .withString("name", "老王") .withInt("age", 23) .navigation(); // 自動裝配,desc屬性表示的描述,沒有實際作用 @Autowired(desc = "姓名") String name = "jack"; @Autowired int age = 10; // 自動裝配符合條件的服務 // 如果有多個實現類,請設定路由地址 // @Autowired(name = "/service/sayHello") @Autowired HelloService helloService;
SchemeFilterActivity的使用
深度連結過度頁面,用於處理從瀏覽器跳轉的引數,然後通過路由找到對應的服務。
SchemeFilterActivity需要在Manifest.xml中註冊,這和我們之前瞭解的深度連結完全一樣,得到了地址後,交給ARouter處理,這樣深度連結就和路由完美結合在一起使用。
<activity android:name=".activity.SchameFilterActivity"> <!-- Schame --> <intent-filter> <data android:host="m.aliyun.com" android:scheme="arouter"/> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.DEFAULT"/> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter> </activity> public class SchemeFilterActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_schame_filter); Uri uri = getIntent().getData(); ARouter.getInstance().build(uri).navigation(); finish(); } }
總結
這一篇主要是瞭解一些路由和深度連結相關的知識,然後瞭解一下ARouter的用法,為之後的原始碼分析和實戰打下基礎。
下一篇:ARouter源分析,馬上就來。
如果你突然覺得這個系列值兩塊錢,那就打賞一下吧~