導航:首頁 > 操作系統 > android進程間通訊

android進程間通訊

發布時間:2022-05-23 11:51:07

A. 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種經常用到,學習過程中要對沒種實現方式有一定的了解。

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

Android進程間通信的幾種方式 定義多進程
第一:Android應用中使用多進程只有一個辦法(用NDK的fork來做除外),就是在AndroidManifest.xml中聲明組件時,用android:process屬性來指定。
不知定process屬性,則默認運行在主進程中,主進程名字為包名。
android:process = package:remote,將運行在package:remote進程中,屬於全局進程,其他具有相同shareUID與簽名的APP可以跑在這個進程中。
android:process = :remote ,將運行在默認包名:remote進程中,而且是APP的私有進程,不允許其他APP的組件來訪問。
第二:多進程引發的問題
靜態成員和單例失效:每個進程保持各自的靜態成員和單例,相互獨立。
線程同步機制失效:每個進程有自己的線程鎖。
SharedPreferences可靠性下降:不支持並發寫,會出現臟數據。
Application多次創建:不同進程跑在不同虛擬機,每個虛擬機啟動會創建自己的Application,自定義Application時生命周期會混亂。
綜上,不同進程擁有各自獨立的虛擬機,Application,內存空間,由此引發一系列問題。
第三: 進程間通信
Bundle/Intent傳遞數據:
可傳遞基本類型,String,實現了Serializable或Parcellable介面的數據結構。Serializable是Java的序列化方法,Parcellable是Android的序列化方法,前者代碼量少(僅一句),但I/O開銷較大,一般用於輸出到磁碟或網卡;後者實現代碼多,效率高,一般用戶內存間序列化和反序列化傳輸。
文件共享:
對同一個文件先後寫讀,從而實現傳輸,linux機制下,可以對文件並發寫,所以要注意同步。順便一提,Windows下不支持並發讀或寫。
Messenger:
Messenger是基於AIDL實現的,服務端(被動方)提供一個Service來處理客戶端(主動方)連接,維護一個Handler來創建Messenger,在onBind時返回Messenger的binder。
雙方用Messenger來發送數據,用Handler來處理數據。Messenger處理數據依靠Handler,所以是串列的,也就是說,Handler接到多個message時,就要排隊依次處理。
AIDL:
AIDL通過定義服務端暴露的介面,以提供給客戶端來調用,AIDL使伺服器可以並行處理,而Messenger封裝了AIDL之後只能串列運行,所以Messenger一般用作消息傳遞。
通過編寫aidl文件來設計想要暴露的介面,編譯後會自動生成響應的java文件,伺服器將介面的具體實現寫在Stub中,用iBinder對象傳遞給客戶端,客戶端bindService的時候,用asInterface的形式將iBinder還原成介面,再調用其中的方法。
ContentProvider:
系統四大組件之一,底層也是Binder實現,主要用來為其他APP提供數據,可以說天生就是為進程通信而生的。自己實現一個ContentProvider需要實現6個方法,其中onCreate是主線程中回調的,其他方法是運行在Binder之中的。自定義的ContentProvider注冊時要提供authorities屬性,應用需要訪問的時候將屬性包裝成Uri.parse("content://authorities")。還可以設置permission,readPermission,writePermission來設置許可權。 ContentProvider有query,delete,insert等方法,看起來貌似是一個資料庫管理類,但其實可以用文件,內存數據等等一切來充當數據源,query返回的是一個Cursor,可以自定義繼承AbstractCursor的類來實現。
Socket:
學過計算機網路的對Socket不陌生,所以不需要詳細講述。只需要注意,Android不允許在主線程中請求網路,而且請求網路必須要注意聲明相應的permission。然後,在伺服器中定義ServerSocket來監聽埠,客戶端使用Socket來請求埠,連通後就可以進行通信。

C. android中eventbus能夠實現進程間通信嗎

不可以用於多進程。EventBus貌似就是訂閱者模式,而在多進程中,對象是不一致的,需要通過binder才能進行多進程通信,在這方面EventBus不支持,自然就不支持多進程了。

D. 安卓多線程間通信和多進程之間通信有什麼不同

一般都是基於ARM處理器的吧 安卓的內核也是基於Linux的吧。 網路實現依靠TCP/IP協議棧實現實行封包和解包以及連接的建立和控制,還涉及到你手機的硬體網卡等。 進程間通信方式一般採用的消息隊列,共享內存,套接字,還有管道了。 多線程是由操作系統來管理每個線程的CPU時間和資源的分配。也是比較復雜的,涉及到線程間通信,線程同步等。 內存管理是由操作系統進行分段,分頁。分配機制比較復雜的,涉及到碎片的減少,內存的回收等。 要想了解詳細內容,可以看看Linux操作系統原理。或者google提供的相關文檔。

E. android進程間通信有幾種方式

這里進程間通信有幾種方式,它總有三種方式,這個可以進行。

F. android 進程間的通信(IPC)方式有哪些

Android是基於linux內核的。所以linux支持的IPC,android都用到了。比如命名管道,共享內存。 除此外,android還使用了一套自己獨特的IPC方式 binder. 主要用於2個進程間的遠程調用。但是這里就牽扯遠程調用如何傳遞參數,如何回傳結果。 這需要調用者對數據進行打包和解包,是一個繁瑣的過程。為此,android引入了aidl(android interface description launguage). 開發人員定義好aidl,android會根據aidl的描述生產stub代碼,幫助調用者對數據打包,解包。開發人員所要做的事是繼承stub代碼,實現stub代碼中的函數。這些函數是你在aidl中定義的。

G. android進程間的通信有aidl和binder機制,請問兩者的原理是什麼,以及兩者的區別是什麼

binder是內核層的驅動程序,相當於協議之類的東西,aidl其實是rpc,也是進程間的通信,底層也是基於binder機制的

H. android進程間通訊方式有哪些

Android中實現不同應用進程間通訊,需要用到AIDL技術,以下為AIDL服務端和客戶端實現步驟:

一、服務端:
1、在AndroidManifest.xml中定義的包路徑下新建一個文件,擴展名為.aidl(如:IXxxService.aidl),系統會在gen中自動生成對應的.java文件(如:IXxxService.java)
2、在aidl文件中編寫介面方法,語法同java區別不大。注意:方法參數支持java基本類型(int、long、boolean等)和(String、List、Map、CharSequence)
其它復雜類型需要自定義(實現Parcelable.Creator介面及其方法)。
3、在包路徑新建一個繼承 android.app.Service 的服務類,在該類中定義繼承 IXxxService.Stub 抽象類的內部類並實現抽象方法,如:

[java] view plainprint?

public class XxxService extends Service {
public class XxxServiceImpl extends IXxxService.Stub {
//implements methods
...

}

@Override
public IBinder onBind(Intent intent) {
XxxServiceImpl impl = new XxxServiceImpl();
return impl; //必須返回 XxxServiceImpl 的實例
}
}

4、在AndroidManifest.xml中注冊上面定義的服務

[java] view plainprint?

<!-- 注冊服務 -->
<service android:name="包路徑.XxxService" >
<intent-filter>
<!-- 指定調用AIDL服務的ID -->
<action android:name="包路徑.IXxxService" />
</intent-filter>
</service>

二、客戶端
1、將服務端中自動生成的IXxxService.java文件拷貝到客戶端工程,注意:文件所在包路徑必須和服務端完全一致。
2、服務可以封裝成幫助類調用,也可以直接在Activity中調用,後者如:

[java] view plainprint?

// Activity 中聲明服務介面變數
private IXxxService serviceInterface;

// Activity onCreate()方法中創建ServiceConnection對象,並初始化serviceInterface
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 獲得AIDL服務對象
serviceInterface = IXxxService.Stub.asInterface(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {
}
};

// 綁定服務,AIDL_SERVICE_ID 為 "一、服務端 4、" 中提到的「指定調用AIDL服務的ID」
bindService(new Intent(AIDL_SERVICE_ID), serviceConnection, Context.BIND_AUTO_CREATE);

注意:在Activity 的 onDestory 方法中調用解除綁定服務的方法:unbindService(serviceConnection);

3、在按鈕點擊等事件中就可以調用服務中定義的方法了,如:serviceInterface.xxxMethod();

注意:服務端 XxxService 不能定義為單例的,否則無法調用

I. Android中線程與線程,進程與進程之間如何通信

使用handler發送message,消息隊列排隊

進程是一個具有獨立功能的程序關於某個數據集合的一次運行活動。它可以申請和擁有系統資源,是一個動態的概念,是一個活動的實體。它不只是程序的代碼,還包括當前的活動,通過程序計數器的值和處理寄存器的內容來表示。
進程是一個「執行中的程序」。程序是一個沒有生命的實體,只有處理器賦予程序生命時,它才能成為一個活動的實體,我們稱其為進程。
通常在一個進程中可以包含若干個線程,它們可以利用進程所擁有的資源。在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位。由於線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統內多個程序間並發執行的程度。
線程和進程的區別在於,子進程和父進程有不同的代碼和數據空間,而多個線程則共享數據空間,每個線程有自己的執行堆棧和程序計數器為其執行上下文。多線程主要是為了節約CPU時間,發揮利用,根據具體情況而定。線程的運行中需要使用計算機的內存資源和CPU。

J. android怎麼與pc上的進程進行rpc通信

理解Android系統的進程間通信原理(二)----RPC機制

理解Android系統中的輕量級解決方案RPC的原理,需要先回顧一下JAVA中的RMI(Remote Method Invocation)這個易於使用的純JAVA方案(用來實現分布式應用)。有關RMI的相關知識,可以通過下圖來歸納:
RMI原理 (2)
Android中的RPC也是參考了JAVA中的RMI方案,這里我們再詳細了解一下RPC的實現過程。
Android中的RPC機制是為了實現一個進程使用另一個進程中的遠程對象,它使用了Android自己的AIDL(介面定義語言),使用戶很方便地定義出一個介面作為規范,通過一個遠程Service為代理 ,客戶端在綁定該遠程Service過程中獲取遠程對象,進而使用該對象。可參考下圖所示:
Android的RPC原理及應用 (2)
補充:RPC的另一個目的是對客戶端只聲明介面及方法,隱藏掉具體實現類,供客戶端直接獲取此介面實例。
實例代碼:
實例一:通過Service來遠程調用一個介面子類的函數方法
功能描述:在MainActivity中通過綁定MyService服務類,來遠程調用MyPlayer(實現了IPlayer介面)的方法過程。需要定義一個IPlayer.aidl文件,ADT工具會自動生成一個IPlayer介面類,然後再由MyPlayer繼承IPlayer介面類中的靜態內部抽象類,實現介面方法,進而供其它應用程序遠程調用。(在本例中為了方便,MainActivity與MyService類同處一個應用程序中,實現運用時,可以不在同一個應用程序中,只要有許可權訪問MyService服務,就能得到IPlayer介面,進而執行該介面實例方法)
程序清單:IPlayer.aidl

閱讀全文

與android進程間通訊相關的資料

熱點內容
注冊伺服器地址指什麼 瀏覽:431
文本命令行 瀏覽:95
撲克牌睡眠解壓 瀏覽:190
rc4演算法流程圖 瀏覽:159
胡蘿卜解壓方法 瀏覽:35
掃描pdf格式軟體 瀏覽:876
程序員在銀行開賬戶 瀏覽:516
android資料庫下載 瀏覽:749
中午伺服器崩潰怎麼辦 瀏覽:425
產品經理和程序員待遇 瀏覽:442
解憂程序員免費閱讀 瀏覽:109
錄像免壓縮 瀏覽:508
總結所學過的簡便演算法 瀏覽:362
南昌哪些地方需要程序員 瀏覽:761
三台伺服器配置IP地址 瀏覽:175
如何用命令方塊連續對話 瀏覽:280
win7linux共享文件夾 瀏覽:304
命令符打開本地服務 瀏覽:601
android應用程序源碼 瀏覽:705
安卓開發工程師簡歷怎麼寫 瀏覽:63