Android 不调用静态对象的构造函数

标签: Java Android Qt
发布时间: 2017/3/19 17:20:40
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

android 应用程序使用主要是 qt 离散度和 QML,我试图跟随示例用于发送通知。当我运行示例事情按预期,但当我把几乎相同的代码放在我的应用程序时它不调用 ctor 静态对象之一的所以事情失败。这里是我的 Java 代码︰

package com.me.myApp;

import android.app.Notification;
import android.app.NotificationManager;
import android.content.Context;
import android.util.Log;

public class NotificationClient extends org.qtproject.qt5.android.bindings.QtActivity {
    private static final String TAG = "myApp::NotificationClient";
    private static NotificationManager m_notificationManager;
    private static Notification.Builder m_builder;
    private static NotificationClient m_instance;

    public NotificationClient() {
        Log.d(TAG, "Doing ctor");
        m_instance = this;
    }

    public static void notify(String s) {
        Log.d(TAG, "Doing the update thing");
        if(m_instance == null) {
            Log.d(TAG, "I have a null instance");
        }
        try {
            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.setContentText(s);
            m_notificationManager.notify(1, m_builder.build());
        }
        catch (Exception ex) {
            Log.d(TAG, "Notify error: " + ex.toString());
        }
    }
}

看着 log 文件,它进入 notify() 功能,但 m_instancenull 因为 NotificationClient 永远不会调用构造函数。

什么会导致这种情况发生?

解决方法 1:

androidQt application 都是一层薄的 Java 薄,启动时,调用 qt 离散度的化合物 application 作为一种动态打包 so 图书馆。更多的细节可以发现在举行由先生 Vatra @ KDAB 好系列第一篇博客文章。

碰巧是主要的 Java 层 activity 再加上一些实用工具类,在Qt 代码库中可用。当一个新 Android Qt 造物主自动创建项目生成 manifest 文件使用中 Qt 提供的默认类。只要您使用默认设置,一切工作正常。

你的情况你不得不扩展默认主 activity 添加造成主要的新名称的自定义 Java 代码中, activity ( NotificationClient )。然而 manifest 指向的 (仍然) 可用的基类,即你有在你 manifest :

android:name="org.qtproject.qt5.android.bindings.QtActivity"

在这种情况下调用超类的构造函数,因此 static 变量不分配与一个有效的值,导致 nullPointerException 问题。设置正确的新主 activitymanifest 解决了这个问题︰

android:name="com.me.myApp.NotificationClient"

我建议你仔细阅读博客文章系列链接以上,因为他们可以容易地理解 Java <--> c + + 中的相互作用 Android Qt 项目。

官方微信
官方QQ群
31647020