BUG实例分析四:android.intent.action.SCREEN OFF未被及时处理导致系统消息阻塞

来自个人维基
2015年5月6日 (三) 20:12Hovercool讨论 | 贡献的版本

(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

logcat:

08-24 17:47:09.688 I/ANRManager(  609): startAsyncDump: AnrDumpRecord{ Broadcast of Intent { act=android.intent.action.SCREEN_OFF flg=0x50
0010 } ProcessRecord{417361b0 5221:com.example.intentblocktest/u0a10111} IsCompleted:false IsCancelled:false }
08-24 17:47:09.688 I/ANRManager(  609): dumpAnrDebugInfo begin: AnrDumpRecord{ Broadcast of Intent { act=android.intent.action.SCREEN_OFF
g=0x50000010 } ProcessRecord{417361b0 5221:com.example.intentblocktest/u0a10111} IsCompleted:false IsCancelled:false }
08-24 17:47:09.688 I/ANRManager(  609): dumpAnrDebugInfoLocked: AnrDumpRecord{ Broadcast of Intent { act=android.intent.action.SCREEN_OFF
g=0x50000010 } ProcessRecord{417361b0 5221:com.example.intentblocktest/u0a10111} IsCompleted:false IsCancelled:false }

原因:

android.intent.action.SCREEN_OFF广播为order,即如果其中注册了此广播的任何应用在处理此广播时未返回,则会导致后续broadcast的失败,出现ANR,导致系统无法唤醒。

而导致广播未被及时处理的原因,除了可能是由于对应的Receiver处理函数中一些操作长时间未完成外,也可能是由于整个应用进程被block了,从而没有机会去调用Receiver函数。

——为了验证这个问题,可以写一个应用,注册SCREEN_OFF广播,然后在onPause中加入一个死循环,则会导致系统无法点亮屏幕进入待机!而当将SCREEN_OFF这个广播不加以注册,则不会引起系统问题(当然应用还是会有问题)。