QT / QML Android应用程序,单击通知栏时打开应用程序

Kev*_*udo 5 java-native-interface qt qml android-notifications qandroidjniobject

我对Android应用程序进行了QT。当我单击按钮时,通知栏会在平板电脑上看到。但是,如果单击“通知”,我的应用程序将打开/聚焦(不知道)并带有黑色窗口。简单地做到这一点。我的代码是:

package org.ays.operation;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.app.PendingIntent;
import android.content.Intent;


public class NotificationClient extends org.qtproject.qt5.android.bindings.QtActivity
{
     private static NotificationManager m_notificationManager;
     private static Notification.Builder m_builder;
     private static NotificationClient m_instance;
     private static PendingIntent contentIntent;
     private static Intent intent;


     public NotificationClient()
     {
         m_instance = this;
     }

     public static  void notify2()
     {
         intent = new Intent(m_instance, NotificationClient.class);
         contentIntent = PendingIntent.getActivity(m_instance, 0, intent,
                                         PendingIntent.FLAG_UPDATE_CURRENT);

         if (m_notificationManager == null) {
             m_notificationManager = (NotificationManager)m_instance.getSystemService(Context.NOTIFICATION_SERVICE);
             m_builder = new Notification.Builder(m_instance);
             m_builder.setSmallIcon(R.drawable.icon);
             m_builder.setContentTitle("A message from Qt!");
             m_builder.setDefaults(Notification.DEFAULT_SOUND);
             m_builder.setContentIntent(contentIntent);
             m_builder.setAutoCancel(true);
         }

         m_builder.setContentText("Bla Bla");
         m_notificationManager.notify(1, m_builder.build());
     }
 }
Run Code Online (Sandbox Code Playgroud)

我来宾,重要的代码是PendingIntent,用于打开/聚焦主应用程序。另一种情况是我不想将notify2用作静态。我可以从Qt / JNI动态使用它吗

小智 2

第一种方式:

你必须改变这一行

intent = new Intent(m_instance, NotificationClient.class);
Run Code Online (Sandbox Code Playgroud)

Intent intent = new Intent(mActivityInstance, mActivityInstance.getClass());
Run Code Online (Sandbox Code Playgroud)

contentIntent = PendingIntent.getActivity(m_instance, 0, intent,
                                     PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)

contentIntent = PendingIntent.getActivity(mActivityInstance, 0, intent,
                                     PendingIntent.FLAG_UPDATE_CURRENT);
Run Code Online (Sandbox Code Playgroud)

注意mActivityInstance是你的mainActivity。

我从 C++ 和 JNI 设置 mActivityInstance,如下所示:

const QAndroidJniObject m_JavaNotification("com/falsinsoft/qtandroidtools/AndroidNotification",
                   "(Landroid/app/Activity)V",
                   QtAndroid::androidActivity().object<jobject>());
Run Code Online (Sandbox Code Playgroud)

在我的 AndroidNotification.java 中:

public class AndroidNotification {
private final Activity mActivityInstance;

public AndroidNotification(Activity ActivityInstance)
{
    mActivityInstance = ActivityInstance;
}
}
Run Code Online (Sandbox Code Playgroud)

第二种方法(我不确定这能解决您的问题!):更改 manifiset.xml 中的这一行:

    <application android:hardwareAccelerated="true" android:name="org.qtproject.qt5.android.bindings.QtApplication" android:label="YourProjectName" android:icon="@drawable/icon">
Run Code Online (Sandbox Code Playgroud)

到:

    <application android:hardwareAccelerated="true" android:name="your java class extend from QtActivity" android:label="YourProjectName" android:icon="@drawable/icon">
Run Code Online (Sandbox Code Playgroud)