天天看點

DeepLink用法及源碼解析

翻譯後的意思就是:

當單擊連結或程式設計請求調用Web URI意圖時,Android系統按順序依次嘗試以下每一個操作,直到請求成功為止:

1. 打開使用者首選的應用程式,它可以處理URI,如果指定的話。

2. 打開可以處理URI的惟一可用應用程式。

3. 允許使用者從對話框中選擇應用程式。

意思也就是使用者可以自己寫一串字元串,系統會對該字元串進行解析,然後調起注冊過相應scheme的應用,如果有多個注冊了,那麼就會彈出對話框讓使用者選擇。

在上面有兩個

上面在同一個

getIntent可以在Activity的生命周期的任何時段進行擷取,不過一般别人應用要調你應用,肯定都是希望進入你的應用某個界面,或實作某個功能。其他應用會把該傳的資訊都傳給你,最好的解析地方肯定是onCreate(或onStart但onStart還是會晚一些)。對于這個官方給了以下建議:

意思就是:

1. 打開應用後應該直接到内容,不要有任何提示,間接的頁面,或登入。確定使用者可以看到應用程式的内容,即使他們以前從未打開過應用程式。可以在随後的互動中提示使用者,或者在啟動程式中打開應用程式。這與網站第一次點選免費體驗的原理是相同的。

2. 遵循導航與後退和向上描述的設計指南,使您的應用程式與使用者通過向後連結進入您的應用程式的深度導航的期望相符。

實作上面代碼後就可以進行測試了。在測試時可以使用adb的shell指令進行測試,文法格式如下:

例如我們上面的例子就可以采用如下方式進行打開:

上面的intent也可以通過浏覽器裡面的網頁進行設定,現在浏覽器都會解析這個intent然後調起對應的應用,即可以直接在網頁中調起應用。

DeepLink使得開發網站和自己的App能很好的互相互動。而且一個intent字元串也好發送,比如你想推廣你的App,你就可以把這個intent發給廣告商,然後點選的時候就把這個intent給手機浏覽器,通過浏覽器調起你自己的應用。這個最好的應用還在搜尋上,在搜尋的時候,當使用者搜到對應内容的時候,現在一般都是跳網站。但是如果有DeepLink,那麼就可以直接通過DeepLink的intent直接跳轉到你自己的App,這既友善了使用者,也友善了開發者。

多個

某個方法的注解:

上面的注解相當于DeepLink中在manifest中的Activity标簽下注冊的

下面就來分析下它的原理。

在AS點選build後即可生成對應的class檔案,主要的檔案有以下幾個:

DeepLink用法及源碼解析

在DeepLinkDispatch架構中主要是通過DeepLinkDelegate代理來處理傳來的Uri,在DeepLinkDelegate中主要是dispatchFrom這個方法來處理Uri。代碼如下:

DeepLink用法及源碼解析

1. 收下根據getIntent.getData()即可擷取到對應的uri。

2. 然後通過DeepLinkLoader.load()來加載注冊的uri。代碼如下

DeepLink用法及源碼解析

調用loader.parseUri去解析Uri,解析完成後傳回的是DeepLinkEntry來供我們使用。

解析Uri中的key-value對,代碼仍然在dispatchFrom中。

DeepLink用法及源碼解析

其中DeepLinkUri.getParameters代碼如下:

DeepLink用法及源碼解析

然後調用了該類的parseParameters擷取patterns集合。

DeepLink用法及源碼解析

從DeepLink的intent中擷取的就是key,具體跳轉的内容就是value。

5. DeepLinkUri.queryParameterNames

通過queryParameterNames就把真實的Uri解析成對應的注解了,之後就會進行分發邏輯了。

6. 具體分發邏輯

DeepLink用法及源碼解析
DeepLink用法及源碼解析

6.1 首先生成Intent對象

6.2 setAction和data,通過以上将action和data放入Intent中。

6.3 處理Bundle。

6.4 調用callingActivity。

6.5 startActivity

6.6 createResultAndNotify

頁面路由的架構大多類似,主要邏輯是:先注冊下需要路由的位址頁及對應的uri,然後通過uri調起時有控制中樞攔截後進行比對,當比對成功後就執行跳轉,在比對的時候uri後面可以跟上所需要傳輸的資料,然後在接收端進行解析即可完成資料的互動。通過以上步驟就完成了DeepLink調起應用頁面的操作了,具體代碼稍後再貼。

DeepLink實作了網頁直接和App直接跳轉。之前手機上的每個App都相當于一個個孤島,沒有辦法和廣泛的網站實作直接的跳轉。現在比如你在浏覽微網誌的時候看到某個App上面有精彩的内容,你就可以直接點選連結跳轉到App裡面(甚至可以判斷如果按照了App就進入App裡面,如果不安裝那麼就進入應用市場的該App下載下傳界面),這樣的互動很友善,很好的将App連接配接到了整個網絡世界,以後有個浏覽器就能随意的跳轉。

DeepLink完全可以在搜尋中使用,目前的搜尋都是搜到了内容還是調網頁。以後如果開發者把自己的DeepLink連結送出給搜尋公司,那麼在搜尋到對應的結果的時候就可以直接點選搜到的結果跳轉到自己的App了。這個還能應用到廣告上去。推廣自己的App就更容易了。

DeepLink使得大企業的衆多App之間互相拉活,互相跳轉。假如某公司有個超級App,那麼想推廣自己的其他App就可以使用DeepLink在開啟自己某個子頁面的時候,把這個子頁面交給其他App進行處理。這樣就拉活了自己的其他App了。

在DeepLink的基礎上,Google又新出了一個AppLinks,AppLinks就是你自己的網站和你自己的App互相關聯了。比如使用者在短信中點選了你的網站,那麼就可以直接跳轉到你的App,而不會出現選擇對話框。Google官方是這樣說的: