【问题标题】:How does apps like Whatsapp or telegram listen to the incoming call/message events on Android?Whatsapp 或电报等应用程序如何监听 Android 上的来电/消息事件?
【发布时间】:2019-07-15 08:00:52
【问题描述】:

我构建了一个 VoIP 呼叫应用程序,它与服务器保持持久连接以监听任何来电。为此,我实现了一个后台服务。

但是自从Oreo之后,这个运行代码现在因为Background Execution Limits的引入而坏掉了

查了一下论坛,发现有人在建议

  1. 将 Service 转换为 JobService 并让 android 调度它

    这样做,我的应用在停止时将无法接听电话

  2. 在前台服务中运行您的操作

    对于某些用户来说,在通知栏中看到不断的通知很烦人。因此,上述这些选项不适用于我为 Oreo 修复我的代码。

WhatsApp 如何通过Background Execution Limits 获取 Android(Oreo 及以上版本)中的传入 (VOIP) 呼叫?

【问题讨论】:

    标签: background android-service xmpp sip android-8.0-oreo


    【解决方案1】:

    我假设您正在使用 SIP 建立连接并发起呼叫。如果没有服务不断地重新发送 REGISTER,则应用在服务器发送 INVITE 时不会收到 INVITE。

    解决此问题的方法是所谓的“推送通知策略”。它的工作原理如下,当服务器发送 INVITE 时,它还会向您的应用程序发送 FCM 通知,这会唤醒您的应用程序,然后向您的服务器发送一个 REGISTER,作为回报,它将调用您的应用程序。 Here is a video that better explains this strategy

    【讨论】:

    • 然而 whatsapp 可能有自己的协议来启动会话,因为他们只需要支持 whatsapp 到 whatsapp 调用,并且他们控制两个端点。
    • 现在Android引入了这么多限制,我想这是唯一的办法。不管whatsapp可能使用任何协议,他们也必须处理这些限制。
    • @Kantajit 你是对的,Whatsapp 可能也使用某种形式的通知,但是,Whatsapp 的协议可能允许所有信息开始会话都在通知中,以便接收者的app 只需要响应通知,这与 SIP 不同,您需要 REGISTERs 和 INVITEs。附言Android (&iOS pre iOS 13) 限制很好 IMO,让 SIP 客户端在后台运行真的会消耗电池
    【解决方案2】:

    有两种选择:

    • 使用平台推送服务(APNS 或 FCM)
    • 保持持久的套接字连接并将应用程序排除在电池优化之外。

    【讨论】:

    【解决方案3】:

    (Sticky)前台服务不受这些限制的影响。因此,您可以使用其中之一来替代 Oreo 上的后台服务。

    但是前台服务有两个缺点:与后台服务相比,它们不太可能被系统杀死以回收资源,从而影响Android系统的自愈能力。他们要求您显示永久通知。但用户能够抑制通知,在一定程度上缓解了这一缺点。

    【讨论】:

    • whatsapp 如何在不使用 READ_PHONE_STATE 运行时权限的情况下监听 INCOMING_CALL(非 VoIP)??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-23
    • 2020-11-23
    • 2023-01-13
    • 1970-01-01
    • 2019-05-17
    • 2013-10-28
    • 1970-01-01
    相关资源
    最近更新 更多