Qt Android 通知器
演示如何在 Android 应用中从 Qt 调用 Java 代码。

此示例演示了如何将自定义 Java 类添加到 Android 应用,以及如何使用 Qt 的 JNI 便捷 API 调用它。
单击其中一个笑脸图标,在 Android 屏幕的状态栏中发送通知。
运行示例
要从 Qt Creator 运行此示例,打开 欢迎使用 模式并从 示例 中选择示例。有关更多信息,请访问 构建和运行示例。
从 C++ 代码调用 Java 方法
我们在 NotificationClient.java 文件中定义了一个名为 NotificationClient 的自定义 Java 类
package org.qtproject.example.androidnotifier;
import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.BitmapFactory;
import android.app.NotificationChannel;
public class NotificationClient
{
public static void notify(Context context, String message) {
try {
NotificationManager m_notificationManager = (NotificationManager)
context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder m_builder;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel notificationChannel;
notificationChannel = new NotificationChannel("Qt", "Qt Notifier", importance);
m_notificationManager.createNotificationChannel(notificationChannel);
m_builder = new Notification.Builder(context, notificationChannel.getId());
} else {
m_builder = new Notification.Builder(context);
}
Bitmap icon = BitmapFactory.decodeResource(context.getResources(), R.drawable.icon);
m_builder.setSmallIcon(R.drawable.icon)
.setLargeIcon(icon)
.setContentTitle("A message from Qt!")
.setContentText(message)
.setDefaults(Notification.DEFAULT_SOUND)
.setColor(Color.GREEN)
.setAutoCancel(true);
m_notificationManager.notify(0, m_builder.build());
} catch (Exception e) {
e.printStackTrace();
}
}
}在 NotificationClient C++ 类头文件 notificationclient.h 中,我们声明了一个简单的 C++ API 来在 Android 设备上显示通知。它由一个字符串属性 notification 和一个槽 updateAndroidNotification() 组成,该槽调用 Java 代码
class NotificationClient : public QObject { Q_OBJECT public: explicit NotificationClient(QObject *parent = 0); void setNotification(const QString ¬ification); QString notification() const; signals: void notificationChanged(); private slots: void updateAndroidNotification(); private: QString m_notification; };
我们将 notificationChanged() 信号连接到 updateAndroidNotification() 槽,以便在 notification 文本更改时更新通知文本
m_notification = notification; emit notificationChanged();
updateAndroidNotification() 函数调用负责从 Android 平台 API 发送通知的 Java 方法。首先,我们从通知字符串构造一个 Java 字符串 jstring,然后调用 Java 中的 notify() 方法,将 jstring 对象作为参数传递
void NotificationClient::updateAndroidNotification() { QJniObject javaNotification = QJniObject::fromString(m_notification); QJniObject::callStaticMethod<void>( "org/qtproject/example/androidnotifier/NotificationClient", "notify", "(Landroid/content/Context;Ljava/lang/String;)V", QNativeInterface::QAndroidApplication::context(), javaNotification.object<jstring>()); }
调用 Java 方法使用 QJniObject,它依赖于 Java 本地接口 (JNI) API 进行通信。同样,在先前的代码片段中,我们传递了应用上下文对象,静态 Java 代码可以使用它来访问应用特定的属性和 API。
为了确保笑脸按钮按预期工作,我们添加了以下代码,如果点击其中任意一个笑脸,则更改通知文本
QObject::connect(&happyButton, &QPushButton::clicked, &happyButton, []() { NotificationClient().setNotification("The user is happy!"); }); QObject::connect(&sadButton, &QPushButton::clicked, &happyButton, []() { NotificationClient().setNotification("The user is sad!"); });
另请参阅 Qt for Android.
© 2024 Qt 公司有限公司。此处包含的文档贡献权归其各自的所有者所有。此处提供的文档是根据自由软件基金会发布的 GNU 自由文档许可证版本 1.3 的条款提供的。Qt 和相关商标是芬兰的 Qt 公司及其它国家和地区的商标。所有其他商标均为其各自所有者的财产。