Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Передача объектов

Объекты 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, который мы видели ранее.