按产生机制分为四类
-
输入时间超时(5s)—— InputEvent Timeout
a. InputDispatcher 发送 Key 事件给对应的进程的 Foucused Window,对应的 window 不存在、处于暂停态、或者通道(input channel)占满、通道未注册、通道异常、或5秒内没有处理完一个事件,就会发生ANR
b. InputDispatcher 发送 MotionEvent 事件有个例外之处:当对应Touched Window 的 Input waitQueue 中有超过 0.5s 的事件,inputDispatcher 会暂停该事件,并等待 5s,如果依然没有收到 window 的 finsish 事件,则触发 ANR
c. 下一个事件到达,发现有一个超时事件才会触发ANR
-
广播类型超时(前台15s,后台60s)——BroadcastReceiver Timeout
a. 静态注册的广播和有序广播会ANR,动态注册的非有序广播不会ANR
b. 广播发送时,会判断该进程是否存在,不存在则创建,创建进程的耗时也算在超时时间里
c. 只有当前进程存在前台显示的 Activity 才会弹出 ANR 对话框,否则会直接杀掉当前进程
d. 当 onReceive 执行超过阈值(前台15s,后台60s)将产生 ANR