Android Activity / Intent vs. Qt Signal / Slot vs. iPhone?/?

时间:2011-01-28 13:19:42

标签: iphone android qt android-intent signals-slots

我正在尝试研究不同移动平台上对象/组件之间的通信的相似性。

在Android上,有 Activity / Intent 概念传递信息,在Qt上我们有信号和插槽

此处出现的问题:

  1. 将Activity / Intent与信号/插槽概念进行比较是否合法?与我的观点最重要的区别在于不同的粒度级别。虽然活动/意图在“整个屏幕”上运行(活动更精确,因为活动不一定代表一个单独的屏幕),信号/插槽被定义为较小的对象,例如小部件(事实上,对于每个类,源自QObject)。

  2. 考虑到平台独立性,你会说概念根本上是不同的,或者开发人员可以克服对象通信方面的技术差异和“抽象”应用程序逻辑足以最大限度地减少移植工作?怎么样?

  3. 在iOS上是否有类似的概念?(例如,目标 - 行动机制 - 或者更像是ObjectiveC提供的代理或通知)。

4 个答案:

答案 0 :(得分:1)

我只能说说android的意图和iOS之间的区别 - 在QT中从来没有做过任何事情,但是我们走了:
意图(至少据我所知)主要用于指示改变电话状态或改变不同对象的生命周期状态。它们通常不用于更细粒度的东西,例如变更值的通知等 在iOS中,通知系统同时存在细粒度和粗粒度信息(也就是系统状态甚至模型更改) - 但它的功能完全不同。

我认为这两种机制之间没有任何直接的相似性。使用Androids Intents我可以启动新的Activites,如果我真的需要,也可以将一些值传递给另一个Activity。使用iOS通知,我可以将任何类型的值从A传递到B,但是必须实现我自己的逻辑,例如在特定的通知上启动服务。此外,iOS中的通知管理比Android Intents更明确。

答案 1 :(得分:1)

  1. Qt的信号和插槽无法与Android的意图进行比较。信号和插槽适用于Qt中的所有内容;它来自QObject类,它是所有Qt对象的超类,因此是Qt的核心概念。另一方面,Android使用几种机制进行对象通信。它使用意图来进行活动和服务,但它也使用回调来进行事件处理。它们还提供不同级别的灵活性:您可以为信号和插槽提供尽可能多的参数,您可以在意图上附加一些数据,但是您只能将视图对象传递给android回调。
  2. 这是根本不同的,因为Android不仅使用如上所述的意图。
  3. 无法回答,因为我不是iOS程序员。

答案 2 :(得分:0)

为了比较Android上的通知与Android上的Intents,我提出了以下摘要:

共性:

  • 这两种机制都可用于注册报告系统更改应用程序所需的任何通知(例如,电池电量变化)
  • 这两种类型都可以触发生命周期状态更改

的差异:

  • 粒度级别
    • 意图用于在活动,服务或广播接收器之间传递信息
    • 通知可用于在任何类型的对象之间传递信息,无论是精细粒度以在单个GUI元素更改时通知sbdy,还是在某些系统事件到达时进行粗粒度响应

  • IPC
    • Intent可用于应用程序间通信(隐式Intents,未提及特定接收组件,后期绑定),以及应用内通信(显式Intents,接收组件指定,早期绑定)
    • 通知仅限于iOS上的应用程序内部通信(还有其他方法可以实现此目的吗?)

  • 使用案例:
    • 意图通常用于启动其他活动(例如,显示另一个屏幕)或启动某些服务(例如,在后台播放音乐)。
    • 在iOS上,人们必须实现自己的逻辑才能转换到另一个屏幕或开始在后台播放一些音乐。

最后,我的问题归结为:因为这些概念似乎根本不同,这是设计独立于平台的Android / iOS应用程序的真正障碍吗? <登记/> 或者您是否有关于如何“抽象”这些机制并最大限度地减少移植工作的建议?(跨平台解决方案还必须有办法将这些概念转化为幕后的本机代码?)

答案 3 :(得分:0)

自从我看过Qt已经有一段时间了,但我的回忆是信号/插槽看起来非常像Objective-C(iOS)选择器(特别是对于IBAction方法)。典型用途

[button addTarget: controller action: @selector(resetState) forControlEvents: UIControlEventTouchUpInside];

VS

Qobject::connect(button, SIGNAL(clicked()), &controller, SLOT(resetState()));