先普及一下基本知识:
什么是ANR
ANR,是“Application Not Responding”的缩写,即“应用程序无响应”。在Android中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会监测应用程序的响应时间,如果应用程序主线程(即UI线程)在超时时间内对输入事件没有处理完毕,或者对特定操作没有执行完毕,就会出现ANR。对于输入事件没有处理完毕产生的ANR,Android会显示一个对话框,提示用户当前应用程序没有响应,用户可以选择继续等待或者关闭这个应用程序(也就是杀掉这个应用程序的进程)。
产生ANR的三个必要条件
1.主线程
2.有输入事件
3.处理超时
产生ANR的情况
1.主线程对输入事件5秒没有处理完
2.主线程在执行BroadcastReceiver的onReceive函数时10秒内没有执行完毕
3.主线程在执行Service的各个生命周期函数时20秒内没有执行完毕
产生ANR对于Android开发再熟悉不过了,每到它发生的时候,很影响用户体验,是一个很严重的问题,严重到必须要通过关闭整个进程才能让手机正常运行。第二种和第三种情况都不会弹出dialog提示,我们通过底层源码分析第一种情况ANR的产生。
事件传递的源头是InputReader,然后用InputDispatcher发送,我们看如何发送这个事件。