使用个人guis进行多平台应用开发

时间:2016-03-12 14:40:30

标签: android qt user-interface mobile multiplatform

我目前正在计划开发一个多平台应用程序,我不确定哪种方式最符合我的要求,因为我能想到的所有可能性都无法让我满意。

首先,我想为Android编写一个应用程序,它应该感觉像一个普通的典型Android应用程序。所以我想在我的其他gui元素中使用标准的actionbar和android设计外观。在完成Android应用程序后,我正计划开发一个应该有不同设计的ios应用程序,所以无论如何我都会重新开发gui。

但我不想重写代表应用程序智能的其他代码,独立于gui。我提出了以下可能性:

1。 Java GUI使用本机库

这里我在C ++库中抽象了我的应用程序的所有代码(因为据我所知ios也支持c ++库的使用)并且通常在java中开发gui android。该库将具有启动功能,并将通过回调函数通知gui每个更改。

  • 我可以重用所有在两个平台上都相同的代码。我只是单独实施gui
  • android gui的设计很简单,就像我想要的那样。它看起来像典型的android,因为它是典型的android。

缺点

  • 我非常不喜欢JNI的用法。特别是回调函数的签名和名称(从c ++调用java函数)在编译时不会被检查,需要大量的手动工作。如果我重命名一个函数而忘记重写本机部分,我只会在运行时注意到这个错误。

2。在本机端构建GUI

在这里我很难找到可能的东西,尤其是2.2

2.1使用Qt

我在Qt方面只有一些初步经验但据我所知,我会有以下优点和缺点:

重用ios和Android代码的大部分内容。我想为每个平台重新设计gui,让它们感觉自然。我无法评估qt甚至可以帮助我做这件事

缺点

我必须使用其他qt小部件来复制android gui。这是更多的努力,我不知道是否可以复制android gui元素(如操作栏),以便用户不会注意到它。

2.2使用本机端的android框架

我不知道这是否可行,我无法找到这些信息。我可以使用类“NativeActivity”并使用android框架来构建gui并使用例如动作栏?如果这是可能的,那么它将有来自1的专业人员。也许不会有它的缺点?

您对我的想法有什么反馈,甚至可能是我没想过的新方法吗?像WhatsApp这样的其他多平台应用程序如何解决这个问题?他们是否为每个平台都有冗余代码?

谢谢你, 托比

1 个答案:

答案 0 :(得分:0)

我想说这很大程度上取决于您的申请要求。我认为,更好的解决方案是使用针对该平台推荐的SDK为每个平台开发单独的应用程序,并在本机C ++中实现仅耗费时间的数据处理算法。

移动平台上的应用程序运行时并不像桌面平台那么简单。您应该考虑后台和前台处理,特定应用程序生命周期,访问网络,文件系统等系统资源。所有这些问题在iOS和Android上都有所不同。

关于您列出的可能性。

  1. Qt / QML只有在满足两个要求的情况下才可以:

    1.1您的应用程序是一个没有任何后台操作的foregroud应用程序。

    1.2您购买商业Qt许可证是因为只有商业Qt可以提交到Apple iTunes应用程序商店(甚至GPL应用程序都在 问题)。

  2. 在Android上使用带有跨平台C / C ++后端的NDK原生活动。 Android NDK API提供的API比Android Java SDK少得多,因此您需要手动实现或包装许多东西。这是一条艰难的道路。

  3. 使用JNI混合Java代码和C / C ++可以为您提供更多的Android SDK API。但是你应该记住,在C / C ++上开发时,Android活动的生命周期并不是你用来处理的。

  4. 我们正在使用的方法

    我们一直在开发一个具有大量跨平台功能的应用程序,该应用程序可以在Windows / Linux / Mac OSx / Android / iOS上运行。我们按照以下方法使用该方法。

    1. 跨平台核心是用纯C ++编写的。
    2. 我们为每个平台提供GUI接口适配器。
    3. 在桌面上,我们使用Qt,因为它可以轻松适应所有桌面平台。
    4. 在iOS上,GUI使用iOS SDK与Objective-C构建,C ++核心作为框架链接。尽管如此,我们还是必须以某种方式修补我们的核心以满足iOS背景要求等。
    5. 在Android上,我们将C ++核心包装在后台进程中,并仅使用Android Java SDK构建所有GUI。前台GUI活动通过本地套接字与核心进行交互,因此我们不需要为我们的C ++核心中的生命循环活动而烦恼。但适配器有点复杂。
    6. 尽管如此,两个移动平台通常都需要在C ++核心中进行变通和调整,这为每个平台的代码添加了许多#ifdef&#edde分支。