我什么时候应该使用 Android 的每种不同消息类型?

2023-12-03

我一直在与Android一年多了,但我仍然无法确定何时应在进程/线程之间使用不同类型的消息传递/通信。我主要讲的是广播Intents,使用AIDL进行services,使用Handlers发送消息和socket通信。

其中许多工具可用于完成类似的任务,但哪个更适合特定情况?


这是一个非常开放式的问题,但让我尝试描述一下我如何看待应用程序内/间通信工作得最好。

Android 消息传递的关键方面之一是所有应用程序组件松散绑定的概念。由于所有应用程序都在单独的进程中运行,并且一个“应用程序”实际上可能由多个应用程序组成(负责提供不同的活动或服务),因此消息传递技术均基于跨进程边界编组消息的思想。

Intents

消息传递的首选技术是尽可能尝试使用 Intent。这是 Android 中最“原生”的消息传输方式。

优点

使用意图进行消息传递可以保持应用程序组件的松散绑定,使您可以在多个应用程序之间无缝传输消息。意图在核心系统中被大量使用来启动活动和服务,以及广播和接收系统事件。

使用 extras Bundles,您可以将基元的键/值对作为有效负载数据包含在 Intents 中,以便轻松地将信息从一个应用程序组件传递到另一个应用程序组件 - 即使这些组件在不同的进程中运行。

缺点

由于 Intent 被设计为在进程之间传递,因此额外负载仅支持原始类型。如果您需要使用 Intent 发送对象,则需要在一端将其解构为基元,并在另一端将其重建。

应用类

如果您只想在单个进程中运行的单个应用程序中进行通信,那么这是一个方便的解决方案。

优点

通过延长Application类(并将其实现为单例),您将获得一个对象,只要任何应用程序组件存在,该对象就会存在,从而提供一个集中位置来存储和在应用程序组件之间传输复杂的对象数据。

缺点

此技术将您的消息传递限制为单个应用程序中的组件。

服务绑定、IPC 和 AIDL

绑定到服务使您可以访问其方法并与其交换对象。 AIDL 是一种定义如何将对象序列化为操作系统原语的方法,以便在您绑定到的服务在单独的应用程序中运行时可以跨进程边界对其进行编组。

优点

当您绑定到服务时,您可以访问它,就像它是调用类中的对象一样。这意味着您可以在服务上执行方法并与其交换丰富的对象。

请注意,如果您要绑定到不同应用程序进程中的服务,则需要创建 AIDL 定义来告诉 Android 如何序列化/反序列化您想要在应用程序之间传递的任何对象。

缺点

为 IPC 创建 AIDL 类需要一些额外的工作,并且绑定会在服务和活动之间创建额外的依赖关系,这会使内核在其他应用程序资源匮乏时更难以清理资源。

不过,跨进程边界编组消息的成本很高。因此,如果您不在服务上执行方法,那么使用绑定和 IPC 可能就有点过分了——看看您是否可以使用 Intents 实现同样的效果。

Sockets

如果您使用套接字在单个设备上运行的应用程序内部或之间进行通信,那么要么是因为没有其他方法,要么是您在某个地方错过了一个技巧。如果您的消息要离开设备,那么套接字是一个很好、快速的替代方案。如果您继续使用设备,则 Intents 或 IPC 可能是更好的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我什么时候应该使用 Android 的每种不同消息类型? 的相关文章

  • Android 键盘调整大小

    我正在开发一个应用程序 其中包含 Activity 和Fragment 在片段布局中 我使用相对布局作为父布局 底部和滚动视图之间的一个按钮 Scrollview包含编辑文本框 如果我点击最后一个editTextBox在滚动视图中我的键盘隐
  • 如何每分钟运行一次BroadcastReceiver?

    我正在开发一个应用程序来每分钟监控网络 我正在为此使用广播接收器 我想每分钟后执行一次 BroadcastReceiver 我该怎么做 我可以在 BroadcastReceiver 中使用 Thread sleep 吗 在android中持
  • ScrollView 与relativelayout 不能很好地配合

    所以我有一个 ScrollView 作为布局中的最高级别 在我的 ScrollView 中我有一个包含其他视图的相对布局 问题在于 RelativeLayout 没有按应有的方式覆盖整个布局 它会在大约一半的屏幕处被截断 它的宽度是屏幕的整
  • 如何以编程方式检查应用程序是否在调试模式下运行?

    我必须在应用程序中的某个位置确定我的应用程序是在调试模式还是实时模式下运行 是否有任何函数或代码可用于检查 在开 关两种情况下都会返回 true false 如果是这样 请帮助我 提前致谢 从问题中尚不清楚调试模式是否指的是 应用程序是否可
  • Android ViewPager手动调用PageTransformer TransformPage

    我有一个带有 PageTransformer 实现的 ViewPager 它可以对 ViewPager 的下一页执行一些有趣的操作 我的实现如下所示 class ZoomOutPageTransformer implements ViewP
  • 无法将 LocalBroadcastManager 添加到 Android Studio 中的项目

    我想我现在已经尝试了一切 我一直在堆栈溢出 我什至咨询过android文档 这里的大多数帖子都展示了如何在 Eclipse 中添加 jar 文件 android 工具 gt 添加支持库 或其他内容 所以我尝试按照文档告诉我的方式进行操作 方
  • Oreo (8.1) 无法在锁定屏幕上启动活动

    我正在开发 NFC 支付应用程序 即使设备锁定 屏幕打开时也可以付款 与 Android Pay 的行为基本相同 付款后 我想向用户显示胜利屏幕 通知他付款结果 完成 错误 PIN 请求等 我将其添加到清单中
  • Android Market支持QHD

    使用摩托罗拉 Atrix 4G 无法下载我发布的应用程序并安装在手机上 建议的答案是这样做
  • ANDROID:膨胀类 android.support.design.widget.AppBarLayout 时出错

    我在布局中添加了一个工具栏 现在运行时出现此错误 java lang RuntimeException Unable to start activity ComponentInfo com example myapp mainactivit
  • 简单的 C++ 线程

    我正在尝试在 C Win32 中创建一个线程来运行一个简单的方法 我是 C 线程的新手 但对 C 中的线程非常熟悉 这是我想做的一些伪代码 static void MyMethod int data RunStuff data void R
  • 在 Android 中以高音量录制

    我正在使用 MediaRecorder 进行音频录制 但不幸的是 当我播放录制的音频时 我的媒体音量非常低 我什么也没听到 几乎什么也没听到 有没有办法提高录音音量 就像我们录音时的 setVolume 一样 我尝试在 MediaRecor
  • 尝试使用 FileProvider(Android) 获取 URI 时出现 NullPointerException [重复]

    这个问题在这里已经有答案了 我想在单击按钮后拍照 但我越来越NullPointerException当试图得到URI with FileProvider 这是我的错误代码 Caused by java lang NullPointerExc
  • 在 AChartEngine 中单击时突出显示饼图切片

    我想在用户单击时突出显示 更改颜色 饼图特定切片 我可以在示例 下面的代码 中发现可以显示切片的索引和确切的点 但是给切片重新着色怎么样 mChartView setOnClickListener new View OnClickListe
  • Android中如何使用ScrollView?

    我有一个 XML 布局文件 但文本超出了屏幕尺寸 我需要做什么才能制作ScrollView
  • Android-JNI 中的 AndEngine GLES2 存在 Proguard 问题 在应用程序中检测到错误

    我开发了一个应用程序 使用和发动机GLES2 https github com nicolasgramlich AndEngine和 andEngine 的扩展物理二维盒 https github com nicolasgramlich A
  • 如何限制 Android 设备网络速度以进行测试

    我正在测试一个 Android 应用程序 该应用程序在低质量网络上管理其内容时遇到一些问题 我无法验证问题是否仍然存在 因为以我家的网络速度 120mb s 在我设法开始复制路线之前 所有内容都已经下载完毕 在这种情况下 不能选择使用 An
  • Android 中每个 dex 文件的方法限制为 64K

    我遇到了这个问题java lang IllegalArgumentException method ID not in 0 0xffff 65536我决定从 dex 文件中排除一些方法 我的 gradle build compile com
  • Android Studio Gradle 出现本机库错误

    对不起我的英语不好 我有最后一个 android studio 2013 年 6 月 14 日 创建新的 Android 项目 将 so 文件添加到 libs armeabi 编辑 build gradle 为 buildscript re
  • 如何从停止的地方开始播放视频

    我正在使用 VideoView 来播放视频 如果我退出应用程序 在返回应用程序 即在 onResume 中 时 它应该从停止的位置播放视频 要获取当前进度 在 onPause 中检查 long progress mVideoView get
  • KeyboardAvoidingView“行为”中的高度与位置与填充

    KeyboardAvoidingView 中有一个 行为 属性 例如 import KeyboardAvoidingView from react native

随机推荐