C

QAndroidBroadcastTransmitter 类

用于发送广播的实用类。 更多...

头文件 #include <QAndroidBroadcastTransmitter>
CMake find_package(Qt6 REQUIRED COMPONENTS AndroidAutomotiveBase)
target_link_libraries(mytarget PRIVATE Qt6::AndroidAutomotiveBase)
自从QtAndroidAutomotive 6.5
继承 QObject

公共类型

公共函数

QAndroidBroadcastTransmitter(QObject *parent = nullptr)
virtual~QAndroidBroadcastTransmitter() override
voidsendBroadcast(const QAndroidIntentInfo &intent, const QString &receiverPermission = QString())
voidsetBundleFunctor(QAndroidBroadcastTransmitter::BundleFunctor functor)

静态公共成员

voidsetGlobalBundleFunctor(QAndroidBroadcastTransmitter::BundleFunctor functor)

详细描述

此类允许用户通过 sendBroadcast 使用来发送广播。

以下是通过 QAndroidBroadcastTransmitter 发送的 QAndroidIntentInfo 的基本示例

QAndroidIntentInfo intent;
intent.setAction("org.qt.io.example.action.ACTION_DATE");

QVariantMap extras = {
    { "date", QDate::currentDate() }
};
intent.setExtras(extras);

QAndroidBroadcastTransmitter transmitter;
transmitter.sendBroadcast(intent);

用于发送广播的意图类将使用 BundleFunctor 通过内部和外部转换函数将 QVariant 额外信息转换为它们的 Java 等效类型,此 API 提供了一系列默认转换函数,可以处理以下转换

C++ 类型Java 类型
QStringString
intint
shortshort
unsigned shortchar
char

unsigned char

byte
long longlong
doubledouble
boolboolean
QVariantMapBundle,通过递归调用此转换函数生成。
QByteArraybyte[]
QVariantList

QList

QStringList

以下类型受到支持。具有多种变量类型的 QVariantLists 将被丢弃。
  • QString
  • int
  • long long
  • short
  • unsigned short
  • char
  • unsigned char
  • float
  • double
  • bool

如果这些默认转换器不足以使用户想发送一些自定义类型,API 提供了可以通过 setBundleFunctorsetGlobalBundleFunctor 设置的 本地全局 BundleFunctor 转换函数。

在打包广播额外数据用于广播时,将使用这些BundleFunctors。仅在已注册到的QAndroidBroadcastTransmitter实例中使用的局部BundleFunctor,而全局BundleFunctors将由所有QAndroidBroadcastTransmitter实例使用。

成员类型文档

QAndroidBroadcastTransmitter::BundleFunctor

这是一个特殊类型的函数类型定义,用于将数据从QVariant表示形式转换为QJniObject引用的Bundle。

函数在完成给定值的转换后应返回true,如果函数无法或不应用于转换值,则返回false。这意味着如果用户根本不希望转换给定值,他们可以不向给定的QJniObject添加任何数据而返回false

第一个参数将是QJniObject表示的Android Bundle的引用。

第二个参数将是应转换的QVariant数据。这些数据可能是从sendBroadcast()函数传递的整个QVariantMap或来自那个QVariantMap的单个QVariant

用户可以使用QVariant::metaType()方法和qMetaTypeId宏来检测参数是QVariant还是QVariantMap,如下所示

QVariant variant = QVariantMap();
if (variant.metaType().id() == qMetaTypeId<QVariantMap>()) {
    // QVariant variable contains a QVariantMap.
}

第三个参数将是QVariantMap中从根到当前值的键的路径,如果没有键路径,则表明传递的QVariant数据是完整的QVariantMap数据。

此代码片段显示了如何使用BundleFunctor将包含在QDate中的年、月和日从QVariant写入一个Android Bundle,然后写入由QAndroidBroadcastTransmitter提供的bundle中。这样,我们可以在一个Bundle中包含所有所需日期数据,并通过“date”键进行识别。

请注意,当我们处理完QDate后,返回true以确保在此数据上不使用默认转换函数。

Q_DECLARE_JNI_CLASS(AndroidBundle, "android/os/Bundle")

const QAndroidBroadcastTransmitter::BundleFunctor dateConverter = [] (
        QJniObject &bundle,
        const QVariant &variant,
        const QStringList &keys) {
    if (keys.empty() || keys.last() != "date")
        return false;

    if (variant.metaType().id() != qMetaTypeId<QDate>())
        return false;

    QJniObject dateBundle(QtJniTypes::Traits<QtJniTypes::AndroidBundle>::className());
    QDate date = variant.toDate();

    const auto yearKey = QJniObject::fromString("year");
    const auto yearString = yearKey.object<jstring>();
    dateBundle.callMethod<void>("putInt", yearString, date.year());

    const auto monthKey = QJniObject::fromString("month");
    const auto monthString = monthKey.object<jstring>();
    dateBundle.callMethod<void>("putInt", monthString, date.month());

    const auto dayKey = QJniObject::fromString("day");
    const auto dayString = dayKey.object<jstring>();
    dateBundle.callMethod<void>("putInt", dayString, date.day());

    const auto dateKey = QJniObject::fromString("date");
    const auto dateString = dateKey.object<jstring>();
    bundle.callMethod<void>("putBundle",
                            dateString,
                            dateBundle.object<QtJniTypes::AndroidBundle>());

    return true;
};

另请参阅setBundleFunctor

成员函数文档

[显式] QAndroidBroadcastTransmitter::QAndroidBroadcastTransmitter(QObject *parent = nullptr)

使用指定的parent构造一个QAndroidBroadcastTransmitter。

[重写虚拟异常] QAndroidBroadcastTransmitter::~QAndroidBroadcastTransmitter()

销毁QAndroidBroadcastTransmitter

void QAndroidBroadcastTransmitter::sendBroadcast(const QAndroidIntentInfo &intent, const QString &receiverPermission = QString())

使用给定的 intent 发送广播。调用者可以选择要求接收者具有接收此广播的 receiverPermission 权限。

void QAndroidBroadcastTransmitter::setBundleFunctor(QAndroidBroadcastTransmitter::BundleFunctor functor)

本地 QAndroidBroadcastTransmitter::BundleFunctor 设置为 functor

[静态] void QAndroidBroadcastTransmitter::setGlobalBundleFunctor(QAndroidBroadcastTransmitter::BundleFunctor functor)

全局 QAndroidBroadcastTransmitter::BundleFunctor 设置为 functor

注意:所有 QAndroidBroadcastTransmitter 实例都将使用 全局 BundleFunctors。

许可证限制。
了解更多信息。