【Android】使用Binder池减少Service进程数

  1. 定义Binder池AIDL接口:IBinderPool
  2. 统一管理Binder池:BinderPoolManager
  3. 实现WorkService
  4. 拓展各业务模块Binder

IBinderPool.aidl

interface IBinderPool {
    IBinder query(in int code);
}

BinderPoolManager.java

// BinderPoolManager.java

public class BinderPoolManager {
    public static final int CODE_MODULE_A = 0x000;
    public static final int CODE_MODULE_B = 0x001;

    private static BinderPoolManager sInstance;

    public static BinderPoolManager getInstance(Context context) {
        if (null == sInstance) {
            synchronized (BinderPoolManager.class) {
                if (null == sInstance) {
                    sInstance = new BinderPoolManager(context);
                }
            }
        }
        return sInstance;
    }

    private Context mAppContext;
    private ServiceConnection mConnection;
    private IBinderPool mBinderPool;
    private IBinder.DeathRecipient mDeathRecipient;

    public IBinder query(int code) {
        if (null != mBinderPool && mBinderPool.asBinder().isBinderAlive()) {
            try {
                return mBinderPool.query(code);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    private BinderPoolManager(Context context) {
        mAppContext = context.getApplicationContext();
        mDeathRecipient = new IBinder.DeathRecipient() {
            @Override
            public void binderDied() {
                mBinderPool.asBinder().unlinkToDeath(mDeathRecipient, 0);
                // 清空连接
                mBinderPool = null;
                // 断开重连
                connectService();
            }
        };
        mConnection = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                Log.e("BinderPool", "onServiceConnected: ");
                mBinderPool = IBinderPool.Stub.asInterface(service);
                try {
                    mBinderPool.asBinder().linkToDeath(mDeathRecipient, 0);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
            }
        };
        // 连接服务
        connectService();
    }

    private synchronized void connectService() {
        mAppContext.bindService(new Intent(mAppContext, WorkService.class),
                mConnection, Context.BIND_AUTO_CREATE);
    }

    public static class BinderPoolImpl extends IBinderPool.Stub {

        @Override
        public IBinder query(int code) throws RemoteException {
            switch (code) {
                case CODE_MODULE_A:
                    return new ModuleAImpl();
                case CODE_MODULE_B:
                    return new ModuleBImpl();
                default:
                    return null;
            }
        }
    }
}

WorkService.java

public class WorkService extends Service {
    private Binder mBinderPool = new BinderPoolManager.BinderPoolImpl();
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return mBinderPool;
    }
}

业务模块A

// IModuleA.aidl
interface IModuleA {
    void work();
}

// ModuleAImpl.java
public class ModuleAImpl extends IModuleA.Stub{
    @Override
    public void work() throws RemoteException {
        Log.e("ModuleAImpl", "work: ");
    }
}

业务模块B

// IModuleB.aidl
interface IModuleB {
    void work();
}

// ModuleBImpl.java
public class ModuleBImpl extends IModuleA.Stub {
    @Override
    public void work() throws RemoteException {
        Log.e("ModuleBImpl", "work: ");
    }
}

客户端调用:MainAcitivty.java

public class MainActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        // 可在Application中初始化
        BinderPoolManager.getInstance(getApplicationContext());

        findViewById(R.id.imageView).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                IBinder iBinder = BinderPoolManager.getInstance(getApplicationContext())
                        .query(BinderPoolManager.CODE_MODULE_A);
                if(null == iBinder){
                    Log.e("Main", "onClick: binder is null" );
                    return;
                }
                IModuleA iModuleA = ModuleAImpl.asInterface(iBinder);
                try {
                    // 注意:此方法会使客户端挂起,本应运行在子线程中
                    iModuleA.work();
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
        });
    }
}

参考《Android开发艺术探索》

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值