Sending Objects
AIDL objects can be sent either as a concrete AIDL type or as the type-erased IBinder interface:
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 {/** The same thing, but using a binder object. */String wishWithProvider(IBirthdayInfoProvider provider);/** The same thing, but using `IBinder`. */String wishWithErasedProvider(IBinder provider);}
birthday_service/src/client.rs:
/// Rust struct implementing the `IBirthdayInfoProvider` interface.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");// Create a binder object for the `IBirthdayInfoProvider` interface.let provider = BnBirthdayInfoProvider::new_binder(InfoProvider { name: name.clone(), age: years as u8 },BinderFeatures::default(),);// Send the binder object to the service.service.wishWithProvider(&provider)?;// Perform the same operation but passing the provider as an `SpIBinder`.service.wishWithErasedProvider(&provider.as_binder())?;}
- Note the usage of
BnBirthdayInfoProvider. This serves the same purpose asBnBirthdayServicethat we saw previously.