安卓AIDL简单详解

Nafisa ·
更新时间:2024-11-13
· 640 次阅读

**最近我学习到安卓AIDL这篇文章,我又翻阅大佬的一些文章,整合我自己的了解来简单详解这篇文章。
AIDL简介
AIDL是 Android Interface definition language的缩写,我们从中可以看出有Interface,我们才知道AIDL是安卓接口定义语言,可以实现安卓设备中进程之间的通信,也可以用于单个service与多个程序之间进行跨进程通讯,从而实现多个应用使用单个service。
官方表达是:AIDL可以简化进程间数据格式转换和数据交换的代码,它允许在不同进程的调用者和Service之间相互传递数据,其属于轻量级的进程通信机制。
注意:
AIDL定义接口的源代码必须以.aidl结尾。
AIDL接口中用到的数据类型,除了基本类型、String、List、Map和CharSequence外,其他类均需要导入所在包,即使它们在同一个包中也需要导入包。
AIDL
优点:通讯速度快,支持实时通讯,支持一对多并发通讯,支持远程过程调用,系统底层直接共享内存,性能稳定,效率高。
缺点:使用复杂,需要创建AIDL文件,需要处理好线程同步问题。

话不多说,直接上案例:
在这里插入图片描述
这样直接创建安卓自带的AIDL,创建一个名为IMyAidlInterface的AIDL。
这是安卓会自动创建如下所示:
在这里插入图片描述
然后在IMyAidlInterface编写如下代码:

interface IMyAidlInterface { String getString(); void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString); }

然后创建一个名为MyService的服务,具体如何创建我之前讲过
链接: https://blog.csdn.net/jzdcuccess/article/details/105654145如果想看如何创建的可以点击连接。
MyService中的代码如下:

public class MyService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { return super.onStartCommand(intent, flags, startId); } @Override public void onDestroy() { super.onDestroy(); } class MyBind extends IMyAidlInterface.Stub{ public String getString() { String string="这就是所使用AIDL返回的结果"; return string; } @Override public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException { } } @Override public IBinder onBind(Intent intent) { return new MyBind(); } }

之前绑定服务创建的MyBind是实现IBinder继承字Binder而现在是继承IMyAidlInterface.Stub。Stub是IMyAidlInterface中的一个静态抽象类,继承自Binder并实现IMyAidlInterface接口,其继承了android.os.Binder、
实现IaidlData接口故,我们实际需要实现的是Stub抽象类。
在java中编写如下代码:

public class MainActivity extends AppCompatActivity implements View.OnClickListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button bind_service=(Button)findViewById(R.id.bind_service); Button unbind_service=(Button)findViewById(R.id.unbind_service); bind_service.setOnClickListener(this); unbind_service.setOnClickListener(this); } public ServiceConnection connection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { IMyAidlInterface myAidlInterface=IMyAidlInterface.Stub.asInterface(service); try { String str=myAidlInterface.getString(); Toast.makeText(MainActivity.this,str,Toast.LENGTH_SHORT).show(); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override public void onClick(View v) { switch (v.getId()){ case R.id.bind_service: Intent intent=new Intent(); intent.setAction("com.example.aidl2.service"); intent.setPackage("com.example.aidl2"); bindService(intent,connection,BIND_AUTO_CREATE); break; case R.id.unbind_service: unbindService(connection); break; default: break; } } }

其它的和绑定服务一样,但是有一点不知道你们看出来了吗? intent.setPackage(“com.example.aidl2”);为什么要加入这一行代码呢?
setPackage()表示设置包名。
在AIDL中必须要指明包名,包名必须和java目录下的包名一致。
路径必须一致.如果你的实体类放在com.example.aidl2下,在aidl下也得新建的aidl放在此目录下.不然类无法找到,编译不通过.
最后别忘了在AndroidManifest.xml中配置:
在这里插入图片描述
一个简单的运用AIDL的案例就写完了。
如何错误,请斧正。


作者:小鹿迷鹿



aidl

需要 登录 后方可回复, 如果你还没有账号请 注册新账号