導航:首頁 > 操作系統 > android進程與進程之間如何通信

android進程與進程之間如何通信

發布時間:2023-05-20 09:00:13

android中的進程通信和Binder機制

如果統觀Binder中的各個組成元素,就會驚奇的發現它和TCP/IP網路有很多相似之處:

首先Binder是android進程間通信的一種方式,
基本原理:binder定義了4個角色:client,server,serviceManager ,binder驅動
server會創建一個binder實體並起一個名字,然後將名字一塊以數據包的形式通漏逗過binder驅動發送給serviceManager ,通知servicemanager注冊歷派一個名字為xx的Binder,肢搜賀然後client通過名字查詢到該Binder 的引用。

注意

② 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 進程間通信的幾種實現方式

Android 進程間通信的幾種實現方式

主要有4種方式:

這4種方式正好對應於android系統中4種應用程序組件:Activity、Content Provider、Broadcast和Service。

主要實現原理:

由於應用程序之間不能共享內存。為了在不同應用程序之間交互數據(跨進程通訊),AndroidSDK中提供了4種用於跨進程通訊的方式進行交互數據,實現進程間通信主要是使用sdk中提供的4組組件根據實際開發情況進行實現數據交互。

詳細實現方式:

Acitivity實現方式

Activity的跨進程訪問與進程內訪問略有不同。雖然它們都需要Intent對象,但跨進程訪問並不需要指定Context對象和Activity的 Class對象,而需要指定的是要訪問的Activity所對應的Action(一個字元串)。有些Activity還需要指定一個Uri(通過 Intent構造方法的第2個參數指定)。 在android系統中有很多應用程序提供了可以跨進程訪問的Activity,例如,下面的代碼可以直接調用撥打電話的Activity。

java">IntentcallIntent=newIntent(Intent.ACTION_CALL,Uri.parse("tel:12345678");
startActivity(callIntent);


Content Provider實現方式

Android應用程序可以使用文件或SqlLite資料庫來存儲數據。Content Provider提供了一種在多個應用程序之間數據共享的方式(跨進程共享數據)

應用程序可以利用Content Provider完成下面的工作

1. 查詢數據
2. 修改數據
3. 添加數據
4. 刪除數據

Broadcast 廣播實現方式

廣播是一種被動跨進程通訊的方式。當某個程序向系統發送廣播時,其他的應用程序只能被動地接收廣播數據。這就象電台進行廣播一樣,聽眾只能被動地收聽,而不能主動與電台進行溝通。在應用程序中發送廣播比較簡單。只需要調用sendBroadcast方法即可。該方法需要一個Intent對象。通過Intent對象可以發送需要廣播的數據。


Service實現方式

常用的使用方式之一:利用AIDL Service實現跨進程通信

這是我個人比較推崇的方式,因為它相比Broadcast而言,雖然實現上稍微麻煩了一點,但是它的優勢就是不會像廣播那樣在手機中的廣播較多時會有明顯的時延,甚至有廣播發送不成功的情況出現。

注意普通的Service並不能實現跨進程操作,實際上普通的Service和它所在的應用處於同一個進程中,而且它也不會專門開一條新的線程,因此如果在普通的Service中實現在耗時的任務,需要新開線程。

要實現跨進程通信,需要藉助AIDL(Android Interface Definition Language)。Android中的跨進程服務其實是採用C/S的架構,因而AIDL的目的就是實現通信介面。


總結

跨進程通訊這個方面service方式的通訊遠遠復雜於其他幾種通訊方式,實際開發中Activity、Content Provider、Broadcast和Service。4種經常用到,學習過程中要對沒種實現方式有一定的了解。

④ Android進程間通信

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

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

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

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

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

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

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

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

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

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

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

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

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

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

⑥ 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進程間通信的四種方式

由於應用程序之間不能共享內存。在不同應用程序之間交互數據(跨進程通訊),在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 進程間通信 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進程間和線程間通信方式

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

  線程:是進程的一個實體,是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進程與進程之間如何通信相關的資料

熱點內容
amdlinux顯卡安裝 瀏覽:564
泰海科技雲伺服器如何卸載 瀏覽:122
有密碼打開excel加密 瀏覽:818
java生成重復字元 瀏覽:280
串口伺服器有什麼用 瀏覽:328
linux安裝red5 瀏覽:295
單片機中斷時入口地址作用 瀏覽:148
程序員的工作是重復性的嗎 瀏覽:67
照片怎麼轉換成pdf 瀏覽:133
女生學編程好嗎 瀏覽:240
目前絕地求生怎麼看伺服器地址大全 瀏覽:825
論人類不平等的起源pdf 瀏覽:436
壓縮機螺桿加工 瀏覽:368
怎麼把網站伺服器設置在境外 瀏覽:162
單片機編程取反 瀏覽:897
51單片機課程設計課題 瀏覽:900
手機淘寶登錄怎麼加密碼 瀏覽:486
linux快捷方式圖標 瀏覽:38
陽光車險的app叫什麼名字 瀏覽:462
購買單片機的器件時需要給商家啥 瀏覽:535