什么是進程?
進程(Process)是計算機中的程序關(guān)于某數(shù)據(jù)集合上的一次運行活動,是系統(tǒng)進行資源分配和調(diào)度的基本單位,是操作系統(tǒng)結(jié)構(gòu)的基礎(chǔ)。在當(dāng)代的計算機結(jié)構(gòu)中根蟹,進程是線程的容器。程序是指令糟秘、數(shù)據(jù)及其組織形式的描述简逮,進程是程序的實體。進程與進程之間是相互隔離的蚌堵。
進程的特點
動態(tài)性:進程的實質(zhì)是程序在中的一次執(zhí)行過程买决,進程是動態(tài)產(chǎn)生沛婴,動態(tài)消亡的吼畏。
并發(fā)性:任何進程都可以同其他進程一起并發(fā)執(zhí)行
獨立性:進程是一個能獨立運行的基本單位,同時也是系統(tǒng)分配資源和調(diào)度的獨立單位嘁灯;
異步性:由于進程間的相互制約泻蚊,使進程具有執(zhí)行的間斷性,即進程按各自獨立的丑婿、不可預(yù)知的速度向前推進
結(jié)構(gòu)特征:進程由程序性雄、數(shù)據(jù)和進程控制塊三部分組成。
多個不同的進程可以包含相同的程序:一個程序在不同的數(shù)據(jù)集里就構(gòu)成不同的進程羹奉,能得到不同的結(jié)果秒旋;但是執(zhí)行過程中,程序不能發(fā)生改變诀拭。
Android下的進程
在Android中迁筛,每個APP在各自獨立的Dalvik虛擬機中運行,擁有獨立的地址空間和資源耕挨,而Dalvik虛擬機Linux系統(tǒng)下的一個進程细卧。即App進程則為一個虛擬機進程
Android中的每個APP和系統(tǒng)進程都被分配唯一并且固定的User Id(用戶身份標(biāo)識)尉桩,這個uid與內(nèi)核層進程的uid對應(yīng),運行于Dalvik虛擬機的App程序是依托內(nèi)核層Linux進程而存在的贪庙。
因此Android使用Dalvik虛擬機和Linux的文件訪問控制來實現(xiàn)沙箱機制蜘犁,任何應(yīng)用程序如果想要訪問系統(tǒng)資源或者其它應(yīng)用程序的資源必須在自己的manifest文件中進行聲明權(quán)限或者共享uid。
進程間通信
一般來講進程之間是不存在數(shù)據(jù)資源共享和通信的止邮,CPU執(zhí)行時為不同的進程構(gòu)建不同的執(zhí)行上下文这橙,進程在獨立的上下文環(huán)境執(zhí)行計算,也就是說在進程之間是相互獨立無干的导披。
進程間通信就是從文字意義上講就是不同進程之間傳播或交換信息析恋。
如果僅僅是交換信息,那么雙方都可以訪問的介質(zhì)便可達成這種目的盛卡。
那么存在哪些介質(zhì)是雙方都能訪問的呢助隧?
進程的用戶空間是互相獨立的,一般而言是不能互相訪問的滑沧,唯一的例外是共享內(nèi)存區(qū)并村。
另外,系統(tǒng)空間是“公共場所”滓技,各進程均可以訪問哩牍,所以內(nèi)核也可以提供這樣的條件。
此外令漂,還有雙方都可以訪問的外設(shè)膝昆。
在這個意義上,兩個進程當(dāng)然也可以通過磁盤上的普通文件交換信息叠必,或者通過“注冊表”或其它數(shù)據(jù)庫中的某些表項和記錄交換信息荚孵。廣義上這也是進程間通信的手段,但是一般都不把這算作“進程間通信”纬朝。
進程間通信(IPC)是對于程序而言是一組編程接口收叶,讓程序員能夠協(xié)調(diào)不同的進程,使之能在一個操作系統(tǒng)里同時運行共苛,并相互傳遞判没、交換信息。這使得一個程序能夠在同一時間里處理許多用戶的要求隅茎。
因為即使只有一個用戶發(fā)出要求澄峰,也可能導(dǎo)致一個操作系統(tǒng)中多個進程的運行,進程之間必須互相通話辟犀。IPC接口就提供了這種可能性俏竞。每個IPC方法均有它自己的優(yōu)點和局限性,一般,對于單個程序而言使用所有的IPC方法是不常見的胞此。
IPC方法包括管道(PIPE)臣咖、消息排隊、旗語漱牵、共用內(nèi)存以及套接字(Socket)夺蛇。
對于Android來說,它是一種基于Linux內(nèi)核的移動操作系統(tǒng)酣胀,但它的進程間通信方式并不能完全繼承自Linux;相反刁赦,它有自己的進程間通信方式。
在Android中可以通過Binder輕松的實現(xiàn)進程間通信闻镶。Android還支持Socket甚脉,通過Socket可以實現(xiàn)任意兩個終端之間的通信,同一設(shè)備的兩個進程通過Socket通信自然也是可以的铆农。類比內(nèi)網(wǎng)主機間的通信:其實進程間通信從進程獨立來看牺氨,可以把它看成計算機間的通信。比如RPC墩剖,RPC(Remote Procedure Call猴凹,遠程過程調(diào)用)是種C/S的編程模式,在一臺機器上運行的主程序岭皂,可以調(diào)用另一臺機器上準(zhǔn)備好的子程序郊霎。通過RPC可以充分利用非共享內(nèi)存的多處理器環(huán)境,可以簡便地將你的應(yīng)用分布在多臺工作站上爷绘,應(yīng)用程序就像運行在一個多處理器的計算機上一樣书劝。
Android中 進程間通信方式
1、使用Bundle
四大組件中三大組件Activity土至、Service购对、Receiver都支持在Intent中傳遞Bundle數(shù)據(jù)。
由于Bundle實現(xiàn)了Parcelable接口毙籽,所以它可以很方便的在不同的進程間傳輸數(shù)據(jù)洞斯。當(dāng)然我們傳輸?shù)臄?shù)據(jù)必須能夠被序列化,比如基本類型坑赡、實現(xiàn)了Parcelable接口的對象、實現(xiàn)了Serializable接口的對象以及一些Android支持的特殊對象么抗。
2毅否、使用文件共享
兩個進程通過讀寫同一個文件來交換數(shù)據(jù),比如A進程把數(shù)據(jù)寫入文件蝇刀,B進程通過讀取這個文件來獲取數(shù)據(jù)螟加。
Android系統(tǒng)基于Linux,使得并發(fā)讀寫文件可以沒有限制的進行,甚至兩個線程同時對文件讀寫操作都是允許的捆探,盡管可能出問題然爆,因此文件共享方式適合在對數(shù)據(jù)同步要求不高的進程間進行通信。
SharedPreferences也屬于文件的一種黍图,但是由于系統(tǒng)對它的讀寫有一定的緩存策略曾雕,即在內(nèi)存中會有一份SharedPreferences文件的緩存;因此在多進程模式下助被,系統(tǒng)對它的讀寫就變得不可靠剖张,會有很大幾率丟失數(shù)據(jù),不建議在進程間通信中使用SharedPreferences揩环。
3搔弄、使用Messenger
Messenger可以理解為信使,通過它可以再不同進程中傳遞Message對象丰滑,在Message中放入我們需要傳遞的數(shù)據(jù)顾犹,就可以實現(xiàn)數(shù)據(jù)的進程間傳遞了。
Messenger是一種輕量級的IPC方案褒墨,它的底層實現(xiàn)是AIDL蹦渣。由于它一次處理一個請求,因此在服務(wù)端不需要考慮線程同步的問題貌亭,因為服務(wù)端不存在并發(fā)執(zhí)行的情形柬唯。
4、使用AIDL
AIDL是 Android Interface definition language的縮寫圃庭,它是一種android內(nèi)部進程通信接口的描述語言锄奢。AIDL可以處理發(fā)送到服務(wù)器端大量的并發(fā)請求(不同與Messenger的串行處理方式),也可以實現(xiàn)跨進程的方法調(diào)用剧腻。
在Android中使用方法:創(chuàng)建一個Service和一個AIDL接口拘央,接著創(chuàng)建一個類繼承自AIDL接口中的Stub類并實現(xiàn)Stub中的抽象方法,在Service的onBind方法中返回這個類的對象书在,然后客戶端綁定服務(wù)端Service灰伟,建立連接后就可以訪問遠程服務(wù)器了。
5儒旬、使用ContentProvider
ContentProvider是Android中提供的專門用于不同應(yīng)用間進行數(shù)據(jù)共享的方式栏账,天生適合進程間通信。
ContentProvider的底層實現(xiàn)也是Binder栈源,但是它的使用過程比AIDL簡單的多挡爵,因為系統(tǒng)做了封裝,使得無需關(guān)心細節(jié)即可輕松實現(xiàn)IPC甚垦。ContentProvider主要以表格的形式組織數(shù)據(jù)茶鹃,和數(shù)據(jù)庫很類似涣雕,但ContentProvider對底層的數(shù)據(jù)存儲方式?jīng)]有任何要求,既可以使用Sqlite數(shù)據(jù)庫闭翩,也可以使用文件方式挣郭,甚至可以使用內(nèi)存中的一個對象來存儲。
6疗韵、使用Socket
Socket套接字兑障,是網(wǎng)絡(luò)通信中的概念,分為流式套接字和用戶數(shù)據(jù)奧套接字兩種伶棒,對應(yīng)于網(wǎng)絡(luò)的傳輸控制層中的TCP和UDP協(xié)議旺垒。
兩個進程可以通過Socket來實現(xiàn)信息的傳輸,Socket本身可以支持傳輸任意字節(jié)流肤无。