主要观点总结
本文介绍了ANR(Application Not Responding)的概述及其触发时机,重点阐述了Service、Broadcast和ContentProvider的ANR产生机制和计时流程。
关键观点总结
关键观点1: ANR概述及触发时机
ANR是应用程序未响应的缩写,Android系统对一些事件有一定的时间限制,超过预定时间未响应或响应时间过长都会造成ANR。触发时机包括输入事件、广播、Service、ContentProvider等,每种触发的时机都有规定的时间限制。
关键观点2: Service的ANR
Service的ANR在于时间的控制,开始计时的逻辑是通过AMS的realStartServiceLocked方法启动service,在scheduleServiceTimeout中发出一个延时的消息,延时的时间根据是前台服务还是后台服务来判断。服务超时后,会记录ANR的一些信息,并通过Handler发送ANR的相关信息。
关键观点3: Broadcast的ANR
Broadcast的ANR计时开始是通过AMS的broadcastIntentLocked方法,根据标志位决定是前台广播还是后台广播,拿到对应的广播队列后,设置超时时间并通过Handler发送超时时间的消息。取消计时则是在处理串行广播时,如果没有超时则取消message。最后也是在AnrHelper中发送ANR的相关信息。
关键观点4: ContentProvider的ANR
ContentProvider的创建和启动一般在进程启动的时候进行。在AMS的attachApplication方法中,会生成ContentProvider列表并通过Handler延时发送CONTENT_PROVIDER_PUBLISH_TIMEOUT_MSG消息,延时时间为10s。计时结束一般发生在进程消失或ContentProvider发布完成时,会移除ANR的超时消息。
文章预览
本文作者 作者: 付十一 链接: https://juejin.cn/post/7121217696594657293 本文由作者授权发布。 1 ANR概述 ANR(Application Not responding)是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间未能得到有效响应或者响应时间过长,都会造成ANR。 1.1、Anr的触发时机 anr的触发时机有很多种,基本分为以下几点: • 输入事件 :5s内无响应,如屏幕触碰事件; • 广播 :执行前台广播( BroadcastReceiver )的 onReceive() 方法时10s没有处理完成,后台广播的超时时间为60s; • Service :前台Service20s内没有执行完毕;后台Service200s内没有执行完毕; • ContentProvider :10s内 ContentProvider 的publish未执行完; 从上面4点来看,每一种触发的时机都是在规定的时间内,看你消不消费得完自身的事件,而本文所探讨的问题就是,这些时间是由谁
………………………………