Android单例引用已销毁Activity视图的有效性问询
好问题!咱们把这个场景拆解清楚:
首先明确SecondaryActivity finish后的状态:当你在SecondaryActivity里调用
finish(),它会被从Activity栈中移除,系统会依次触发onPause()→onStop()→onDestroy()这些生命周期回调。一旦onDestroy()执行完成,这个SecondaryActivity实例就会被标记为可被垃圾回收(GC)的对象,它内部的所有成员变量(包括通过视图绑定获取的tvTextView)都会失去有效的引用关联。视图绑定的生命周期关联:你在SecondaryActivity中做的视图绑定,本质上是把视图对象和当前的Activity实例绑定在一起。当Activity被销毁,这些视图对象也会跟着Activity实例一起,成为GC的回收目标——它们不再属于任何活跃的UI上下文,自然也无法被正常访问。
MainActivity能否引用到原TextView?
正常情况下完全不会。因为原SecondaryActivity和它的视图都已经被销毁,没有任何合法的方式让MainActivity获取到这个已经失效的TextView引用。但要注意一种例外情况:如果你的代码存在内存泄漏(比如把这个TextView的引用存到了静态变量、全局单例,或者其他生命周期比SecondaryActivity长的对象里),那这个TextView的引用可能会被意外保留下来。但这属于错误的代码写法,会导致内存泄漏问题,绝对不是Android开发的正常流程,需要尽量避免。
总结一下:正常流程中,SecondaryActivity被finish()销毁后,原TextView的引用会被系统清理,MainActivity不可能再引用到它;只有出现内存泄漏的错误时才会有残留引用,但这是需要修复的问题,不是预期行为。
内容的提问来源于stack exchange,提问作者Greg Peckory

