【问题标题】:AIDL - What's the point?AIDL - 有什么意义?
【发布时间】:2013-07-06 22:05:44
【问题描述】:

好的,我有一个带有 Activity (UI) 和 Service(后台轮询)的 Android 应用。两者使用 AIDL 错综复杂地连接(包括回调,因此它是双工通信、IPC 等)。

任何时候两人说话我都在使用它。

不过,我还扩展了 Application 类 - 以便两者可以共享公共数据对象。所以Application持有一个Service一直在使用的User对象,Activity在运行的时候也可以访问它。

应用程序还具有对 Activity 的 WeakReference(以避免上下文泄漏),因为用户有时会触发 UI 更新。

看起来像

Activity (UI) ---> Application <--- Service

我可以通过以下方式触发服务内的 UI 事件

_app = (FooApplication)this.getApplication();
FooActivity uiRef = _app.getUIReference().get();
if (uiRef != null) {
   uiRef.updateSomeDisplay();
}

所以我不明白。当我只是弱引用 UI、查看它是否存在并调用它的方法时,为什么还要麻烦复杂的 AIDL 调用。

【问题讨论】:

    标签: service callback aidl android


    【解决方案1】:

    AIDL 的重点是允许进程间通信。服务的重点是允许后台操作在与您的 UI 线程不同的进程中运行,这样即使您关闭应用程序,它们也可以继续运行。您将需要 AIDL,因为您的服务将在与您的 UI 完全不同的进程中运行,因此您将无法从您的服务进程访问 UI 进程中的内存。

    【讨论】:

    • 我明白了。我有点把同样的想法拼凑在一起,然后回来编辑自己。如果我有一个单独的进程 - 独立服务进程不会出现在 Advanced Task Killer 中吗?是否仅限于列出活动?
    • 去年我一直在使用从 Android 2.1 到 4.1.2 的各种设备上的多个应用程序中的后台服务,并且从未见过在独立进程中运行的服务在同一个 .apk 文件中定义的用户界面。文档说“如果一个应用程序组件启动并且已经存在该应用程序的进程(因为该应用程序的另一个组件存在),那么该组件在该进程中启动并使用相同的执行线程。”是的,你可以告诉它不要这样做,但我看不出你为什么会......?
    • 您想要这样做的一个例子是后台音频服务。如果您让播放器在单独的进程中运行,那么您的媒体播放器应用程序的内存效率会更高,因为在播放音频时整个 UI 堆栈不必保留在内存中。但是,使用 AIDL 确实使事情变得相当复杂,因此在大多数情况下,它是不值得的。
    猜你喜欢
    • 2011-09-26
    • 2010-11-29
    • 2010-10-15
    • 2011-02-05
    • 2012-02-28
    • 2018-01-13
    • 2015-03-18
    • 2018-02-15
    • 1970-01-01
    相关资源
    最近更新 更多