Android AIDL接口

一.AlDI接口简介

AIDL(Android Interface Definition Language)是一种 IDL 语言,用于生成可以在 Android 设备上两个进程之间进行进程间通信(IPC)的代码。 通过 AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。通常,暴露方法给其他应用进行调用的应用称为服务端,调用其他应用的方法的应用称为客户端,客户端通过绑定服务端的 Service 来进行交互。

二.AIDL的语法

AIDL的语法和Java基本是一样的,只是在一些细微处有些许差别------毕竟它只是被创造出来简化Android程序员工作的。

列举一下AIDL和Java不一样的地方:

①文件类型:用AIDL书写的文件的后缀是.aidl,而不是.java。

②数据类型:AIDL默认支持一些数据类型,八种基本数据类型,包括byte,short,int,long,float,double,boolean,char。

三.AIDL的简单使用

使用方法比较方便,直接在main目录下new一个就可以了:

新建完之后要build一下,不然没有接口类使用:

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

接着新创建一个服务,也是new出来(第一张图的Service处)

然后在清单文件将这个Service指定进程:(进程名字自定义,但前面要加个点,不然apk安装不上)

复制代码
<application
 
        ...
 
        <service
 
            ...
 
            android:process=".kang">
        </service>
 
        ...
      
</application>

public class MyService extends Service {
 
    @Override
    public IBinder onBind(Intent intent) {
        return new MyBind();
    }
 
    static class MyBind extends IMyAidlInterface.Stub{
 
        @Override
        public String getString() {
            return "我是AIDL的返回值";
        }
 
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) {
 
        }
    }
}

在Activity中:

复制代码
public class MainActivity5 extends AppCompatActivity {
 
    IMyAidlInterface myAidlInterface;  //AIDL
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn = findViewById(R.id.button);
 
        btn.setOnClickListener((v) -> {
            Intent intent = new Intent(this, MyService.class);
            startService(intent);
            bindService(intent, mConnection, BIND_AUTO_CREATE);
        });
    }
 
    public ServiceConnection mConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            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) { }
    };
}

这样在点击按钮后就会启动一个新进程服务,然后通过AIDL进行跨进程通信。

AIDL是安卓开发中实现跨进程通信的一种机制,通过定义接口和使用AIDL文件生成的Java类,可以方便地在不同应用程序之间进行方法调用和数据传输。这对于需要将功能模块拆分到不同进程的复杂应用程序或多个应用程序之间的协作非常有用。

相关推荐
liang_jy5 小时前
Android SparseArray
android·源码
liang_jy6 小时前
Activity 启动流程扩展篇(一)—— startActivityInner 任务决策全解析
android·源码
NPE~7 小时前
[App逆向]脱壳实战
android·教程·逆向·android逆向·逆向分析
木易 士心7 小时前
别再只会用 drawCircle 了!一文搞懂 Android Canvas 底层机制
android
AtOR CUES9 小时前
MySQL——表操作及查询
android·mysql·adb
怣疯knight10 小时前
安卓App无法增加自定义图片作为图标功能
android
jinanwuhuaguo11 小时前
OpenClaw联邦之心——从孤岛记忆到硅基集体潜意识的拓扑学革命(第二十三篇)
android·人工智能·kotlin·拓扑学·openclaw
Gary Studio13 小时前
安卓HAL C++基础-命名域
android
诸神黄昏EX13 小时前
Android Google XTS
android
eSsO KERF14 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql