“BUG实例分析四:android.intent.action.SCREEN OFF未被及时处理导致系统消息阻塞”的版本间的差异
来自个人维基
(以“logcat: <pre> 08-24 17:47:09.688 I/ANRManager( 609): startAsyncDump: AnrDumpRecord{ Broadcast of Intent { act=android.intent.action.SCREEN_OFF flg=0x50 0010 } Proce...”为内容创建页面) |
2015年5月6日 (三) 20:12的最后版本
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这个广播不加以注册,则不会引起系统问题(当然应用还是会有问题)。