Надсилання об'єктів
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 {
/** Те саме, але з використанням об'єкта-зв'язки. */
String wishWithProvider(IBirthdayInfoProvider provider);
/** Те саме, але з використанням `IBinder`. */
String wishWithErasedProvider(IBinder provider);
}
birthday_service/src/client.rs:
/// 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("Не вдалося підключитися до BirthdayService");
// Створюємо об'єкт-зв'язувач для інтерфейсу `IBirthdayInfoProvider`.
let provider = BnBirthdayInfoProvider::new_binder(
InfoProvider { name: name.clone(), age: years as u8 },
BinderFeatures::default(),
);
// Надсилаємо об'єкт-зв'язку до сервісу.
service.wishWithProvider(&provider)?;
// Виконуємо ту саму операцію, але передаємо провайдера як `SpIBinder`.
service.wishWithErasedProvider(&provider.as_binder())?;
}
- Зверніть увагу на використання
BnBirthdayInfoProvider
. Він слугує тій самій меті, що йBnBirthdayService
, який ми бачили раніше.