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 公司及其它国家和地区的商标。所有其他商标均为其各自所有者的财产。