Android多进程通信(1)----代码架构推荐

在实际的项目中,如果进程A和进程B进行AIDL绑定通信,通常B进程中的Service不止一个。

这时候采用将A进程和B进程的一个MainService绑定,再通过MainService获得B进程中其他service的接口。这样一来,绑定了一个MainService就可以与所有service交互。 代码的架构将清晰明了。
进程主Service的AIDL文件IMainInterface.aidl:
interface IMainInterface{
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    IBinder getFirstService();
    IBinder getSecodService();
}


进程的其他Service的AIDL文件IFirstInterface.aidl和ISecondInterface.aidl
interface IFirstInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    String getString(String s);
}

interface ISecondInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    int add(int a, int b);
}


新建每个aidl的Stub文件  MyMainStub.java  MyFirstStub.java MySecondStub.java
public class MyMainStub extends IMainInterface.Stub{

    @Override
    public IBinder getFirstService() throws RemoteException {
        return new MyFirstStub();
    }

    @Override
    public IBinder getSecodService() throws RemoteException {
        return new MySecondStub();
    }
}

public class MyFirstStub extends IFirstInterface.Stub{

    @Override
    public String getString(String s) throws RemoteException {
        return s.toUpperCase();
    }
}

public class MySecondStub extends ISecondInterface.Stub {
    @Override
    public int add(int a, int b) throws RemoteException {
        return a+b;
    }
}


新建每个Service文件 MainService.java FirstService.java SecondService.java
public class MainService extends Service {

    MyMainStub myMainStub = new MyMainStub();

    @Override
    public IBinder onBind(Intent intent) {
        return myMainStub;
    }
}

public class FirstService extends Service{

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

public class SecondService extends Service {

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }
}

在进程的非主service当中onbind返回null即可。

在MainActivity当中使用:
serviceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mService = IMainInterface.Stub.asInterface(service);

        /*try {
            IBinder iBinder = mService.getFirstService();
            fService  = IFirstInterface.Stub.asInterface(iBinder);
            mTextView.setText(fService.getString("helloword"));
        } catch (RemoteException e) {
            e.printStackTrace();
        }*/

        try {
            IBinder iBinder = mService.getSecodService();
            sService = ISecondInterface.Stub.asInterface(iBinder);
            mTextView.setText(sService.add(5, 5) + "");
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
    }
};

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值