Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Service都可以进行跨进程,Android系统采用了远程过程调用(RPC)方式来实现跨进程调用服务(Service),对于Service的跨进程调用需要通过AIDL来实现,关于如何实现aidl service请看本文介绍
一、问题描述
Android应用程序的四大组件中Activity、BroadcastReceiver、ContentProvider、Service都可以进行跨进程。在上一篇我们通过ContentProvider实现了不同应用之间的跨进程调用,但ContentProvider主要是提供数据的共享(如sqlite数据库),那么我们希望跨进程调用服务(Service)呢?Android系统采用了远程过程调用(RPC)方式来实现。与很多其他的基于RPC的解决方案一样,Android使用一种接口定义语言(Interface Definition Language,IDL)来公开服务的接口。对于Service的跨进程调用需要通过AIDL来实现,AIDL服务应用非常广泛,如百度地图API中,就提供跨进程的服务,下面我们就看看如何实现AIDL Service ,案例如图:
链接地址:Android应用程序四大组件之使用AIDL如何实现跨进程调用Service
Service是android中的服务组件, 经常用来执行一些运行在后台的耗时操作. 使用一个Service需要继承Service类, 并根据需要重写生命周期方法. Service的生命周期如下:
|--public abstract IBinder onBind(Intent intent): 该方法是一个抽象方法, 因此Service子类必须实现这个方法. 它返回一个IBinder对象, 应用程序可以通过这个对象与Service组件通信(关于这一点, 其后会有详细的讲解), 以bindService()方式启动Service时回调该方法.
|--public void onCreate(): 当Service第一次被创建后回调的方法.
|--public void onDestroy(): Service关闭之前回调的方法.
|--public int onStartCommand(Intent intent, int flags, int startId): 以startService(Intent intent)的方式启动Service时, 系统都会回调该方法.
|--public boolean onUnbind(Intent intent): 当所有绑定该Service的组件都断开连接时回调该方法.
从图中可以看出, Service可以有两种启动方式:
1. 以startService(Intent intent)的方式启动. 此时启动的Service与调用者之间没有关联, 即使调用者已经退出, Service仍然可以继续运行, 而且调用者和Service之间无法进行数据交换和通信. 如果需要停止Service的运行, 只能调用Context类的stopService(intent)方法, 或者由Service本身调用其stopSelf()等方法.
2. 以bindService(Intent service,ServiceConnection conn, int flags)的方式启动.
此时调用者与Service绑定在一起, 如果调用者退出, 则Service也随之退出, 而且调用者和Service之间可以进行数据交换或通信.
根据调用者和Service是否在一个应用程序内, 可以将调用者和Service之间的通信分为进程内通信和进程间通信.
a. 进程内通信. bindService(Intent service, ServiceConnection conn, int flags)方法的第二个参数为ServiceConnection对象, 最后一个参数通常可以是Service.BIND_AUTO_CREATE. ServiceConnection是一个接口, 该接口包含2个方法:
|-- onServiceConnected(ComponentName name, IBinder service): 该方法在调用者和Service成功绑定之后由系统回调.
方法中的第一个参数ComponentName是所绑定的Service的组件名称, 而IBinder对象就是Service中onBinder()方法的返回值. 要实现调用者和Service之间的通信, 只需要调用IBinder对象中定义的方法即可.
|-- onServiceDisconnected(ComponentName name): 该方法在调用者解除和Service的绑定之后由系统回调.
网友评论