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) | |
bool | hasConverter(const QString &javaTypename) const |
QAndroidIntentFilter * | intentFilter() const |
void | registerConverter(const QString &javaTypename, QAndroidBroadcastReceiver::ExtraToVariantFunc func) |
bool | running() |
void | setIntentFilter(QAndroidIntentFilter *filter) |
bool | unregisterConverter(const QString &javaTypename) |
公共槽
信号
void | intentFilterChanged() |
void | jniObjectReceived(const QJniObject &intent) |
void | received(const QAndroidIntentInfo &intent) |
静态公共成员
bool | hasGlobalConverter(const QString &javaTypename) |
void | registerGlobalConverter(const QString &javaTypename, QAndroidBroadcastReceiver::ExtraToVariantFunc func) |
bool | removeGlobalConverter(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 中有一些转换已经在内部处理。也可以使用 registerConverter 和 registerGlobalConverter 来覆盖默认转换。
- 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,该转换器将在接收到广播并带有类型为javaTypename的
全局转换器是一个由所有QAndroidBroadcastReceiver实例使用的QAndroidBroadcastReceiver::ExtraToVariantFunc函数。
注意:具有此名称的每种类型只能有一个注册的全局转换器。
另请参阅:removeGlobalConverter() 和 hasGlobalConverter()。
[静态]
bool QAndroidBroadcastReceiver::removeGlobalConverter(const QString &javaTypename)
移除名称为javaTypename的Java类型的全局转换器。
如果转换器存在并已被移除,则返回true
,否则返回false
。
另请参阅:registerGlobalConverter() 和 hasGlobalConverter()。
bool QAndroidBroadcastReceiver::running()
如果接收器已启动,则返回true
,如果没有则返回false
。
void QAndroidBroadcastReceiver::setIntentFilter(QAndroidIntentFilter *filter)
将当前意图过滤器设置为filter,并在过程中获取过滤器的所有权。
另请参阅:intentFilter()。
[槽]
bool QAndroidBroadcastReceiver::start()
启动接收器。一旦运行,它将变得活跃并开始接收广播,直到停止。
如果接收器成功启动,则返回true
,否则返回false
。
[槽]
bool QAndroidBroadcastReceiver::stop()
停止接收器。此接收器将不会再接收广播,直到启动。
如果接收器正在运行并已停止,则返回true
,否则返回false
。
bool QAndroidBroadcastReceiver::unregisterConverter(const QString &javaTypename)
移除名称为javaTypename的Java类型的本地转换器。
如果转换器存在并被移除,则返回true
,否则返回false
。
另请参阅:registerConverter() 和 hasConverter()。
适用于某些Qt许可证。
了解更多信息。