Android 14 上的意图广播传输缓慢

问题描述 投票:0回答:2

我的应用程序中有 2 个服务,有时通过广播意图相互通信。在 Android 13 上,发送意图和交付意图之间的时间为 1-2 毫秒(在 Pixel 4XL 上测试)。 Android 14 上的时间约为 500 毫秒(在 Pixel 6 Pro 上测试)!

缓慢的意图传递导致我的应用程序出现以前不存在的延迟。我知道从 Android 14 开始,上下文注册的广播会在应用程序缓存时排队,但这是在主动运行的前台服务和辅助服务之间进行的。 Android 14 上所有意图都变慢了吗?

有谁知道可能导致此性能问题的原因是什么?

编辑:经过进一步测试,当前台没有活动时,意图似乎会延迟 500 毫秒。当前台有活动时没有延迟。一旦您离开应用程序,即使没有杀死它,延迟也会出现。

因此,如果前台没有活动,即使在前台服务之间,意图也会变慢。 这是记录吗?

我可以采取什么措施来防止这种情况发生?我正在使用动态注册的接收器:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { registerReceiver(broadcastReceiverInternal, intentFilter, RECEIVER_NOT_EXPORTED); } else { registerReceiver(broadcastReceiverInternal, intentFilter); }
将其设置为导出并没有什么区别。

android performance android-intent service android-14
2个回答
1
投票
你是对的,如果意图传递到一个已注册的接收器,则不会增加延迟,尽管它有点慢(〜10毫秒而不是1-3毫秒)

这表明大约 500 毫秒的减速是由于 Android 14 上的新排队系统造成的。也许有一天他们可能会改进这一点,但我不会指望它。

如何在我应该接收消息的服务中使用这个静态接收器(现在在它自己的类中)?

在高水平上,您将像使用动态接收器一样使用它。他们接收广播并根据广播采取行动。

理想情况下,您的服务几乎没有实际业务逻辑。虽然书籍示例 (👋) 倾向于让服务完成实际工作,但这是为了保持示例简单。服务应该纯粹专注于设置自身(例如,显示前台通知)并处理它需要的任何较低级别的通信(例如,实现 API 表面以实现可访问性)。

其他所有内容都应该驻留在其他地方,例如注入到服务中的对象中。这样,“其他地方”就可以单独测试。 如果您拥有这种架构,那么让静态接收器也获得“其他地方”注入并调用其方法与将动态接收器调用注入服务本身的方法没有显着不同。与服务一样,接收者除了将相关信息传递给“其他地方”(真正的工作)之外,自己几乎不应该做任何事情。

如果您想尝试消除约 10 毫秒的延迟,您可以尝试服务之间的绑定连接,从而完全消除广播。


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.