導航:首頁 > 操作系統 > Android進程之間的通信

Android進程之間的通信

發布時間:2023-05-30 00:06:20

android開發中跨進程通信有幾種方式

  1. Activity可以跨進程調用其他應用程序;

  2. Content Provider可以跨進程訪問其他應用程序中的數據;

  3. Broadcast可以向android系統中所有應用程序發送廣播;

  4. Content Provider返回的是Cursor對象,而Service返回的是java對象,這種可以跨進程通訊的服務叫AIDL服務;

Ⅱ android 進程間通信 rabbitmq

https://github.com/Harry-III/RabbitMQ-Android

上手了RabbitMQ?再來看看它的交換機(Exchange)吧
RabbitMQ的Java應用(1) -- Rabbit Java Client使用
RabbitMQ(三)入門 —— RabbitMQ的五種模式和四種交換機

本例子是改編自上面的github鏈接

1、android端不採用輪詢的方式請求伺服器,有點類似推送的感覺,能即時收到伺服器的信息

1、將rabbitmq放到單獨的進程中
2、重新定義一些方法

1、在多進程中通過 message.replyTo 方法將通信方式傳遞給 Service端

2、rabbitmq的管道創建是要在線程裡面,否則會報錯
3、如果有2個用戶都採用一個管道(管道名 A),當伺服器將信息都輸送到A管道後,哪個用戶處理消息快,哪個用戶得到的信息就多,所以最好就是每個用戶一個管道

本項目 github

RabbitMQClient .java

RabbitMQUtil .java

Ⅲ Android 使用Messenger實現跨進程之間通信

以前講到跨進程通信,我們總是第一時間想到AIDL(Android介面定義語言),實際上,使用Messenger在很多情況下是比使用AIDL簡單得多的。
大家看到Messenger可能會很輕易的聯想到Message,然後很自然的進一步聯想到Handler——沒錯,Messenger的核心其實就是Message以及Handler來進行線程間的通信。

以下是如何使用Messenger的步驟:

綜上六步就能完成客戶端與Service的跨進程雙向通信過程:
客戶端 -> Service -> 客戶端
簡單的例子(客戶端向伺服器端發送消息,伺服器接收):

服務端主要是返給客戶端一個IBinder實例,以供服務端構造Messenger,並且處理客戶端發送過來的Message。當然,不要忘了要在Manifests文件裡面注冊.

客戶端就主要是發起與服務端的綁定,以及通過onServiceConnected()方法來過去服務端返回來的IBinder,藉此構造Messenger,從而可以通過發送Message的方式與服務端進行交互。

伺服器接收消息後回復消息給客戶端

客戶端修改:
客戶端需要添加一個handler用於接收消息

服務端修改:
在服務端的handler獲取客戶端發送的msg.replyTo

Ⅳ Android多進程通信之 Binder

在 Linux 中一個進程空間可以分為 用戶空間 內核空間 ,不同的進程它們的用戶空間數據不可共享,但是它們的內核空間的數據可共享,即所有進程共用 1 個內核空間。進程內用戶空間和內核空間進行交互需通過系統調用。

Android 系統時基於 Linux 內核的,Linux 已經提供了多種 IPC 方式,如下:

所以,Android 為啥又單獨弄出一個 Binder 呢?主要有如下原因:

直觀地說,Binder 是 Android 中的一個類,它實現了 IBinder 介面;從 Android Framework 角度來說,Binder 是 ServiceManager 連接各種 Manager(ActivityManager、WindowManager...) 和相應 ManagerService 的橋梁;從 Android 應用層來說,Binder 是客戶端和服務端進行通信的媒介,當 bindService 的時候,服務端會返回一個包含了服務端業務調用的 Binder 對象,通過這個 Binder 對象,客戶端就可以獲取服務端提供的服務或者數據,這里的服務包括普通服務和基於 AIDL 服務。

Binder 定義了四個角色:Server,Client,ServiceManager 和 Bidner 驅動,其中 Server、Client、ServiceManager 運行於用戶空間,Binder 驅動運行於內核空間。

Binder 工作原理:

Ⅳ 了解Android進程間通信的四種方式

由於應用程序之間不能共享內存。在不同應用程序之間交互數據(跨進程通訊),在android 

SDK中提供了4種用於跨進程通訊的方式。這4種方式正好對應於android系統中4種應用程序組

件:Activity、Content Provider、Broadcast和Service。其中Activity可以跨進程調用其他應

用程序的Activity;Content Provider可以跨進程訪問其他應用程序中的數據(以Cursor對象形

式返回),當然,也可以對其他應用程序的數據進行增、刪、改操 作;Broadcast可以向

android系統中所有應用程序發送廣播,而需要跨進程通訊的應用程序可以監聽這些廣播;

Service和Content Provider類似,也可以訪問其他應用程序中的數據,但不同的是,Content 

Provider返回的是Cursor對象,而Service返回的是Java對象,這種可以跨進程通訊的服務叫

AIDL服務。

Ⅵ Carson帶你學Android:全面剖析Binder跨進程通信原理

從而全方位地介紹 Binder ,希望你們會喜歡。

在本文的講解中,按照 大角度 -> 小角度 去分析 Binder ,即:

從而全方位地介紹 Binder ,希望你們會喜歡。

在講解 Binder 前,我們先了解一些 Linux 的基礎知識

具體請看文章: 操作系統:圖文詳解 內存映射

Binder 跨進程通信機制 模型 基於 Client - Server 模式

此處重點講解 Binder 驅動作用中的跨進程通信的原理:

原因:

所以,原理圖可表示為以下:

所以,在進行跨進程通信時,開發者只需自定義 Client & Server 進程 並 顯式使用上述3個步驟,最終藉助 Android 的基本架構功能就可完成進程間通信

注冊服務後, Binder 驅動持有 Server 進程創建的 Binder 實體

此時, Client 進程與 Server 進程已經建立了連接

Client 進程 根據獲取到的 Service 信息( Binder 代理對象),通過 Binder 驅動 建立與 該 Service 所在 Server 進程通信的鏈路,並開始使用服務

步驟1: Client 進程 將參數(整數a和b)發送到 Server 進程

步驟2: Server 進程根據 Client 進要求 調用 目標方法(即加法函數)

步驟3: Server 進程 將目標方法的結果(即加法後的結果)返回給 Client 進程

對比 Linux ( Android 基於 Linux )上的其他進程通信方式(管道、消息隊列、共享內存、
信號量、 Socket ), Binder 機制的優點有:

特別地,對於從模型結構組成的Binder驅動來說:

不定期分享關於 安卓開發 的干貨,追求 短、平、快 ,但 卻不缺深度

Ⅶ Android:AIDL進程間通信基本框架

在某些業務場景下,我們需要在應用中單獨開啟一個進程進行一些操作。比如性能監控,如果讓原始業務和性能監控本身的業務跑在同一個進程下,那麼就會導致性能統計的數據的失真。

而進程間通信,一般採用AIDL機制的客戶端與服務端通信。

AIDL只能傳遞如下幾類數據:

當傳遞自定義 Parcelable 時,有三處地方需要注意:

當傳遞其他 aidl 介面時,同樣必須要 import 這個 aidl 文件

編寫完 aidl 文件後,make一下工程,會在 build 下的 generated 下的 source 下的 aidl 目錄生成對應的介面類文件。aidl 介面其實就是 API 介面,通過實現對應介面類的 Stub 子類來實現具體的 API 邏輯;通過對應介面類的 Stub 子類的 asInterface 方法得到具體的實現類,調用具體的 API 方法。

一個基本的客戶端服務端的通信結構一般包括如下功能

客戶端的功能

服務端的功能

客戶端的相關功能實現比較簡單,麻煩的是服務端的功能。因為 AIDL 介面定義的都是服務端的介面,是由客戶端來調用的。而想要實現服務端反向調用客戶端則需要通過其他手段實現。

想要實現服務端主動連接客戶端,最好的辦法就是 服務端發送廣播,客戶端收到廣播後再主動連接服務端 ,通過這種方式變相地實現服務端主動連接客戶端的功能

想要實現服務端主動斷開客戶端,除了上面 發送廣播是一種實現方式外,還可以通過 android 的系統API RemoteCallbackList,用包名作為key值來注冊遠程回調介面的方式,讓服務端持有客戶端的回調介面,服務端調用回調介面,客戶端在回調介面中實現主動斷開服務端 ,通過這種方式變數地實現服務端主動斷開客戶端的功能。而採用後者會顯得更加優雅

既然所有的操作歸根結底都是由客戶端來完成的,那麼客戶端必須得有如下的功能模塊:

服務端必須得有的功能模塊:

那麼,整體的通信流程就是如下的步驟:

首先是通信的 aidl 介面定義

然後是客戶端的連接操作與斷開連接操作,包括廣播接收者的注冊以及回調介面的實現

然後是客戶端的拉取數據和推送數據操作

接著是服務端的 iBinder 介面的實現,完成回調介面的注冊、業務子線程的開啟和關閉、數據的推送和數據的拉取操作

然後是服務端的主動連接和主動斷開連接操作

最後是服務端的 onUnbind 方法的實現,對回調介面進行反注冊

服務端模仿 FloatViewPlugin 自定義插件,實現 IServicePlugin 介面,定製個性化的懸浮窗插件

客戶端在 Appliaction 的 onCreate方法中初始化

在 MainActivity 上實現連接、斷開、數據通信

Ⅷ Android進程間和線程間通信方式

        進程:是具有一定獨立功能的程序關於某個數據集合上的一次運行活動,進程是系統進行資源分配和調度的一個獨立單位。

  線程:是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。線程自己基本上不擁有系統資源,只擁有一些在運行中必不可少的資源(如程序計數器,一組寄存器和棧),但是它可與同屬一個進程的其他的線程共享進程所擁有的全部資源。

  區別:

  (1)、一個程序至少有一個進程,一個進程至少有一個線程;

  (2)、線程的劃分尺度小於進程,使得多線程程序的並發性高;

  (3)、進程在執行過程中擁有獨立的內存單元,而多個線程共享內存,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉。

---------------------

一、Android進程間通信方式

1.Bundle

  由於Activity,Service,Receiver都是可以通過Intent來攜帶Bundle傳輸數據的,所以我們可以在一個進程中通過Intent將攜帶數據的Bundle發送到另一個進程的組件。

  缺點:無法傳輸Bundle不支持的數據類型。

2.ContentProvider

  ContentProvider是Android四大組件之一,以表格的方式來儲存數據,提供給外界,即Content Provider可以跨進程訪問其他應用程序中的數據。用法是繼承ContentProvider,實現onCreate,query,update,insert,delete和getType方法,onCreate是負責創建時做一些初始化的工作,增刪查改的方法就是對數據的查詢和修改,getType是返回一個String,表示Uri請求的類型。注冊完後就可以使用ContentResolver去請求指定的Uri。

3.文件

  兩個進程可以到同一個文件去交換數據,我們不僅可以保存文本文件,還可以將對象持久化到文件,從另一個文件恢復。要注意的是,當並發讀/寫時可能會出現並發的問題。

4.Broadcast

  Broadcast可以向android系統中所有應用程序發送廣播,而需要跨進程通訊的應用程序可以監聽這些廣播。

5.AIDL方式

  Service和Content Provider類似,也可以訪問其他應用程序中的數據,Content Provider返回的是Cursor對象,而Service返回的是Java對象,這種可以跨進程通訊的服務叫AIDL服務。

         AIDL通過定義服務端暴露的介面,以提供給客戶端來調用,AIDL使伺服器可以並行處理,而Messenger封裝了AIDL之後只能串列運行,所以Messenger一般用作消息傳遞。

6.Messenger

  Messenger是基於AIDL實現的,服務端(被動方)提供一個Service來處理客戶端(主動方)連接,維護一個Handler來創建Messenger,在onBind時返回Messenger的binder。

  雙方用Messenger來發送數據,用Handler來處理數據。Messenger處理數據依靠Handler,所以是串列的,也就是說,Handler接到多個message時,就要排隊依次處理。

7.Socket

  Socket方法是通過網路來進行數據交換,注意的是要在子線程請求,不然會堵塞主線程。客戶端和服務端建立連接之後即可不斷傳輸數據,比較適合實時的數據傳輸

二、Android線程間通信方式

  一般說線程間通信主要是指主線程(也叫UI線程)和子線程之間的通信,主要有以下兩種方式:

1.AsyncTask機制

  AsyncTask,非同步任務,也就是說在UI線程運行的時候,可以在後台的執行一些非同步的操作;AsyncTask可以很容易且正確地使用UI線程,AsyncTask允許進行後台操作,並在不顯示使用工作線程或Handler機制的情況下,將結果反饋給UI線程。但是AsyncTask只能用於短時間的操作(最多幾秒就應該結束的操作),如果需要長時間運行在後台,就不適合使用AsyncTask了,只能去使用Java提供的其他API來實現。

2.Handler機制

  Handler,繼承自Object類,用來發送和處理Message對象或Runnable對象;Handler在創建時會與當前所在的線程的Looper對象相關聯(如果當前線程的Looper為空或不存在,則會拋出異常,此時需要在線程中主動調用Looper.prepare()來創建一個Looper對象)。使用Handler的主要作用就是在後面的過程中發送和處理Message對象和讓其他的線程完成某一個動作(如在工作線程中通過Handler對象發送一個Message對象,讓UI線程進行UI的更新,然後UI線程就會在MessageQueue中得到這個Message對象(取出Message對象是由其相關聯的Looper對象完成的),並作出相應的響應)。

三、Android兩個子線程之間通信

  面試的過程中,有些面試官可能會問Android子線程之間的通信方式,由於絕大部分程序員主要關注的是Android主線程和子線程之間的通信,所以這個問題很容易讓人懵逼。

  主線程和子線程之間的通信可以通過主線程中的handler把子線程中的message發給主線程中的looper,或者,主線程中的handler通過post向looper中發送一個runnable。但looper默認存在於main線程中,子線程中沒有Looper,該怎麼辦呢?其實原理很簡單,把looper綁定到子線程中,並且創建一個handler。在另一個線程中通過這個handler發送消息,就可以實現子線程之間的通信了。

  子線程創建handler的兩種方式:

  方式一:給子線程創建Looper對象:

new Thread(new Runnable() {

            public void run() { 

                Looper.prepare();  // 給這個Thread創建Looper對象,一個Thead只有一個Looper對象

                Handler handler = new Handler(){ 

                    @Override 

                    public void handleMessage(Message msg) { 

                        Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show(); 

                    } 

                }; 

                handler.sendEmptyMessage(1); 

                Looper.loop(); // 不斷遍歷MessageQueue中是否有消息

            }; 

        }).start();

---------------------

       方式二:獲取主線程的looper,或者說是UI線程的looper:

new Thread(new Runnable() {

            public void run() { 

                Handler handler = new Handler(Looper.getMainLooper()){ // 區別在這!!! 

                    @Override 

                    public void handleMessage(Message msg) { 

                        Toast.makeText(getApplicationContext(), "handleMessage", Toast.LENGTH_LONG).show(); 

                    } 

                }; 

                handler.sendEmptyMessage(1); 

            }; 

        }).start();

---------------------

Ⅸ Android 跨進程通信--Binder篇

話說Binder 其實是由George Hoffman 老哥,在1991年Be公司啟動了一個「openBinder」的項目,該項目的宗旨是研究一個高效的信號傳遞工具,允許多個軟體相互合作,構成一個軟體系統。在BE被parmSource收購以後,openBinder由hackborn繼續開發。在Hackborn加入google之後,他繼續開發出了Android Binder。

而Android系統是基於Linux內核實現的,Linux已經提供了多種進程間通信機制,比如:管道、消息隊列、共享內存和套接字(Socket)等等。

講它們優缺點前先補充說明:
「進程隔離」--這個技術是為了避免進程A寫入進程B的情況發生。 進程的隔離實現,使用了虛擬地址空間進程A的虛擬地址和進程B的虛擬地址不同,這樣就防止進程A將數據信息寫入進程B。進程隔離的安全性通過禁止進程間內存的訪問可以方便實現。相比之下,一些不安全的操作系統DOS能夠允許任何進程對其他進程的內存進行寫操作。

「虛擬內存」-- 是計算機系統內存管理的一種技術。它使得應用程序認為它擁有連續可用的內存(一個連續完整的地址空間),而實際上,它通常是被分隔成多個物理內存碎片,還有部分暫時存儲在外部磁碟存儲器上,在需要時進行數據交換。與沒有使用虛擬內存技術的系統相比,使用這種技術的系統使得大型程序的編寫變得更容易,對真正的物理內存的使用也更有效率。

注意: 虛擬內存 不只是「用磁碟空間來擴展物理內存」的意思——這只是擴充內存級別以使其包含硬碟驅動器而已。把內存擴展到磁碟只是使用虛擬內存技術的一個結果,它的作用也可以通過覆蓋或者把處於不活動狀態的程序以及它們的數據全部交換到磁碟上等方式來實現。對虛擬內存的定義是基於對地址空間的重定義的,即把地址空間定義為「連續的虛擬內存地址」,以藉此「欺騙」程序,使它們以為自己正在使用一大塊的「連續」地址。

Ⅹ Android進程間通信

1. 簡要說說進程與線程的區別和聯系。

2. 應用內使用多進程可能導致哪些問題?

當一個APP啟用了多進程後,系統會為不同的進程分配不同的內存空間,因此所有需要通過內存共享的行為都會失敗。另外,還會導致以下幾個問題:

3. Android中有哪些進程間通信方式?

由於不同的進程擁有不同的數據空間,所以無論是應用內還是應用間,均無法通過共享內存來實現進程間通信。

進程和線程的主要區別(總結) - CSDN

線程和進程的區別是什麼? - 知乎

Android 多進程通信之幾個基本問題

面試題:IPC(跨進程通信)

閱讀全文

與Android進程之間的通信相關的資料

熱點內容
阿里雲伺服器安裝管理 瀏覽:548
java手機開發教程 瀏覽:672
我的世界怎麼刪除伺服器數據 瀏覽:669
linux內存子系統 瀏覽:970
加密思維幣 瀏覽:688
魅族訪客文件夾 瀏覽:50
添加的文件夾怎麼找 瀏覽:615
程序員涉黃 瀏覽:698
maven編譯resources下的js 瀏覽:519
ubuntu文件移動命令 瀏覽:227
安卓i怎麼查找蘋果手機 瀏覽:949
雲伺服器宕機概率 瀏覽:232
在線買葯用什麼app知乎 瀏覽:815
ubuntu解壓xz文件 瀏覽:676
宏傑加密時電腦關機 瀏覽:390
自己寫單片機編譯器 瀏覽:600
單片機按鍵閃爍 瀏覽:382
為什麼icloud總是顯連接伺服器失敗 瀏覽:890
如何設置域控伺服器 瀏覽:740
想在上海租房子什麼app好 瀏覽:186