最近在我的应用KeepassA中碰到了一个诡异的过渡动画问题
API版本:29
正常状态应该如下:
当我从一级设置界面,进入二级设置界面后,并从二级设置界面返回时,一级界面当回主页的过渡动画消失了!!
原因分析
阅读源码发现,返回时调用的finishAfterTransition()最终会调用ActivityTransitionState的startExitBackTransition方法,但是当我从二级界面返回到一级界面,并从一级界面返回主页时,pendingExitNames变为了空,导致直接走了finish,而没有走过渡动画的逻辑。
public void finishAfterTransition(){
if (!mActivityTransitionState.startExitBackTransition(this)) {
finish();
}
}
public boolean startExitBackTransition(final Activity activity){
ArrayList pendingExitNames = getPendingExitNames();
if (pendingExitNames == null || mCalledExitCoordinator != null) {
return false;
} else {
...
}
....
}
为什么会出现pendingExitNames为空的情况呢,继续阅读源代码,通过Activity的生命周期可以知道,每当activity开始活动时(从二级界面返回一级界面会回调onStart),导致重新调用了onNewActivityOptions方法。
/** @hide */
public void onNewActivityOptions(ActivityOptions options){
mActivityTransitionState.setEnterActivityOptions(this, options); // 重新设置了option
if (!mStopped) {
mActivityTransitionState.enterReady(this);
}
}
在mActivityTransitionState.setEnterActivityOptions(this, options);中会重新设置共享元素,
如果当前activity已经停止(启动了二级页面,并从二级界面返回)则会调用mActivityTransitionState.enterReady重新构建过渡动画。
public void enterReady(Activity activity){
...
// 重新创建过渡场景,但是该场景的共享元素列表 sharedElementNames 没有数据
mEnterTransitionCoordinator = new EnterTransitionCoordinator(activity,
resu