Android系统是在一个进程中多次向多个接收者发送BOOT_COMPLETED意图还是一次?

Posted

技术标签:

【中文标题】Android系统是在一个进程中多次向多个接收者发送BOOT_COMPLETED意图还是一次?【英文标题】:Does Android system send BOOT_COMPLETED intent multiple times to multiple receiver in one process or just once? 【发布时间】:2012-08-23 23:39:49 【问题描述】:

所以基本上我的应用中有两个主要功能,A 和 B,它们都会在启动时执行一些操作。所以我做了两个BroadcastReceiver R1和R2,它们都接收BOOT_COMPLETED意图。 R1的逻辑比较复杂,处理功能A。R2的逻辑很简单,处理B。

我的问题是决定是否应该通过保留两个广播接收器并让它们中的每一个都监听 BOOT_COMPLETED 意图来保持代码更简洁,还是应该将它们结合起来以提高性能?

接收两个相同意图而不是一个对性能的影响有多大? send-receive-intent 过程会在我的应用中发生一次或两次吗?

另外,BOOT_COMPLETED 是否仅在启动完全完成后,用户可以启动应用程序时发送?

编辑:经过测试,两个组件在同一个应用程序中接收相同意图与一个组件接收相同意图之间的差异大约只有几毫秒。

【问题讨论】:

【参考方案1】:

您可以使用 android:priority 属性来控制这些接收器,并使它们按特定顺序执行。优先级最高的活动将首先执行。像这样的:

<activity
     android:name="First activity">
     <intent-filter android:priority="10" >
          <action android:name="android.intent.action.DEVICE_INITIALIZATION_WIZARD" />
     </intent-filter>
</activity>

<activity
     android:name="Second activity">
     <intent-filter android:priority="1" >
          <action android:name="android.intent.action.DEVICE_INITIALIZATION_WIZARD" />
     </intent-filter>
</activity>

你有关于这个in this link的信息

android:priority 应该赋予父级的优先级 组件关于处理由 筛选。该属性对活动和广播都有意义 接收者:它提供有关活动的能力的信息 响应与过滤器匹配的意图,相对于其他 也可以响应意图的活动。当一个意图可以 由具有不同优先级的多个活动处理,Android 将仅将具有更高优先级值的那些视为潜在 意图的目标。它控制广播的顺序 接收器被执行以接收广播消息。那些有 优先级较高的值在具有较低值的值之前被调用。 (这 order 仅适用于同步消息;它被忽略了 异步消息。)仅当您确实需要时才使用此属性 强加接收广播的特定顺序,或者想要 强制 Android 优先选择一项活动。

该值必须是整数,例如“100”。更高的数字有 更高的优先级。默认值为 0。该值必须更大 小于 -1000 且小于 1000。

另见 setPriority()。

【讨论】:

【参考方案2】:

除了山姆的回答...

另外,BOOT_COMPLETED 是否仅在启动完全完成后,用户可以启动应用程序时发送?

它在键盘保护出现时发送。关键是“时间”。启动时接收器有很多,它们都会以不确定的顺序接收广播。请不要假设您将获得广播的确切时间或当时系统的准确状态(例如,可能没有互联网连接)。

【讨论】:

是的,我不会对此做出假设。不过我想问的是,如果性能受到影响,比如说慢一秒,使用两个 BR,用户会再等待一秒看启动屏幕,还是用户实际上能够做其他事情,但只是稍微慢一点。 @JackWang:主屏幕将在启动时接收器接收广播时出现。【参考方案3】:

BroadcastReceiver 本质上独立于任何活动。

如果 Activity A 和 Activity B 是同一个应用程序的一部分,我建议将它们结合起来并仅使用一个 BroadcastReceiver。 如果它们用于不同的应用程序并且您计划单独发布这些应用程序,那么它们应该是两个不同的实体。

【讨论】:

嗨,山姆。感谢您的答复。 A 和 B 在同一个应用程序中。你认为我仍然应该将这两者结合起来,即使这样会使代码看起来不那么干净吗? 根据您的描述,您可以简单地评论 Activity A 的部分并为 B 标记另一个部分,将它们分开但在 BroadcastReceiver 中。 (我会把 B 的代码放在第一位,只是因为你暗示 A 有点乱。):) 当然可以。 receiver1 实际上有 4 个不同的意图来监听 Activity A,其中一些意图有多个可能的额外意图。这就是为什么我担心降低代码的可读性。

以上是关于Android系统是在一个进程中多次向多个接收者发送BOOT_COMPLETED意图还是一次?的主要内容,如果未能解决你的问题,请参考以下文章

Android广播阻塞、延迟问题

Android内容提供程序中多个进程的多次写入

Android系统广播(Broadcast)注册,发送,接收流程解析

在 Linux 中向多个进程发送数据 [关闭]

9.2 Binder系统_驱动情景分析

急!!Android系统中,广播Intent的问题