Android系统中STOPPED应用无法接收广播的研究

之前写过一篇文章: 

Android 3.1后, 新安装的以及用户强行停止的apk, 无法监听广播的问题

今天终于研究了一下原理, 把代码执行逻辑贴上来:

ContextImpl.sendBroadcast()
    ActivityManagerNative.getDefault().broadcastIntent()
        ActivityManagerService.broadcastIntent()
            ActivityManagerService.broadcastIntentLocked()
                ActivityManagerService.collectReceiverComponents()
                    PackageManagerService.queryIntentReceivers()
                        PackageManagerService.ActivityIntentResolver.queryIntentForPackage()
                            IntentResolver.queryIntentFromList()
                                IntentResolver.buildResolveList()
                                    PackageManagerService.ActivityIntentResolver.isFilterStopped()
                                        return (ps.pkgFlags&ApplicationInfo.FLAG_SYSTEM) == 0 && ps.getStopped(userId);

结论: 

只有非STOPPED状态的应用, 以及系统应用, 可以接收到Intent中不包含FLAG_INCLUDE_STOPPED_PACKAGES的广播.

猜你喜欢

转载自oliveexcel.iteye.com/blog/2304103