AIDL终极篇之AIDL架构设计

本文是AIDL设计的终极篇,探讨如何解决随着项目发展,服务请求类型增多带来的问题。提出了一种新的AIDL架构,通过IBinder管理器和服务端、客户端的特定设计,实现职责分离,避免服务器被拖垮,并减少连接次数。详细解析了服务端和客户端的架构,提供了代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本技术博文计划分为三个系列:
一、AIDL的基础,http://blog.youkuaiyun.com/wangqiubo2010/article/details/78601666
二、AIDL之Messenger,http://blog.youkuaiyun.com/wangqiubo2010/article/details/78615047.。
三、AIDL终极篇之AIDL架构设计。


本文为AIDL设计的终极篇,AIDL架构设计。

在设计这个架构设计之前,思考一个问题:随着项目越来越大,如果请求的服务器中的服务类型越来越多,按照普通的设计有两种办法。
第一,服务器所执行的方法全部放在一个或者少量几个类中,这里有个问题就是,多种不同类型的请求全部塞在一个类中,并且类越来越庞大,这和职责分离完全背离。

第二,建立无数个service,每个service实现一种类型服务,也即是每种类型都生成一个IBinder,并且会有无数个链接,这样的设计服务器迟早会被拖垮。


针对以上问题,现在就是对AIDL的设计架构进行改进。

AIDL新设计架构图如下:
这里写图片描述

对本架构进行解析:

服务端架构解析:
1、IBinder1、IBinder2、IBinder3…,这些都是根据各种功能类型实现的每个Stub。

2、AIDLPoolService(IBinder管理器)。
AIDLPoolService其实就是客户端需要连接的服务,但是本服务提供给客户端的IBinder其实是一个IBinder管理器,本管理器只有一个方法queryBinder,这个方法就是根据ID来分发查询所需要类型的IBinder,入上面的IBinder1、IBinder2等。

服务器这样的设计就能解决以上2个问题。
第一,IBinder1、IBinder2、IBinder3…,无论你有多少种类型的功能,都可以无限增加,既解决了职责分离问题,又实现了动态增加功能。
第二,本架构连接服务器只会请求一次,请求成功之后,后续只要传一个IBinder的ID就可以查询到所需求的IBinder,则客户端获取到之后就可以直接调用服务器的方法。

客户端架构解析:
1、client1、client2、client3……,就是客户端每个功能模块了。
2、AIDLPoolClient,封装了对Service的连接,有一个IBinder查询器,client1、client2、client3……只要传个ID过去就可以直接获取到所需求的IBinder。


以上架构代码如下:

//AIDLPoolService(IBinder管理器)。
package com.example.myservice;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.support.annotation.Nullable;

/**
 * Created by wangqiubo on 2017/5/17.
 */

public class AidlPoolService extends Service{
   
   
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return aidlPool;
    }

    private static IBinder aidlPool = new AidlPoolImpl();
}
//AidlPoolImpl.java
package com.example.myservice;

import android.os.Debug;
import android.os.IBinder;
import android.os.RemoteException;

import com.example.wangqiubo.myaidl.IAidlPool;

/**
 * Created by wangqiubo on 2017/5/17.
 */

public class AidlPoolImpl extends IAidlPool.Stub {
   
   
    public static final int BOOK_BINDER_ID = 0;
    public static final int USER_BINDER_ID = 1;
    IBinder mBinder = null;
    @Override
    public IBinder queryBinder(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值