day18 Service-AIDL进程间通信

本文详细介绍AIDL(Android Interface Define Language)的概念及其在安卓设备中实现进程间通信(IPC)的方法。通过一个具体示例,展示如何在客户端和服务端应用之间通过AIDL进行数据交换,包括AIDL文件的创建、服务端的实现与注册、客户端的绑定与调用等关键步骤。

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

Service-AIDL进程间通信

AIDL简介
AIDL,全称是Android Interface Define Language,即安卓接口定义语言,可以实现安卓设备中进程之间的通信(Inter Process Communication, IPC)。安卓中的服务分为2类:本地服务(网络下载大文件,音乐播放器,后台初始化数据库的操作);远程服务(远程调用支付宝进程的服务。。)

AIDL的使用
假设有如下场景,需要计算a+b的值,在客户端中获取a和b的值,然后传递给服务端,服务端进行a+b的计算,并将计算结果返回给客户端。
这里的客户端和服务端均是指安卓设备中的应用,由于每一个应用对应一个进程,由此可以模拟安卓系统中通过AIDL进行进程之间的通信。
1、服务端moudle:aidl_server
(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变量。最终代码如下:
(5)清单文件中注册SErverService服务,在注册时应设置exported属性为true,保证该Service能被其他应用调用,否则会报
java.lang.SecurityException: Not allowed to bind to service Intent 异常。
2、客户端moudle:aidl_client
(1)在客户端创建同样AIDL文件,要求包名AIDL名字必须一致,内容也必须一样提供add方法,rebuild 项目
(2)Java代码,绑定服务调用服务器进程的方法
注意:先启动服务端,在启动客户端
服务端:创建aidl文件并编辑提供方法–》rebuild—>创建服务,onbind方法中返回一个binder对象—》注册服务
客户端:创建aidl文件和服务端一模一样–》rebuild–〉绑定服务调用方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

//服务段 服务类   
//主类什么也不用做
public class MyService extends Service {
   IBinder binder= new IMyAidlInterface.Stub(){

       @Override
       public int add(int num1, int num2) throws RemoteException {
           return num1+num2;
       }
   };
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }
}

//清单文件注册
  <service android:name=".MyService" android:exported="true">
            <intent-filter>
                <action android:name="com.liurui"></action>
            </intent-filter>
        </service>
//客户端主类
public class MainActivity extends AppCompatActivity {
    IMyAidlInterface iMyAidlInterface;
        private ServiceConnection serviceConnection=new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iMyAidlInterface=IMyAidlInterface.Stub.asInterface(service);

            try {
                int add = iMyAidlInterface.add(7, 7);
                Toast.makeText(MainActivity.this, add+"", Toast.LENGTH_SHORT).show();
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            iMyAidlInterface=null;
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Intent intent=new Intent();
        intent.setAction("com.liurui");
        intent.setPackage("com.example.day17_aidl_service");
        bindService(intent,serviceConnection,BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(serviceConnection);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值