Android AIDL 简单理解并举例

1. 创建 AIDL 文件

    在 app/src/main/aidl/com/example/myapp 目录下创建 IMyAidlInterface.aidl 文件:

// IMyAidlInterface.aidl
package com.example.myapp;

interface IMyAidlInterface {
    // 定义接口方法
    int add(int a, int b);
    String toUpperCase(String input);
}

    编译后,Android Studio 会自动生成对应的 Java 接口(如 IMyAidlInterface.java)。

2. 实现 Service

    创建一个 Service 并实现 AIDL 接口:

// MyAidlService.java
public class MyAidlService extends Service {
    private final IMyAidlInterface.Stub binder = new IMyAidlInterface.Stub() {
        @Override
        public int add(int a, int b) throws RemoteException {
            return a + b;
        }

        @Override
        public String toUpperCase(String input) throws RemoteException {
            return input != null ? input.toUpperCase() : "";
        }
    };

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

3. 配置 Service

    在 AndroidManifest.xml 中声明 Service,并设置独立进程(模拟跨进程场景):

<service
    android:name=".MyAidlService"
    android:process=":remote" /> <!-- 运行在独立进程 -->

4. 客户端绑定 Service

    在 Activity 中绑定服务并调用远程方法:

// MainActivity.java
public class MainActivity extends AppCompatActivity {
    private IMyAidlInterface myAidlInterface;
    private ServiceConnection connection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            myAidlInterface = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            myAidlInterface = null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 绑定服务
        Intent intent = new Intent(this, MyAidlService.class);
        bindService(intent, connection, Context.BIND_AUTO_CREATE);

        // 调用远程方法示例
        findViewById(R.id.btn_add).setOnClickListener(v -> {
            try {
                if (myAidlInterface != null) {
                    int result = myAidlInterface.add(5, 3);
                    Toast.makeText(this, "5 + 3 = " + result, Toast.LENGTH_SHORT).show();
                }
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(connection); // 解绑服务
    }
}

5. 处理自定义对象(可选)

    若需传递自定义对象(如 User),需实现Parcelable 接口并定义对应 AIDL:

1. 定义 User 类:

// User.java
public class User implements Parcelable {
    private String name;

    public User(String name) { this.name = name; }

    protected User(Parcel in) { name = in.readString(); }

    public static final Creator<User> CREATOR = new Creator<User>() {
        @Override
        public User createFromParcel(Parcel in) { return new User(in); }

        @Override
        public User[] newArray(int size) { return new User[size]; }
    };

    @Override
    public int describeContents() { return 0; }

    @Override
    public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); }

    public String getName() { return name; }
}

2. 创建 User.aidl:

// User.aidl
package com.example.myapp;

parcelable User;

3. 在接口中传递 User:

// IMyAidlInterface.aidl
import com.example.myapp.User;

interface IMyAidlInterface {
    void updateUser(in User user);
}

关键点总结

    AIDL 文件路径:必须放在 aidl 目录下,包名与 Java 代码一致

    跨进程数据类型:支持基本类型、String、List、Map 和 Parcelable 对象

    异常处理:所有远程方法调用需捕获 RemoteException

    线程安全:服务端方法默认运行在 Binder 线程池,需自行处理线程同步。

    通过这个例子,你可以快速理解 AIDL 的基本使用流程。实际开发中可根据需求扩展接口方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容