做一款app需要網(wǎng)站嗎鄭州百度公司地址
aidl類是實現(xiàn)Manager和Service通信的橋梁。
例如在修改Android Wifi功能的時候看到WifiManager管理WifiService;
AIDL是一種android內(nèi)部進(jìn)程通信接口的描述語言,通過它我們可以定義進(jìn)程間的通信接口。
比如onclick(),用oneway修飾,異步調(diào)用,監(jiān)聽屏幕點擊,點擊后各種處理后,才會回調(diào)到。
aidl的回調(diào)可以使用這種:
void registerVolumeCallback(in IBinder binder);
這里的binder則是客戶端在自己程序里面實現(xiàn)接口。如
private final ICarVolumeCallback mVolumeChangeCallback = new ICarVolumeCallback.Stub() {
本身aild的實現(xiàn)就是一個binder,所以可以傳遞進(jìn)去,然后服務(wù)器里面去回調(diào)binder.xxx函數(shù)。客戶端去實現(xiàn)這個接口的一些函數(shù)。
注意:in、out、inout,是接收發(fā)送對象的所有數(shù)據(jù),
aidl中onway、in、out、inout關(guān)鍵字
1. oneway可以修飾AIDL文件里的方法,oneway修飾的方法在用戶請求相應(yīng)功能時不需要等待響 ?應(yīng)可直接調(diào)用返回,非阻塞效果,該關(guān)鍵字可以用來聲明接口或者聲明方法,如果接口聲明中用到了oneway關(guān)鍵字,則該接口聲明的所有方法都采用oneway方式。
oneway代表這個Binder接口是異步調(diào)用;
oneway void request();//異步執(zhí)行
同一個binder服務(wù)中的oneway方法被多次調(diào)用會排隊執(zhí)行;
不同binder服務(wù)中的oneway方法被同時調(diào)用會同時執(zhí)行;
tips: 一次Binder通信最大可以傳輸多大的數(shù)據(jù)為1M-8K;
binder驅(qū)動對于oneway的調(diào)用是類似于handler sendmessage那樣的,挨個處理,所以如果服務(wù)端的oneway接口處理太慢而客戶端調(diào)用太多的話,來不及處理的調(diào)用會占滿binder驅(qū)動的緩存,導(dǎo)致其他調(diào)用拋出transaction failed ;
2. in 由cilent端流向server端,server端可以收到此對象的所有數(shù)據(jù),收到之后會重新創(chuàng)建一個新的對象將數(shù)據(jù)填充進(jìn)去,因為cilent端和server端是兩個不同的對象,所以server端對數(shù)據(jù)的修改不會影響到client端的對象;
service端對數(shù)據(jù)的改變不會反饋到client端;
非基本數(shù)據(jù)類型和string的參數(shù)類型必須加參數(shù)修飾符, in的意思是只輸入;
3. out 是由server端流向client端,server端實際上不接收client傳入的數(shù)據(jù);在service端自己處理數(shù)據(jù)后結(jié)果返回到client端,client接收service端改變的數(shù)據(jù)結(jié)果;
4. inout 對象可以雙向流動,即server端能收到cilent發(fā)過來的對象的數(shù)據(jù),server端對此對象的操作也能影響到cilent端;
————————————————
? ? ? ? ? ? ? ? ? ? ? ? ? ? 版權(quán)聲明:本文為博主原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接和本聲明。
? ? ? ? ? ? ? ? ? ? ? ??
原文鏈接:https://blog.csdn.net/fengzhiqi1993/article/details/126536035