Android SDK 开发之应用程序基础
2010-03-23 04:53:00 来源:WEB开发网一般的,这些远程进程将被一个服务来管理(因为一个服务可以通知系统一个进程和其他进程的连接)。该服务既有aidl工具生成的接口文件又有实现RPC方法的Stub的子类。该服务的客户将只有aidl工具生成的接口文件。
下面是一个service和一个client建立连接的过程:
service的client(在本地端)实现onServcieConnected()和onServiceDisconnected()方法,这样它们就可以在连接成功和断开成功后被通知。它们可以通过bindService()来建立连接。
service的onBind()方法将接受或拒绝连接,根据它接收到的intent(发送给bindService()的intent)。如果连接接受了,它将返回一个Stub类的实例。
如果service接受了连接,Android调用client的onServiceConnected()方法并将其传给一个IBinder对象 — 由service管理的Stub子类的一个代理。通过该代理,client可以调用远程方法。
Thread-safe methods
在一些情况下,你实现的方法可能被多于一个线程来调用。因此它们必须被写成线程安全的。
这一点对于可以远程调用的方法来说一般都是正确的——就像上一节所说的RPC机制一样。当一个IBinder对象实现的方法在IBinder的同一个进程中调用时,该方法是在调用者的线程中进行的。但是,当该调用在另外一个进程时,该方法是在Android维护的一个位于IBinder进程中的线程池中的一个线程中调用的;它不是在进程的主线程中调用的。例如,一个service的onBind()方法会被该service的进程中的主线程调用,使用 onBind()返回的对象实现的方法(例如,一个实现RPC方法的Stub子类)将被从线程池中的线程调用。由于service可以有多于一个的 client,多于一个的线程池线程可以同时处理相同的IBinder方法。因此IBinder方法必须被实现为线程安全的。
类似的,一个content provider可以接收另一个进程中的请求。虽然ContentResolver和ContentProvider隐藏了进程间通信的细节,ContentProvider响应请求的方法——query(),insert(),delete(),update()以及getType() ——是从content provider进程的线程池中运行的,而不是进程的主线程。由于这些方法可以被任意多线程同时调用,因此它们也需要被实现为线程安全的。
Component Lifecycles
应用程序的component有生命周期—从一开始Android初始化它们使它们响应intent到结束时它们被销毁。在其间,它们有时候有效有时候无效,对于activity来说,有时候对用户可见有时候不可见。本节讨论activity,service以及broadcast
更多精彩
赞助商链接