C

QAndroidBroadcastReceiver 类

允许接收使用自定义 Intent Filters 的广播。 更多信息...

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

公共类型

公共函数

QAndroidBroadcastReceiver(QObject *parent = nullptr)
QAndroidBroadcastReceiver(QAndroidIntentFilter *filter, QObject *parent = nullptr)
boolhasConverter(const QString &javaTypename) const
QAndroidIntentFilter *intentFilter() const
voidregisterConverter(const QString &javaTypename, QAndroidBroadcastReceiver::ExtraToVariantFunc func)
boolrunning()
voidsetIntentFilter(QAndroidIntentFilter *filter)
boolunregisterConverter(const QString &javaTypename)

公共槽

boolstart()
boolstop()

信号

voidintentFilterChanged()
voidjniObjectReceived(const QJniObject &intent)
voidreceived(const QAndroidIntentInfo &intent)

静态公共成员

boolhasGlobalConverter(const QString &javaTypename)
voidregisterGlobalConverter(const QString &javaTypename, QAndroidBroadcastReceiver::ExtraToVariantFunc func)
boolremoveGlobalConverter(const QString &javaTypename)

详细描述

此类将自动使用 QAndroidBroadcastReceiver::ExtraToVariantFunc 函数来转换意图内接收到的额外数据。

以下是一个通过 QAndroidIntentFilter 使用和解析额外数据的特定动作的筛选器的基本示例

QAndroidIntentFilter filter{ "org.qt.io.example.action.ACTION_DATE" };
QAndroidBroadcastReceiver receiver(&filter);
QObject::connect(&receiver,
                 &QAndroidBroadcastReceiver::received,
                 [] (const QAndroidIntentInfo &intent) {
    const auto dateVariant = intent.extras().value("date");
    qDebug()<<dateVariant;
    if (dateVariant.metaType().id() == qMetaTypeId<QDate>()) {
        QDate date = dateVariant.toDate();
        qDebug() << "Received date: " << date;
    }
});

为了用户不需要为所有基本类型提供自定义转换函数,API 中有一些转换已经在内部处理。也可以使用 registerConverterregisterGlobalConverter 来覆盖默认转换。

  • Bundle,请参阅有关 Bundle 转换的说明。
  • jstring
  • jboolean
  • jbyte
  • jchar
  • jshort
  • jint
  • jlong
  • jfloat
  • jdouble

注意:遍历捆绑包,并使用可用的转换器将每个值转换为用户提供的本地和全局转换器。

成员类型文档

QAndroidBroadcastReceiver::ExtraToVariantFunc

这是一个 std::function<QVariant(const QStringList&, const QJniObject&)> 的 typedef,这是一个用于将 Java 类型数据转换为 QVariants 的特殊函数。

每当接收到新的广播时,都会使用这些函数将 Java 类型数据转换为 QVariant。用户可以通过 registerConverter() 注册这种类型的自定义转换函数,该函数接受另一个参数,定义转换函数将用于将哪种 Java 类型转换为。

例如,用户可以为日期注册一个全局自定义转换函数,该函数将由所有 QAndroidBroadcastReceiver 实例调用以从包含 年份月份日期 字段的 Android 捆绑包 中获取有效的 QDate

QAndroidBroadcastReceiver::ExtraToVariantFunc dateReceiverConverter = [] (
        const QStringList &keys,
        const QJniObject &bundle) {
    if (!keys.size() || keys.last() != "date")
        return QVariant();

    const auto yearKey = QJniObject::fromString("year");
    const auto yearString = yearKey.object<jstring>();
    const auto hasYear = bundle.callMethod<jboolean>("containsKey", yearString);

    const auto monthKey = QJniObject::fromString("month");
    const auto monthString = monthKey.object<jstring>();
    const auto hasMonth = bundle.callMethod<jboolean>("containsKey", monthString);

    const auto dayKey = QJniObject::fromString("day");
    const auto dayString = dayKey.object<jstring>();
    const auto hasDay = bundle.callMethod<jboolean>("containsKey", dayString);

    if (hasYear && hasMonth && hasDay) {
        const auto year = bundle.callMethod<jint>("getInt", yearString, 1970);
        const auto month = bundle.callMethod<jint>("getInt", monthString, 1);
        const auto day = bundle.callMethod<jint>("getInt", dayString, 1);
        QDate date(year, month, day);
        return QVariant::fromValue(date);
    }
    return QVariant();
};
QAndroidBroadcastReceiver::registerGlobalConverter("android.os.Bundle",
                                                   dateReceiverConverter);

如果转换函数返回无效的 QVariant,则结果将被忽略,并由 QAndroidBroadcastReceiver 内部处理数据。

当接收到新的 intent 时,可能调用此类型函数来读取 intent 中接收到的 extras 数据到 QVariant。

此函数将接收一个 QStringList 参数。此参数将是从 extras 对象根开始到正在转换的当前值键的路径。此键可用于检测用户希望以某种特定方式处理的数据。

此函数还将接收一个 QJniObject 参数,它将包含要转换的数据。此数据可以是整个 extras 捆绑包或该捆绑包中的对象之一,具体取决于已注册的功能的数据类型。

另请参阅registerConverter() 和 registerGlobalConverter()。

成员函数文档

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

使用给定的 parent 构造 QAndroidBroadcastReceiver。

[显式] QAndroidBroadcastReceiver::QAndroidBroadcastReceiver(QAndroidIntentFilter *filter, QObject *parent = nullptr)

使用给定的 parent 和给定的 QAndroidIntentFilter filter 构造 QAndroidBroadcastReceiver 对象,并设置它为活动 intent 过滤器。

另请参阅setIntentFilter()。

[可调用] bool QAndroidBroadcastReceiver::hasConverter(const QString &javaTypename) const

如果已注册本地转换器以处理 Java 类型 javaTypename 则返回 true,否则返回 false

注意:此函数可以通过元对象系统和从QML调用。请参见Q_INVOKABLE

另请参阅registerConverter() 和 unregisterConverter

[静态] bool QAndroidBroadcastReceiver::hasGlobalConverter(const QString &javaTypename)

如果已注册Java类型 javaTypename的全局转换器,则返回 true,否则返回 false

另请参阅registerGlobalConverter() 和 removeGlobalConverter

[可调用] QAndroidIntentFilter *QAndroidBroadcastReceiver::intentFilter() const

返回当前的意图过滤器。

注意:此函数可以通过元对象系统和从QML调用。请参见Q_INVOKABLE

另请参阅setIntentFilter()。

[信号] void QAndroidBroadcastReceiver::intentFilterChanged()

当一个新意图过滤器设置给此接收器时,将触发此信号。

[信号] void QAndroidBroadcastReceiver::jniObjectReceived(const QJniObject &intent)

当收到一个新的意图时,将触发此信号。参数 intent 将包含该意图的 QJniObject 形式。

如果用户想要直接访问底层的 QJniObject(它封装了 Android Intent),则可以使用此信号代替 QAndroidBroadcastReceiver::received

[信号] void QAndroidBroadcastReceiver::received(const QAndroidIntentInfo &intent)

当收到一个新的意图时,将触发此信号。参数 intent 包含该意图的 QAndroidIntentInfo 形式。

void QAndroidBroadcastReceiver::registerConverter(const QString &javaTypename, QAndroidBroadcastReceiver::ExtraToVariantFunc func)

注册一个新的本地转换器 func,该转换器将用于名为 javaTypename 的Java类型。

本地转换器是一个 QAndroidBroadcastReceiver::ExtraToVariantFunc 函数,只可用于 QAndroidBroadcastReceiver 的此实例。

注意:带有此名称的每种类型只能有一个已注册的本地转换器。

另请参阅unregisterConverter() 和 hasConverter

[静态] void QAndroidBroadcastReceiver::registerGlobalConverter(const QString &javaTypename, QAndroidBroadcastReceiver::ExtraToVariantFunc func)

注册一个新的全局转换器func,该转换器将在接收到广播并带有类型为javaTypenameextra数据时被调用。

全局转换器是一个由所有QAndroidBroadcastReceiver实例使用的QAndroidBroadcastReceiver::ExtraToVariantFunc函数。

注意:具有此名称的每种类型只能有一个注册的全局转换器。

另请参阅:removeGlobalConverter() 和 hasGlobalConverter()。

[静态] bool QAndroidBroadcastReceiver::removeGlobalConverter(const QString &javaTypename)

移除名称为javaTypename的Java类型的全局转换器。

如果转换器存在并已被移除,则返回true,否则返回false

另请参阅:registerGlobalConverter() 和 hasGlobalConverter()。

bool QAndroidBroadcastReceiver::running()

如果接收器已启动,则返回true,如果没有则返回false

另请参阅:start() 和 stop()。

void QAndroidBroadcastReceiver::setIntentFilter(QAndroidIntentFilter *filter)

将当前意图过滤器设置为filter,并在过程中获取过滤器的所有权。

另请参阅:intentFilter()。

[槽] bool QAndroidBroadcastReceiver::start()

启动接收器。一旦运行,它将变得活跃并开始接收广播,直到停止。

如果接收器成功启动,则返回true,否则返回false

另请参阅:stop() 和 running()。

[槽] bool QAndroidBroadcastReceiver::stop()

停止接收器。此接收器将不会再接收广播,直到启动。

如果接收器正在运行并已停止,则返回true,否则返回false

另请参阅:start() 和 running()。

bool QAndroidBroadcastReceiver::unregisterConverter(const QString &javaTypename)

移除名称为javaTypename的Java类型的本地转换器。

如果转换器存在并被移除,则返回true,否则返回false

另请参阅:registerConverter() 和 hasConverter()。

适用于某些Qt许可证。
了解更多信息。