发现这个奇怪问题的起因在于同事看了MVVM的相关文章,里面提到屏幕旋转时,Activity 销毁重建不会导致 ViewModel随着销毁而重建。
于是,就在项目中写了测试代码来验证。然后就发现了一个诡异的问题,打开的界面旋转后自动关闭了!!后来断点调试发现是因为 onDestroy 走了两次,分析逻辑之后,还原了执行流程,如下代码所示:
Demo
@Override
protected void onDestroy() {
super.onDestroy();
// 由于历史原因,我们的项目里面出现了这样的代码(经过简化逻辑之后)。
finish();
}
那么问题就来了,Activity 在重建时,是创建了新的对象,为何旧的对象调用 finish 方法会将新创建的 Activity 对象给销毁?
查看 finish 的源码:
Activity
android.app.Activity#finish(int)
private void finish(int finishTask) {
// mParent 为空,走里面的逻辑
if (mParent == null) {
...
try {
...
// 这里是最可疑的地方,AMS 是根据 mToken 的值去判断该 finish 哪个 Activity
if (ActivityManager.getService()
.finishActivity(mToken, resultCode, resultData, finishTask)) {
mFinished = true;
}
} catch (RemoteException e)