Android必備知識點之IPC(進程間通信/跨進程通信)

1.進程和線程的區別:

進程一般指一個執行單元,在手機上就體現爲一個程序或一個應用。一個進程可以包含多個線程。一般情況下,一個進程中可以只有一個線程,主線程(UI線程),但大多數情況,例如聯網操作,則開啓多個線程做耗時操作。

2.IPC場景:

1>增加應用可使用的內存空間(Android對單個應用所使用的最大內存空間做了限制)

2>需要另外開啓進程做一些工作

3>通過跨進程獲取數據,例如通訊錄數據

首先關注一些應用內部的多進程
1>在AndroidMenifest中指定:android:process=”xxx”,若沒有指定,則默認進程名就是包名

2>通過JNI在native層去fork一個新的進程。(特殊,我也不會)

只研究第一個,可以通過shell來查看進程:adb shellps

強調一點,”:xxx”開頭的進程屬於當前應用的私有進程,其他應用組件不可以和它在同一個進程中,進程名不以”:”開頭的,屬於全局進程

3.多進程模式的運行機制

若在工具類中創建靜態全局變量,A進程中更改了變量值,B進程中不會得到被更改的變量值,也就是說不通進程間數據不共享。所有運行在不同進程中的四大組件,只要它們之間通過內存共享數據,都會共享失敗。

原因:Android爲每一個應用分配了一個獨立的虛擬機,或者說爲每個進程都分配了一個獨立的虛擬機,不同虛擬機在內測分配上有不同的地址空間,導致在不同的虛擬機中訪問同一個類的對象會產生許多分副本。

Serializable 和Parcelable的區別:
Serializable是Java中的序列化接口,使用簡單但是開銷大,序列化和反序列化過程需要大量的I/O操作.Parcelable是Android中的序列化方式,效率高,但是使用麻煩,主要用在內存序列化上,一般講對象序列化後通過網絡傳輸,過程就會稍顯負責,可以用Serializable,其他情況推薦使用Parcelable

4.Android中IPC的方式

1>Binder:(AIDL)
是Android中的一個類,它實現了IBinder接口。從Android應用層來說,Binder是客戶端和服務端進行通信的媒介,當bindService的時候,服務器會返回一個包含服務端業務調用的Binder對象,用過這個Binder對象,客戶端就可以獲取服務端提供的服務或者數據。

2>Intent putExtra

設置方法

intent.putExtra("aaa", "bbbb"); 

獲取方法

this.getIntent().getXXXExtra("aaa") 

3>Bundle

傳輸:

Bundle bundle = new Bundle();
bundle.putXXX("key", "value");

intent.putExtras(bundle);

獲取:

Bundler bundle = getIntent().getExtras();
XXX xx = bundle.getXXX("key");

4>文件共享

5>Messager

6>ContentProvider

7>Socket

socket也叫套接字,分爲流式套接字(TCP)和用戶數據報套接字(UDP)

Android與服務器的通信方式主要有兩種,一是Http通信,一是Socket通信。兩者的最大差異在於,http連接使用的是“請求—響應方式”,即在請求時建立連接通道,當客戶端向服務器發送請求後,服務器端才能向客戶端返回數據。而Socket通信則是在雙方建立起連接後就可以直接進行數據的傳輸,在連接時可實現信息的主動推送,而不需要每次由客戶端想服務器發送請求。

基於TCP協議的Socket:

服務器端首先聲明一個ServerSocket對象並且指定端口號,然後調用Serversocket的accept()方法接收客戶端的數據。accept()方法在沒有數據進行接收的處於堵塞狀態。(Socketsocket=serversocket.accept()),一旦接收到數據,通過inputstream讀取接收的數據。
客戶端創建一個Socket對象,指定服務器端的ip地址和端口號(Socketsocket=newSocket(“172.168.10.108”,8080);),通過inputstream讀取數據,獲取服務器發出的數據(OutputStreamoutputstream=socket.getOutputStream()),最後將要發送的數據寫入到outputstream即可進行TCP協議的socket數據傳輸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章