IdleHandler是MessageQueue里的一个接口,有一个queueIdle方法,这个方法会在MessageQueue中没有消息时或者只有延迟消息时才会被调用。方法的返回值是一个boolean值,返回true会将IdleHandler保留,否则会将其移除

MessageQueue中有两个相关方法用于添加和移除IdleHandler,IdleHandler存放在一个ArrayList mIdleHandler中:

当MessageQueue为空时,会循环遍历一遍mIdleHandler,并执行IdleHandler.queueIdle方法。如果某些IdleHandler的queueIdle返回了true,则会被保留在mIdleHandlers中,下次消息队列空闲时依然会执行。

为什么 Activity.finish() 之后 10s 才 onDestroy ?

问题描述: 在A Activity启动B Activity,并结束A 页面,B页面在启动时进行大量的动画场景,源源不断的向主线程消息队列发送消息。A Activity的onPause正常执行,但是onStop与onDestory都延迟了10s才执行。为什么会出现这样的情况?

Activity 的 onStop/onDestroy依赖 IdleHandler 来回调的,正常情况下当主线程空闲时会调用。但是由于某些特殊场景下的问题,导致主线程迟迟无法空闲,onStop/onDestroy 也会迟迟得不到调用。但这并不意味着 Activity 永远得不到回收,系统提供了一个兜底机制,当 onResume 回调 10s 之后,如果仍然没有得到调用,会主动触发。