AIDL实现跨进程通信

AIDL是Android接口定义语言的意思,它可以用于让某个Service与多个应用程序组件之间进行跨进程通信,从而可以实现多个应用程序共享同一个Service的功能。


首先先写具体的步骤:

  ### 实现方法   ###

  例:用 A程序去访问 B程序的MyService.java服务
1. 在B中建立AIDL文件MyAidlService.AIDL,在AIDL文件里写我们的接口方法
2. 在MyService中写AIDL文件定义的方法的具体服务逻辑
3. 在B的manifest文件中,为Service添加action  "com.liu.servicetest.MyAidlService" 用于A静态来访问Service
(这里是因为,如果用动态Intent (this, MyService.class), 在A中没有MyService这个类) 
4. 把B的AIDL文件夹拷贝到A中,一定要注意包的路径依然为B中的路径
5.在A中利用静态Intent来启动B的服务MyService



对应步骤详细代码:
1. MyAidlService.AIDL
interface MyAidlService {
    int plus(int a, int b);
}


2. MyService.java

public class MyService extends Service{

    MyAidlService.Stub mBinder = new MyAidlService.Stub() {
        @Override
        public int plus(int a, int b) throws RemoteException {
            return a + b;
        }
    };

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

    @Override
    public void onCreate() {
        super.onCreate();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        return super.onStartCommand(intent, flags, startId);
    }


}

3.添加action
<service android:name=".MyService">
            <intent-filter>
                <action android:name="com.liu.servicetest.MyAidlService"/>
            </intent-filter>
        </service>

4.拷贝AIDL文件夹
5.A访问B的服务

Intent intent = new Intent("com.liu.servicetest.MyAidlService");
                bindService(intent, connection, BIND_AUTO_CREATE);

private MyAidlService aidlService;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Log.d("onServiceConnected", "jinlaile");
            aidlService = (MyAidlService) MyAidlService.Stub.asInterface(service);
            try {
                int plus = aidlService.plus(100, 50);//对100和50相加
                Log.d("onServiceConnected", plus + "");
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }


        @Override
        public void onServiceDisconnected(ComponentName name) {


        }
    };


这就是整个流程

看结果:


刚好是150!

注意:
AS和Eclipse建立AIDL文件的方法不一样,详情请看Android Stdio建立AIDL文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值