Kotlin实现:此方式能否有效避免Android内存泄漏?
你的方案存在严重内存泄漏风险,并不合理
你当前的实现最大的问题是:在BaseActivity的onCreate中调用AppSettings.init(this)时,传入的是Activity实例的Context。而AppSettings是Kotlin的object单例,它的生命周期和整个应用完全绑定,会一直持有这个Activity的强引用。当Activity因屏幕旋转、页面返回等场景被销毁时,GC无法回收这个Activity实例,直接引发内存泄漏——Android Studio没给出警告只是静态分析没覆盖到这个场景,实际运行用内存检测工具肯定能测出问题。
正确的实现方式(既简化代码又避免泄漏)
核心原则是:单例只持有Application级别的Context,它的生命周期和应用一致,不会造成泄漏。
- 修正
AppSettings,确保只存储Application Context:
object AppSettings { lateinit var context: Context private set // 禁止外部直接修改,只能通过init初始化 fun init(appContext: Context) { // 强制存储Application级别的Context,避免误传Activity/Fragment Context this.context = appContext.applicationContext } /* 其他配置相关代码 */ }
- 保留
AWApplication中的初始化逻辑(这里传入的是Application实例,本身就是全局安全的Context):
typealias aw = AppSettings @HiltAndroidApp class AWApplication : MultiDexApplication() { override fun onCreate() { super.onCreate() AppSettings.init(this) } /* 其他代码 */ }
- 彻底移除
BaseActivity中的AppSettings.init(this)调用:
@AndroidEntryPoint open class BaseActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 删掉AppSettings.init(this)这一行 } }
为什么这样可行?
- Application Context的生命周期和应用完全同步,单例持有它不会导致任何内存泄漏:只要应用在运行,它就存在;应用退出时整个进程被销毁,也不存在残留引用的问题。
- 你依然可以在任意类中通过
aw.context获取全局Context,完全不用到处传递Context,满足你简化代码的核心需求。
内容的提问来源于stack exchange,提问作者Diego Perez
相关产品推荐
相关产品推荐

