此文原创,转载请标明网址:http://blog.youkuaiyun.com/buyi006/archive/2011/05/05/6398576.aspx
IBinder是一个远程对象的接口,是一个处理进程内,进程间调用的高性能的轻量级远程呼叫机制。这个接口描述了与远程对象通信的抽象协议,使用时不要实现此接口,而应该去继承Binder类。
Ibinder最重要的方法是transact(),它与Binder的onTransact()相对应。这个方法可以相应对IBinder对象发送调用或者接收调用。此方法是同步的,它会在Binder onTransact()方法执行完后transact()才会返回数据,无论进程内还是进程间执行的是相同的逻辑。
传输数据是通过一个Parcel的对象,最重要的一点是parcel里边会有一个元数据,这个元数据会保证在多个进程中传递的IBinder是同一个对象。
这个IBinder相当于是一个媒介。系统会在每一个进程里去维护一个事物线程池。这些线程可以在进程调用来时供其分配。譬如,有一个IPC从A进程去调用B进程,主调线程在A进程里阻塞,并把此对象发送到B进程,B进程会挑选一个线程去执行Binder.onTransact方法。并且向A进程返回执行结果parcel,A进程在接到此结果后会继续执行相应逻辑。这个机制使你在没有创建任何东东的情况下由其他进程中的线程替你完成了。Binder还支持进程间的循环调用,
说到底这个IBinder其实就是一个信使的作用,以上这些大多数是IBinder sdk的描述,中间加了点自己的理解。
Android实质上就是一个linux系统,要想彻底精通,还需要有c++的基础,linux内核的基础,这样才能把底层搞懂。感觉Android应用开发是一个发展方向,在这个过程中会存在好多奇技淫巧。而底层才是练好内功的根本场所,技术说实话就是控制权,应用层编的再花哨,底层动点手脚给你屏了你也没辙。
废话少说上点代码继续讲点吧:
MessengerService实质就是两个进程之间的通信,信使是Messenger,这个是hanler一个引用,我们可以向它发消息,它能过允许进程间进行基于消息的通信。它是通过在一个进程中创建一个由handler来创建的Messenger和处理来自其他进程的Messenger来实现的。而Messenger里边有个我们上文讲的信使IBinder,这就为我们进程间传递消息扫清了障碍。
service端:
返回一个你所创建在该UI线程的Handler
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
clinet:
还记得上次我们讲Bind方法时的ServiceConnection吗?对了,这次还用相同的办法
private ServiceConnection mConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className,
IBinder service) {
//获得对方传来的IBinder创建一个Messenge来发消息,在本例中我们仅仅是发送一个Messenger过去,具体逻辑可详见此类中Handler代码
mService = new Messenger(service);
...
try {
Message msg = Message.obtain(null,
MessengerService.MSG_REGISTER_CLIENT);
msg.replyTo = mMessenger;
mService.send(msg);
// Give it some value as an example.
msg = Message.obtain(null,
MessengerService.MSG_SET_VALUE, this.hashCode(), 0);
mService.send(msg);
} catch (RemoteException e) {
}
}
public void onServiceDisconnected(ComponentName className) {
mService = null;
}
};
这个例子仅仅讲的是通过bind建立起来的serviceConnection传过来的IBinder对象来建立Messeger来相互发消息。这仅仅是一种应用而已,大家可以根据需要来用。
业精于勤,荒于嬉,学技术一定要一门心思扎进去,要有不是你死就是我亡的决心,坚持不懈,持之以恒,而这个要完全做到实在是太难了,且学且行吧~
此文原创,转载请标明网址:http://blog.youkuaiyun.com/buyi006/archive/2011/05/05/6398576.aspx