《Android Dev Guide》系列教程5:Android进程和线程
>http://www.apkbus.com/data/attachment/forum/201105/06/171716c45caggcu8x3c24a.jpg这两个内部类包含了所有你需要管理员远程调用你用IDL声明的接口的代码(太拗口)。两个内部类都要事先IBinder接口。其中一个在本地使用,你写代码时可以不用处理它,另一个是Stub,继承自Binder类。为了使IPC调用的内部代码有效,它包含了你用RPC接口所声明的方法。你可以继承Stub类来实现哪些方法,像上图那样。通常情况下,远程进程会被一个后台服务所管理,因为服务可以通知系统给进程发消息,并且能连接到其他进程。他不仅包含了由aidl工具生成的接口文件,并且浩瀚Stub的子类事先RPC的方法。一个服务的客户端可以可以只有aidl工具生成的借口文件。
下面是一个服务和他的客户端是如何建立链接:
@服务的客户端(在本地端)实现onServiceConnected()和onServiceDisconnected()方法,所以当一个既定的远程服务链接成功时、或者断开连接时,他们可以被通知到。调用bindService()方法可以建立连接。
@服务的onBind()方法可以实现接受或者拒绝方法。这取决于接收到的Intent(bindService())。如果连接被接受了,他会返回一个Stub子类的实例。
@如果服务接受了连接,Android会调用客户端的onServiceConnected()方法,并且传递给一个IBinder对象,IBinder对象是一个被服务管理的Stub子类的代理。通过代理,客户端可以调用远程方法。
上面简短的介绍省略了一些RPC机制的细节。更多信息可以查看Designing a Remote Interface Using AIDL或者IBinder类的介绍。
在一个新的contexts里,你实现的方法可能被多于1个的线程调用,因此必须是线程安全的。
这就是为什么被叫做远程方法,就像上节讨论的RPC机制一样。当调用一个实现自IBinder对象的方法时,此方法和IBinder一样属于同一个进程,那么方法在调用者的线程里执行。然而,如果在其他的进程里调用方法,那么方法在一个从Android维护的和IBinder在同意进程里的线程池里选择的一个线程里运行(太直译了),而不在主线程里运行。例如,一个服务的onBind()方法可以被服务所在进程的主线程所调用。onBind()返回的对象所实现的方法(例如一个实现RPC方法的Stub的子类)可以被线程池的方法调用。因为服务可以有多个客户端,同时可以有多个线程池服务于相同的IBinder方法。IBinder方法必须是方法安全的。
同样的,一个content provider内容提供商可以接收来自其他进程的数据请求。尽管ContentResolver和ContentProvider隐藏了管理进程间通信的细节,ContentProvider 方法响应这些需求:query方法,insert方法,delete方法,update更新方法,和getType方法,从contentProvider进程的线程池的线程里被调用,而不是主线程里。他们也可能同时被多个线程调用,所以也必须是线程安全的。
页:
[1]
