android元件間的互動和程序間IPC通訊

2021-08-25 06:26:51 字數 2121 閱讀 3106

在android中窗體與窗體之間如何互相呼叫和交換資料?窗體(activity)和後台的服務(service)如何通訊?基於 unix(linux)的系統都有乙個很優秀的傳統,就是倡導非常輕便的程序間通訊(ipc)機制;倡導程序通過ipc來互相協作;倡導功能單一,小巧而強壯的程序,而不是又大又複雜的「萬金油」。同樣,在android中我們可以將我們的activity和service放在不同的程序中執行,我們可以在我們的task 中載入其他程序的activity,這些機制都鼓勵我們「盡量利用已有的功能,利用ipc和包含這些已有功能的程式協作,來完成乙個完整的應用」,例如在我們的程式中充分利用google map的相關窗體和服務。所有這些都建立在一套輕便好用的ipc機制上。

android的元件和程序間通訊都建立在一種基於稱為intent的訊息基礎之上。intent就是一種訊息,它包含了兩個重要的內容:1. 訊息的目的,即這個訊息是發給哪個元件的?(訊息的目的中不會包含「訊息是發給哪個程序」這樣的資訊,這裡android有意淡化程序的概念,而只讓我們關心元件,因為了解太多關於程序的具體資訊會加大複雜度,而又如何做到程序間的訊息傳遞呢?下文會說到一種android中關於這點比較特別的設計方式,我認為是一種簡捷有用又符合手機特點的設計);2. 訊息所攜帶的資料內容,即需要傳遞給目標的資料。下面是乙個簡單的利用intent來啟動乙個service並向其傳遞資料的**示例:

intent serviceintent = new intent(context, svrmain.class);

serviceintent.putextra(「network_report」, networkstatus);

context.startservice(serviceintent);

上面的**首先構造了乙個intent物件,並在構造的時候指定了這個intent的目的地,即「svrmain.class」,表示這個intent是要傳遞給乙個類名叫svrmain的service。然後向這個intent中放入了乙個資料,資料的key為 「network_report」,value為乙個叫networkstatus的int型別變數,用來指明當前網路的狀態。最後我們使用系統提供的上下文api,將這個intent傳遞給指定的service。

intent的訊息目的地分為兩種模式,一種是顯式的,一種是隱式的。我們上面的例子中看到的就是乙個顯式訊息的例子。顯式訊息直接指定訊息目的地元件的類元資訊,例如上面例子中svrmain就是我們寫的乙個類名為svrmain的service,class操作符就是獲取其類元資訊。這種模式的訊息由於已經確切知道了訊息目標的確切資訊,所以只適用於同一程序內的不同元件之間通訊,例如開啟乙個子窗體,和同一程序中的service通訊等。對應的,隱式訊息就一般用於跨程序的通訊了,隱式訊息沒有確定的訊息目的地,除了資料外,隱式訊息只是包含了一些用於表徵訊息特徵的描述字段。而一些需要收到某種特定特徵訊息的某個程式中的某個元件,需要通過在其所在程式的androidmainifest.xml中註冊一種被稱為intent-filter的訊息特徵篩選器,然後android系統會按照一定的匹配規則來匹配發出的訊息特徵和所有擁有響應這種特徵的intent-filter的元件(無論是同一程序內的元件還是不同程式中的元件),匹配到的元件就會接受到相應的訊息。前面的描述多少有些拗口,我們舉個實際的例子來說明,如果我們想開啟乙個子窗體(無論這個窗體來自同一程序還是不同程序),我們除了使用顯式訊息外,我們還可以使用隱式訊息:

intent opensomediagintent = new intent();

opensomediagintent.setaction(「edwin.demo.fooactivity」);

this.startactivity(opensomediagintent);

上面的隱式訊息不包含具體的目的地,而是僅包含乙個名位「action」的特徵字串,action就是上文所說的intent特徵的一種。從字面上來理解,可以理解為這個訊息所代表的是完成某乙個動作的含義,由action來標明動作的名字。所有能夠處理這種動作的activity都可以收到該訊息。對應的,可能在同乙個程式或者另外的某個程式的androidmainifest.xml中宣告了下面這樣的乙個activity:

那麼這就表示這個activity能夠收到並處理action為「edwin.demo.fooactivity」的訊息。所以上面的**串起來的效果就是,開啟了這個名為.fooactivity的視窗,無論這個視窗是在當前的程序中還是另外的乙個程式中。

vue中元件間的資訊互動方式分類

理清vue元件間的資料互動邏輯可以很好的幫助我們構建專案。一 簡單父子元件之間,就是普通的小組件,資料量少,父元件用props傳入資料,子元件可以直接使用 emit 和 on進行資料互動。也可以使用 bus。二 複雜元件之間,這種元件的特點是,內部包含有很多互動邏輯,常常需要訪問介面。另外,展示的資...

介面元件和執行緒的互動

為了解決anr問題,使用新建執行緒的方式。但新建的執行緒無法訪問到介面元件。檢視元件只對建立檢視結構層次的執行緒開放。而對新建的執行緒是close的。解決這個問題可以通過android的訊息佇列機制。即通過執行緒的訊息佇列處理器 handler 外部執行緒向主線程訊息傳送訊息,主線程在收 到訊息後,...

Android元件化實戰三 模組之間的互動

在personal模組要跳轉到order模組的order mainactivity,類載入技術實現主要邏輯如下 類載入跳轉,可以成功,維護成本較高且容易出現人為失誤 需要準確的全類名路徑 trycatch classnotfoundexception e 定義pathbean物件 路徑物件 公共基礎...