Надсилання об’єктів

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())?; }

Speaker Notes

  • Зверніть увагу на використання BnBirthdayInfoProvider. Він слугує тій самій меті, що й BnBirthdayService, який ми бачили раніше.