Service与AIDL跨进程通信

常见述语

IPC(Inter Process Communication)

可以实现安卓设备中进程之间的通信

Binder

Binder是Android的一个类,它实现了IBinder接口。

从IPC角度来说,Binder是Android中的一种跨进程通信方式。

通过这个Binder对象,客户端就可以获取服务端提供的服务或数据,这里的服务包括普通服务和基于AIDL的服务。

实现进程间通信:

方式一:

Messager

定义:Messenger是Google为我们封装好的简洁版的AIDL

方式二:

AIDL(Android Interface Define Language)

定义:AIDL是实现安卓设备中进程间通信的安卓接口定义语言

AIDL-应用(服务器端)

原理:

IntentService应用

  1. 将as切换到Project下,按照如图所示创建文件夹命名为aidl,在aidl文件夹下创建aidl文件,命名为IMyAidlInterface.aidl

2、修改aidl文件,提供一个方法,该方法 就是处理客户端的请求

3、rebuild project之后会发现自动生成一个Java文件:IMyAidlInterface.java

4、在服务端中新建一个类,继承Service,在其中定义一个IBinder类型的变量iBinder,引用上述接口IMyAidlInterface.java类中的Stub类对象,实现其中的add方法,在Service的onBind方法中,返回iBinder变量。最终代码如下:

public class ServerService extends Service {
    //TODO 代理人
    IBinder binder=new IMyAidlInterface.Stub() {
        @Override
        public int add(int num1, int num2) throws RemoteException {
            return num1+num2; }
    };
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }}

5.清单文件中注册SErverService服务,在注册时应设置exported属性为true,保证该Service能被其他应用调用,否则会报

java.lang.SecurityException: Not allowed to bind to service Intent 异常。

Service-前台服务

步骤

1.在客户端创建同样AIDL文件,要求包名AIDL名字必须一致,内容也必须一样提供add方法,rebuild 项目

2.Java代码,绑定服务调用服务器进程的方法

public class MainActivity extends AppCompatActivity {
    IMyAidlInterface iMyAidlInterface;
    //3.绑定服务回调
    private ServiceConnection connection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            //绑定服务成功后,返回服务端返回的binder,将其转成IMyAidlInterface调用add方法
            iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
            try {
                int num=iMyAidlInterface.add(4,6);//调用服务端的add方法并得到结果
                Toast.makeText(MainActivity.this, ""+num, Toast.LENGTH_SHORT).show();
}
 @Override
        public void onServiceDisconnected(ComponentName name) {
            //解除绑定时调用, 清空接口,防止内容溢出
            iMyAidlInterface=null;
        }
    };
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.绑定服务
        Intent intent=new Intent();
        intent.setAction("com.bawei.1609A");//设置action
        intent.setPackage("com.example.aidl_server");//设置服务端应用进程包名
        bindService(intent,connection, Service.BIND_AUTO_CREATE);}
    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection);   }}

3. 服务器端收到内容

Messager

特点

我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。


  1. 客户端和服务端发送的都是message

  1. 使用handler接受消息(客户端和服务端都是)

  1. 不需要编写aidl文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值