Android中继承父Activity的子类是否有独立Context?finish()异常解惑
问题分析:继承Activity中调用finish()未关闭子类Activity的原因
问题场景
我定义了一个模板Activity类:
open class AbstractActivity : AppCompatActivity(){ override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ... 其他实现代码 } }
项目里几乎所有Activity都继承这个AbstractActivity,同时定义了子类Activity:
class MyActivity : AbstractActivity(){ // ... 子类业务代码 }
调试时发现,在AbstractActivity的onActivityResult方法里调用finish(),居然只关闭了AbstractActivity,没关闭MyActivity。按面向对象的理解,调用父类里的finish()应该关闭整个MyActivity才对,这是怎么回事?
核心原因解析
首先要明确:Android中,子类Activity的实例就是它本身,不存在父类和子类两个独立的实例,也不会有两个独立的Context。你遇到的问题和继承本身无关,大概率是以下场景之一:
- 任务栈中存在两个Activity实例:你可能在跳转逻辑里误启动了
AbstractActivity而非MyActivity,或者重复调用了启动代码,导致任务栈里同时存在AbstractActivity和MyActivity两个实例。此时父类里的finish()只是关闭了父类自己的实例,子类实例还留在栈中。 onActivityResult调用链断裂:如果MyActivity重写了onActivityResult但没调用super.onActivityResult(),那父类里的finish()代码根本不会执行。但你描述的是父类代码执行了却只关闭自己,这种情况更偏向于栈中有两个实例。- 错误的实例引用:如果父类里错误使用了其他Context(比如
applicationContext)调用finish(),但finish()是Activity实例方法,只有当前Activity实例调用它才会关闭自己。不过这种情况很少见,默认this就是当前实例。
验证与解决步骤
- 检查启动逻辑:确认所有启动
MyActivity的地方,有没有写成启动AbstractActivity,或者是否存在重复启动的代码。 - 查看任务栈:用Android Studio的
App Inspection工具查看当前任务栈里的Activity实例,确认是否存在两个不同的实例。 - 确认调用链完整性:如果
MyActivity重写了onActivityResult,必须确保调用super.onActivityResult(requestCode, resultCode, data),否则父类的逻辑不会被执行。 - 打印实例标识:在父类的
finish()处打印当前实例的hashCode(),再在MyActivity的onCreate里打印同一个值,若hashCode不同,说明是两个独立实例。
内容的提问来源于stack exchange,提问作者Pranay Avvaru
相关产品推荐
相关产品推荐

