Передача объектов
Объекты AIDL можно передавать либо как конкретный тип AIDL, либо как интерфейс IBinder со стёртым типом:
birthday_service/aidl/com/example/birthdayservice/IBirthdayInfoProvider.aidl:
package com.example.birthdayservice;
interface IBirthdayInfoProvider {
String name();
int years();
}
birthday_service/aidl/com/example/birthdayservice/IBirthdayService.aidl:
import com.example.birthdayservice.IBirthdayInfoProvider;
interface IBirthdayService {
/** То же самое, но с использованием объекта binder. */
String wishWithProvider(IBirthdayInfoProvider provider);
/** То же самое, но с использованием `IBinder`. */
String wishWithErasedProvider(IBinder provider);
}
birthday_service/src/client.rs:
// Copyright 2024 Google LLC
// SPDX-License-Identifier: Apache-2.0
/// Структура Rust, реализующая интерфейс `IBirthdayInfoProvider`.
struct InfoProvider {
name: String,
age: u8,
}
impl binder::Interface for InfoProvider {}
impl IBirthdayInfoProvider for InfoProvider {
fn name(&self) -> binder::Result<String> {
Ok(self.name.clone())
}
fn years(&self) -> binder::Result<i32> {
Ok(self.age as i32)
}
}
fn main() {
binder::ProcessState::start_thread_pool();
let service = connect().expect("Failed to connect to BirthdayService");
// Создаём объект binder для интерфейса `IBirthdayInfoProvider`.
let provider = BnBirthdayInfoProvider::new_binder(
InfoProvider { name: name.clone(), age: years as u8 },
BinderFeatures::default(),
);
// Отправляем объект binder сервису.
service.wishWithProvider(&provider)?;
// Выполняем ту же операцию, но передаём провайдера как `SpIBinder`.
service.wishWithErasedProvider(&provider.as_binder())?;
}
- Обратите внимание на использование
BnBirthdayInfoProvider. Он выполняет ту же роль, что иBnBirthdayService, который мы видели ранее.