參考資料
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0418/4158.html
http://blog.csdn.net/coding_glacier/article/details/7520199 底層實(shí)現(xiàn)
一宴凉、AIDL的理解
AIDL:Android Interface Definition Language,即Android接口定義語言普舆,這是一種用于Android的跨進(jìn)程通信(IPC)的工具恬口。
在android中一個(gè)進(jìn)程不允許直接訪問另一個(gè)進(jìn)程的內(nèi)存的,也就是說不能訪問另一個(gè)進(jìn)程中的應(yīng)用奔害。在android中允許有多進(jìn)程楷兽,因此多進(jìn)程通信可以在自己的應(yīng)用中進(jìn)行通信地熄,也可以在不同應(yīng)用中通信华临,而這便是AIDL的使用方向。但是AIDL有個(gè)缺點(diǎn)端考,那就是比較耗資源雅潭。
使用aidl進(jìn)行通信,通常有服務(wù)端和客戶端的概念
二却特、如何使用AIDL
1.首先要在main目錄下建立一個(gè)aidl文件夾
2.在aidl文件夾下創(chuàng)建一個(gè)aidl文件
3.模擬一個(gè)服務(wù)端扶供,使用:服務(wù)名稱 的方式創(chuàng)建一個(gè)服務(wù)
4.遠(yuǎn)程服務(wù)負(fù)責(zé)創(chuàng)建aidl接口
1.在遠(yuǎn)程服務(wù)中,創(chuàng)建Binder對(duì)象裂明。使用Stub()方法創(chuàng)建
2.在onBind中返回該對(duì)象
5.客戶端接入
1.將服務(wù)端保存AIDL文件的包名原封不動(dòng)的復(fù)制,并且在client的AIDL文件夾下建立相同的包椿浓,并考入AIDL文件
(包名必須要相同,可以將包原封不動(dòng)的拷貝到客戶端)
2.使用bind啟動(dòng)的方式綁定遠(yuǎn)程服務(wù),和遠(yuǎn)程服務(wù)建立關(guān)系
Intent serviceIntent = new Intent();
//通過包名顯示的啟動(dòng)一個(gè)Service 第一個(gè)參數(shù)為app的包名 第二個(gè)為app中Service的全路徑
serviceIntent.setComponent(new ComponentName("com.tjpld.aidlservicetest", "com.tjpld.aidlservicetest.AppService"));
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
3.ServiceConnection中客戶端創(chuàng)建aidl對(duì)象
4.客戶端調(diào)用aidl中定義好的方法,向服務(wù)端寫入值
加入我們?cè)赼idl中定義的方法是:setData(String data)扳碍,那么在使用時(shí):
進(jìn)程包活(灰色碧岵恚活+守護(hù)進(jìn)程)
灰色保活:它是利用系統(tǒng)的漏洞來啟動(dòng)一個(gè)前臺(tái)的Service進(jìn)程笋敞,與普通的啟動(dòng)方式區(qū)別在于碱蒙,它不會(huì)在系統(tǒng)通知欄處出現(xiàn)一個(gè)Notification,看起來就如同運(yùn)行著一個(gè)后臺(tái)Service進(jìn)程一樣夯巷。這樣做帶來的好處就是赛惩,用戶無法察覺到你運(yùn)行著一個(gè)前臺(tái)進(jìn)程(因?yàn)榭床坏絅otification),但你的進(jìn)程優(yōu)先級(jí)又是高于普通后臺(tái)進(jìn)程的(因?yàn)閷?shí)際上他是通過startForeground開啟的一個(gè)前臺(tái)進(jìn)程)。
大于18的時(shí)候
雙守護(hù)進(jìn)程
1.思路就是兩個(gè)進(jìn)程的服務(wù)互相監(jiān)聽趁餐,當(dāng)一個(gè)服務(wù)啟動(dòng)后喷兼,立即啟動(dòng)和綁定另一個(gè)服務(wù),并且互相監(jiān)聽后雷,當(dāng)其中一個(gè)發(fā)現(xiàn)另一個(gè)服務(wù)斷開時(shí)褒搔,立即啟動(dòng)斷開的服務(wù)并且重新綁定。
假設(shè)有兩個(gè)服務(wù):LocalService,RemoteServcie
在LocalService中:
(1)啟動(dòng)時(shí)立即綁定遠(yuǎn)程服務(wù):
(2)監(jiān)聽遠(yuǎn)程服務(wù):
在RemoteService中同樣:
低層實(shí)現(xiàn)
總結(jié)了鏈接文章中的內(nèi)容
1.Binder機(jī)制:client-server的通信結(jié)構(gòu)。client在請(qǐng)求和server通信時(shí),首先會(huì)去差serviceManager中是否有這個(gè)service踪栋,有的話service通過bind-driver提供一份對(duì)應(yīng)service的代理纱扭,client不會(huì)直接操作server的方法 而是通過操作server對(duì)應(yīng)的代理對(duì)象,代理對(duì)對(duì)象有和server一樣的方法燎字。client向server發(fā)送數(shù)據(jù)時(shí)打包成parcel包,交給bind-driver。每個(gè)server都由serviceManage管理念逞,注冊(cè)在serviceMananger中。serviceManager會(huì)不斷查詢bind-driver中是否有數(shù)據(jù)發(fā)給指定的service边翁。client端向service發(fā)送數(shù)據(jù)時(shí)會(huì)bpbinder對(duì)象翎承,調(diào)用它的onTrance方法向binddriver里寫入數(shù)據(jù),service在會(huì)有一個(gè)bnbinder調(diào)用onTrancact方法解包數(shù)據(jù)符匾,調(diào)用service對(duì)應(yīng)的方法叨咖。