代码之家  ›  专栏  ›  技术社区  ›  android developer

是什么让广播接收器这么晚才得到它的意图?

  •  0
  • android developer  · 技术社区  · 7 年前

    背景

    我们有一个大型应用程序,它具有各种功能,使用多个库,并使用 BroadcastReceiver :

        <receiver android:name="....PhoneBroadcastReceiver">
            <intent-filter >
                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter>
            <intent-filter >
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>
    

    最近我注意到如果我们使用最近的任务关闭应用程序 广播接收机

    这是个问题,因为应用程序需要立即处理电话。

    我试过发现的

    1. here ),如果我在 而不是真正的逻辑,我可以看到它得到处理马上。我甚至将这个大型应用程序的所有权限都添加到了我制作的这个示例应用程序中(并授予了它们),它仍然工作得非常好。遗憾的是,添加大型应用程序使用的库可能需要花费大量时间来添加和测试

    2. 我在想可能是应用程序扩展的类(或者 MultiDexApplication ,准确地说)花费了太多时间,所以我在那里添加了一个日志(开始于 onCreate ). 它确实需要一点时间(一秒钟左右),但是日志会在一段时间后显示,它和 很小。所以这个问题应该是由比应用程序或 广播接收机

    3. 我想可能是因为我们用多索引。我试着把它关掉,但没用。我认为它甚至不会影响它,因为我已经在Android P的Pixel 2上试过了。

    4. 我试着确定 广播接收机 max allowed

    5. 我以为操作系统可能会为应用程序分配大量内存,这可能需要一些时间,但我知道,其他倾听相同意图的应用程序(如TrueCaller)即使在我从最近的任务中关闭应用程序后也能正常工作。我还测试了应用程序使用了多少内存,以及TrueCaller使用了多少内存。这款应用在我的Pixel2上平均使用33MB的内存,而TrueCaller使用的是2MB。我从“开发人员选项”屏幕上得到了这些值,即“内存使用量”。奇怪的是,它告诉最大内存使用量是巨大的(大约1GB),即使是从头开始的应用程序,但我从来没有看到它在探查器,甚至没有接近(大约200MB)。我认为这个屏幕不是检查内存使用情况的可靠方法。

    6. 我以为把这个应用程序排除在电池优化之外可能会有帮助,但它没有帮助。即使是向用户请求这个功能的TrueCaller,在这种情况下也不需要它。它在那里工作得很好,不用设置。

    7. 我认为唯一可能的原因是,应用程序使用的库。有很多,但我想知道什么可能影响应用程序,甚至在扩展应用程序的类被调用之前。。。遗憾的是,有这么多,这将需要很多时间来添加到POC项目中。我想我会做的,但我不知道这是否真的是原因。

    1. 有什么可能影响 广播接收机 这么晚才明白目的?这也许是我提到的事情之一?


    编辑:我注意到一些库初始化在扩展应用程序的类的onCreate调用中花费了太多时间,所以我将其中一些放在了后台线程中,有些甚至删除了。

    看起来好多了,但问题是,手机响后应用程序被触发得太晚了,所以这个问题仍然存在。

    1 回复  |  直到 7 年前
        1
  •  0
  •   android developer    7 年前

    好吧,看来我错了,而且这个意图可能会晚一点收到,这取决于操作系统,也许取决于应用程序的亮度。

    我现在这么想的原因是,我注意到即使是真正的来电者也不总是立即出现。有时也会花很长时间。

    因此,我认为安全地倾听这些意图的唯一方法是通过编程而不是通过清单。

    在前台服务中是这样的意思:

            telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
            telephonyManager!!.listen(phoneStateListener, PhoneStateListener.LISTEN_CALL_STATE)
    

    推荐文章