美文网首页Android 开发经验集
AIDL如何实现跨进程调用Service参考资料

AIDL如何实现跨进程调用Service参考资料

作者: Android技术研究 | 来源:发表于2016-03-02 16:51 被阅读203次

    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的绑定之后由系统回调.

    链接地址:android笔记--Service与AIDL

    相关文章

      网友评论

        本文标题:AIDL如何实现跨进程调用Service参考资料

        本文链接:https://www.haomeiwen.com/subject/pmunkttx.html