AIDL Service实现跨进程通信

本文详细介绍了如何使用AIDL实现Android的跨进程通信。从创建AIDL接口文件,定义远程Service,配置AndroidManifest.xml,到客户端绑定Service并访问数据,展示了完整的AIDL Service通信流程。此外,还讲解了传递自定义类型时需要实现Parcelable接口的步骤。
摘要由CSDN通过智能技术生成

AIDL Service用于在不同进程间进行数据交换,即所谓的跨进程通信(interprocess communication,简称IPC)

与绑定本地Service不同的是,本地Service的onBind()方法会直接把IBinder对象本身传给客户端的ServiceConnection的onServiceConnected()方法的第二个参数。但远程Service的onBind()方法只是将IBinder对象的代理传给客户端的ServiceConnection的onServiceConnected()方法的第二个参数

1、创建AIDL接口文件

AIDL的语法与Java接口很相似,但是有几点要求:

(1) AIDL定义的接口文件必须以.aidl结尾
(2) AIDL接口中用到的数据类型,除了基本类型、String、List、Map、CharSequence之外,其他类型都需要导入包,即使在同一个包中也需要导入

新建客户端工程,创建IBook.aidl文件:

package com.example.testaidlservice;

interface IBook {
   
    String getName();
    int getPageCount();
}

定义好IBook.aidl接口文件后,ADT工具会自动在gen目录下生成一个IBook.java文件,在java文件里包含一个Stub内部类,该内部类实现了IBinder、IBook两个接口,因此可作为Service的onBind()方法的返回值,这个Stub类将会作为远程Service的回调类

2、定义远程Service类

新建类BookService.java继承Service类

public class BookService extends Service {
   

    private BookBinder bookBinder;
    private String bookName = "Android开发艺术探索";
    private int pageCount = 524;

    public class BookBinder extends Stub {
   
        @Override
        public String getName() throws RemoteException {
            // TODO Auto-generated method stub
            return bookName;
        }
        @Override
        public int getPageCount() throws RemoteException {
            // TODO Auto-generated method stub
            return pageCount;
        }
    }

    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        bookBinder = new BookBinder();
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        return bookBinder;
    }

}

3、在AndroidManifest.xml中配置该Service

<service android:name="com.example.testaidlservice.BookService">
            <intent-filter >
                <action android:name="com.example.testaidlservice.BOOK_SERVICE"/>
            </intent-filter>
        </service>

配置好以后,就可以在客户端调用远程Service了,Service端目录结构:

这里写图片描述

4、客户端访问AIDL Service

AIDL接口定义了两个进程之间的通信接口,所以客户端也需要用到AIDL接口。所以在创建客户端后,要将Service端的AIDL接口文件复制到客户端,复制后ADT工具会生成相应的接口文件

客户端绑定到远程Service需要两步:

(1)创建ServiceConnection对象
(2)调用Context的bindService()方法绑定远程Service

客户端界面布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.testaidlservice.MainActivity" >

    <Button 
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值