APP開發實戰61 Activity訊息路由

2021-07-13 23:59:21 字數 2192 閱讀 5188

在android開發中,常遇到多個activity間的相互通訊和呼叫,這樣會導致acticity間的橫向依賴。

(**:

android中,開啟頁面的方式主要是startactivity()。使用startactivity()的缺點是需要開啟的那個activity的類已經存在,否則無法通過編譯,但是在協同開發中,這往往是無法得到滿足的。為了解決此問題,需要在android平台設計和實現乙個路由框架。

首先我們需要明確一點,那就是我們的框架不能僅僅侷限於開啟activity,開啟activity只是框架中的一種行為實現,我們的框架應該是包含了activity以及其它比較常用的路由。並支援使用者自己新增自己的路由實現的,如使用者希望使用url呼叫乙個方法,或者呼叫乙個runnable,那麼他就可以自己實現乙個router來支援這種行為。基於這樣的思路,路由框架的整體架構設計如下。

在以上框架中,由routermanager維護所有的irouter列表。我們的框架自身實現了開啟activity的activityrouter。同時使用者可以新增自己的irouter實現。當使用者想要開啟某個url時,呼叫routermanager的open()方法,routermanager遍歷列表,呼叫irouter的canopentheurl方法找到第乙個能夠開啟該url的irouter,並將該open的任務dispatch給該router。 但是在分析實際使用情景中,我們發現這樣的框架設計並不能滿足實際使用需求,主要有如下幾點。

(1)在開啟activity可能需要設定動畫。

(2)需要選擇使用startactivityforresult()來開啟activity。

(3)需要傳遞一些無法放到url中的傳遞引數,如parcelable等。

雖然這僅僅是activityrouter的需求,但我們也需要讓我們的框架支援這些。因此,我們對以上框架設計做了一些修改如下:

使用者在需要額外設定一些引數的時候可以不選擇使用open開啟url,而是使用getroute()方法獲得抽象的route物件,通過route物件進行額外的設定,最後可以通過iroute介面的open方法開啟它自己。irouter和iroute的關係應該是一對一或者一對多,一種irouter應該可以開啟一或者多種不同iroute。而乙個iroute則一般只能由一種irouter開啟。

在路由框架中,url應該包含兩點功能,一是唯一確定一條路由,二是提供一些引數。我們可以以乙個路由的例子來講解activityrouter的路由規則。本規則參考了rest。 

例:activity://main/:i/path1/:f

scheme為activity代表該url可以被activityrouter開啟。

host為main一般表示決定的activity。

而:則表示乙個值的key,這個path segment在url中會被具體的值替換,:後面的i表示該key對應的值的型別為int型。

path1為固定的path segment,與上面的key用來傳遞值不同。用來區分路由,與host功能類似。

因此乙個url與路由匹配需要scheme,host以及path中的固定部分相同,而key部分被具體的值代替。

以下舉乙個匹配上面的路由的url的例子:

activity:main/123/path1/12.4。

則會呼叫intent的putextra()方法將key1=123,key2=12.4放到intent的bundle中。在被跳的activity中就可以獲取對應的值。如果有些值是不必須的,已可以放到queryparameter中。如activity://main/123/path1?des=hello。但query parameter不影響路由匹配。

router需要提供乙個方法讓使用者初始化路由表。如下activityrouter的實現,當然這並不必要,如開啟網頁的router就不需要路由表,只需要呼叫系統瀏覽器開啟網頁即可。所以該方法沒有在介面中定義。

initializer.initroutertable(mroutetable);

publicinte***ce iactivityroutetableinitializer {

* init the router table

* @param router the router map to

void initroutertable(map> router);

將原本startactivity方式替換成路由方式後,有以下幾個明顯的優點。

(1)便於協同開發

(2)便於測試,可以在測試中替換乙個路由表,開啟測試用activity。

APP開發實戰34 HTTPS介紹

https hyper text transfer protocol over secure socket layer 是http的安全版,在http和tcp層間加入ssl tls層,以實現內容加密 身份認證和保證資料完整性。ssl 加密套接字協議層securitysocket layer,tls ...

APP開發實戰38 Cookie介紹

http是一種無狀態性的協議。這是因為此種協議不要求瀏覽器在每次請求中標明它自己的身份,並且瀏覽器以及伺服器之間並沒有保持乙個永續性的連線用於多個頁面之間的訪問。當使用者訪問這個網域名稱的時候,瀏覽器就會自動和伺服器建立tcp ip連線,然後傳送http請求到example.com的伺服器的80埠。...

APP開發實戰50 MVVM架構

mvvm model view viewmodel 框架圖 viewmodel大致上就是mvp的presenter和mvc的controller了,而view和viewmodel間沒有了mvp的介面介面,而是直接互動,用資料 繫結 的形式讓資料更新的事件不需要開發人員手動去編寫特殊用例,而是自動地雙...