Binder远程转本地
前言
在[031]Binder線程棧復用中,我們說到Binder驅動通過“線程棧復用”減少線程數,我們來講一講另外一個機制“遠程轉本地”,將遠程Binder調用轉化成本地方法調用。
一、寫個Demo
interface IServiceB {void sendMsg(String msg); }1.1 Client端
public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);//獲得Service B的服務Intent intent = new Intent(this, ServerB.class);this.bindService(intent, new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {Log.v("KobeWang", "serviceB:" + service);IServiceB serviceB = IServiceB.Stub.asInterface(service);try {serviceB.sendMsg("hello ServiceB");} catch (RemoteException re) {}}@Overridepublic void onServiceDisconnected(ComponentName name) {}}, Context.BIND_AUTO_CREATE);} }1.2 Server端
public class ServerB extends Service {@Overridepublic IBinder onBind(Intent intent) {return new ServiceB();}public class ServiceB extends IServiceB.Stub {@Overridepublic void sendMsg(String msg) throws RemoteException {Log.v("KobeWang", "get msg : " + msg);}} }注意android:process=":server"這個代碼,后面要刪除對比測試
<serviceandroid:name=".ServerB"android:exported="true"android:process=":server"></service>二、運行結果
2.1 android:process=":server"
此時ServiceB(pid=7120)和Client端(pid=7073)運行在不同進程
Client端拿到的service是ServiceB的遠程代理類BinderProxy
ServiceB響應發生pid=7120進程,響應代碼也是從Binder驅動中execTransact觸發的。
2.2 刪除android:process=":server"之后
此時ServiceB和Client端運行在同一進程(pid=7384)
Client端拿到的service直接是ServiceB的這個類(繼承Binder)
響應代碼堆棧就像是直接調用ServiceB的sendMsg方法。
三、總結
大家看明白了吧,這就是Binder遠程轉本地的機制,一個Binder對象同一個進程中拿到的是Binder對象本身,另一個進程中拿到的是BinderProxy代理類,跨進程調用也就變成了本地方法調用,提升Binder通信效率。
上面是兩個進程,這個機制適用于多個進程傳遞同一個Binder對象。
進程A將Binder A通過Binder方法傳遞給進程B,進程B拿到的是BinderProxy A
進程B又將BinderProxy A通過Binder方法傳遞給進程C,進程C拿到的還是BinderProxy A
進程C將BinderProxy A通過Binder方法傳遞給進程A,進程A拿到的卻是Binder A
記住一句話
一個IBinder對象(Binder或者BinderProxy)通過Binder方法傳遞的時候,Binder驅動就會校驗遠程轉本地這個機制。如果發現這個IBinder對象的服務端(Binder)定義在本進程,就直接返回Binder對象,否則返回BinderProxy對象。
四、思考
AIDL oneway的這個標識符是不是在Binder遠程轉本地的時候,是不是也就失去了意思?
面試官問你:Binder服務端oneway方法sleep10秒,是否會導致client端sleep10秒?
你應該知道怎么回答了吧。
? 回復「?籃球的大肚子」進入技術群聊
回復「1024」獲取1000G學習資料
總結
以上是生活随笔為你收集整理的Binder远程转本地的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 杂记 什么是ABC记谱法
- 下一篇: linux下hadoop 环境搭建