1.ANR
Android系统要求一些事件在一定时间内完成,如果超过预定时间未得到有效响应或响应时间过长,就会造成ANR(Application Not Responding应用程序未响应)。
Android中有4种ANR发生场景:
①点击事件(按键和触摸事件):点击事件在5s内未被处理,日志描述为Input event dispatching timed out。
②服务Service: 前台Service20s内、后台Service 200s内未完成启动,日志描述为Timeout executing service。
③广播BroadcastReceiver:前台广播10s内、后台广播60s内,onReceive()在规定时间内没处理完,日志描述为Timeout of broadcast Broadcast Record。
注意,前台广播的ANR时间是10s内onReceive()没有执行完就提示,这是在没有点击触摸事件导致ANR的前提下才是10s,否则会先触发点击事件的ANR,onReceive()有可能执行不到10s就发生 ANR,所以不要在onReceive()处理耗时操作。
④内容提供者ContentProvider:publish在10s内没处理完,日志描述为Timeout publishing content providers。
这4种ANR的触发方式分为两种:通过handler的延迟机制触发ANR和Input事件触发ANR。其中Service、BroadcastReceiver、ContentProvider都是通过Hander机制触发ANR。
ANR产生需要同时满足三个条件:
①主线程:只有应用程序的主线程响应超时才会产生ANR;
②超