以编程方式加载Drawable时,applicationContext与Activity Context是否有差异?
在编程加载Drawable资源时,这两种上下文确实存在关键差异,主要体现在以下几个方面:
主题样式适配
部分Drawable资源依赖当前组件的主题属性(比如引用?attr/colorPrimary、?attr/alertDialogTheme这类主题值)。用Activity Context加载时,会使用该Activity的自定义主题;而ApplicationContext会使用应用的默认主题,导致Drawable的样式与当前页面预期不符。
举个例子:如果你的Activity设置了深色主题,其中修改了colorAccent,用Activity Context加载引用该属性的按钮背景Drawable,会显示深色主题下的配色;用ApplicationContext加载则会显示应用默认浅色主题的配色。配置变更响应
Activity Context会跟随所在Activity的配置变化(比如屏幕旋转、系统语言切换、字体大小调整)自动更新资源加载的上下文;ApplicationContext是全局单例,不会随单个Activity的配置变更而同步更新。
比如用户切换系统语言后,用Activity Context加载的多语言Drawable会自动切换为新语言版本;而用ApplicationContext加载的Drawable仍会保持旧语言版本,除非重启应用或手动触发配置更新。内存泄漏风险
如果将通过Activity Context加载的Drawable长期持有(比如存入全局单例、静态集合),会间接持有Activity的引用,导致Activity无法被GC回收,引发内存泄漏。而ApplicationContext本身是全局单例,用它加载的Drawable不会带来这类泄漏风险。
建议:若需要缓存Drawable供全局使用,优先选择ApplicationContext加载。特殊Drawable兼容性
对于VectorDrawable这类需要兼容低版本(API < 21)的Drawable,结合AppCompatActivity的Activity Context(经过AppCompat包装)能更顺畅地处理兼容逻辑;直接使用ApplicationContext加载时,可能需要额外配置AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)才能正常显示。
内容的提问来源于stack exchange,提问作者Mahmoud Omara

