问题描述
锁屏界面点击通话通知,进入通话界面后,快速home。
返回锁屏后自动进入密码界面。
初步分析
进入通话瞬间点home键有问题,过一会点击home键没有问题。
应该是方法调用时机问题。
log分析
倒推log查看调用显示密码界面的地方
1、显示密码界面的流程
CentralSurfaces com.android.systemui D showBouncerOrLockScreenIfKeyguard isHiding false isKeyguardGoingAway(): false
CentralSurfaces com.android.systemui D showBouncerOrLockScreenIfKeyguard mState 1 primaryBouncerIsOrWillBeShowing(): false isKeyguardSecure(): true
CentralSurfaces com.android.systemui D showBouncerOrLockScreenIfKeyguard mStatusBarKeyguardViewManager.showBouncer isOccluded false java.lang.Throwable
at com.android.systemui.shade.ShadeControllerImpl.notifyExpandedVisibleChanged(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:164)
at com.android.systemui.shade.ShadeControllerImpl.makeExpandedInvisible(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:90)
at com.android.systemui.statusbar.phone.CentralSurfacesImpl$$ExternalSyntheticLambda13.run(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:15)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:243)
at android.os.Looper.loop(Looper.java:338)
at android.app.ActivityThread.main(ActivityThread.java:8524)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1064)
StatusBarKeyguardViewManager com.android.systemui D showBouncer(scrimmed = true)
PrimaryBouncerInteractor com.android.systemui D show isScrimmed: truejava.lang.Throwable
at com.android.systemui.keyguard.domain.interactor.PrimaryBouncerInteractor.show(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:3)
at com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.showPrimaryBouncer(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:21)
at com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.showBouncer(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:45)
at com.android.systemui.shade.ShadeControllerImpl.notifyExpandedVisibleChanged(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:181)
at com.android.systemui.shade.ShadeControllerImpl.makeExpandedInvisible(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:90)
at com.android.systemui.statusbar.phone.CentralSurfacesImpl$$ExternalSyntheticLambda13.run(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:15)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:243)
at android.os.Looper.loop(Looper.java:338)
at android.app.ActivityThread.main(ActivityThread.java:8524)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1064)
PrimaryBouncerInteractor com.android.systemui D show resumeBouncer: false
KeyguardSecurityView com.android.systemui D showNextSecurityScreenOrFinish(false):
KeyguardSecurityView com.android.systemui D showNext.. mCurrentSecurityMode = Pattern
KeyguardSecurityView com.android.systemui D showNextSecurityScreenOrFinish() - return finish = false mCurrentSecurityMode: Pattern
2、跟踪 makeExpandedInvisible
NotificationPanelView com.android.systemui D onPanelStateChanged mView.post(mMaybeHideExpandedRunnable):
NotificationPanelView com.android.systemui D mMaybeHideExpandedRunnable
ShadeControllerImpl com.android.systemui D makeExpandedInvisible: mExpandedVisible=true java.lang.Throwable
at com.android.systemui.shade.ShadeControllerImpl.makeExpandedInvisible(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:20)
at com.android.systemui.statusbar.phone.CentralSurfacesImpl$$ExternalSyntheticLambda13.run(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:15)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:243)
at android.os.Looper.loop(Looper.java:338)
at android.app.ActivityThread.main(ActivityThread.java:8524)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1064)
makeExpandedInvisible的调用和之前一样,也是onFlingEnd调过去的.通知栏展开动画结束后的回调
NotificationPanelView com.android.systemui D flingToHeight:onAnimationEnd
NotificationPanelView com.android.systemui D onFlingEnd 0
NotificationPanelView com.android.systemui D onFlingEnd 1
NotificationPanelView com.android.systemui D setAnimator mPanelUpdateWhenAnimatorEnds: true
NotificationPanelView com.android.systemui D isFullyCollapsed mExpandedFraction : 0.0
NotificationPanelView com.android.systemui D onFlingEnd 2
NotificationPanelView com.android.systemui D onFlingEnd 3
NotificationPanelView com.android.systemui D onFlingEnd 4
NotificationPanelView com.android.systemui D onFlingEnd 5
3、onLaunchAnimationCancelled中调用通知栏展开动画
ActivityLaunchAnimator com.android.systemui I Remote animation timed out
NotificationPanelView com.android.systemui D isFullyCollapsed mExpandedFraction : 1.0
CentralSurfaces com.android.systemui D onLaunchAnimationCancelled isLaunchForActivity : true isPresenterFullyCollapsed(): false !mPresenter.isCollapsing(): true mKeyguardViewMediator.isOccludeAnimationPlaying(): false
CentralSurfaces com.android.systemui D onLaunchAnimationCancelled 222 :
ShadeControllerImpl com.android.systemui D animateCollapse(): mExpandedVisible=trueflags=2
NotificationPanelView com.android.systemui D collapse delayed: true java.lang.Throwable
at com.android.systemui.shade.NotificationPanelViewController.collapse(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:18)
at com.android.systemui.shade.NotificationPanelViewController.collapse(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:2)
at com.android.systemui.shade.ShadeControllerImpl.animateCollapsePanels(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:99)
at com.android.systemui.shade.ShadeControllerImpl.collapseShade(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:2)
at com.android.systemui.shade.ShadeControllerImpl.collapseShade(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:4)
at com.android.systemui.statusbar.phone.StatusBarLaunchAnimatorController.onLaunchAnimationCancelled(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:123)
at com.android.systemui.animation.ActivityLaunchAnimator$AnimationDelegate$onTimeout$1.run(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:29)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:243)
at android.os.Looper.loop(Looper.java:338)
at android.app.ActivityThread.main(ActivityThread.java:8524)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1064)
NotificationPanelView com.android.systemui D collapse postDelayed(mFlingCollapseRunnable, 120)
问题定位
1、初步定位问题后,针对onLaunchAnimationCancelled添加log
public void onLaunchAnimationCancelled(boolean isLaunchForActivity) {
boolean isLaunchAnimationRunning = mCentralSurfacesComponent.getNotificationPanelViewController().isLaunchAnimationRunning();
Log.d(TAG, "onLaunchAnimationCancelled isLaunchForActivity : "+isLaunchForActivity + " isPresenterFullyCollapsed(): "+mPresenter.isPresenterFullyCollapsed()+" !mPresenter.isCollapsing(): "+!mPresenter.isCollapsing()+" isLaunchAnimationRunning: "+isLaunchAnimationRunning);
if (mPresenter.isPresenterFullyCollapsed() && !mPresenter.isCollapsing()
&& isLaunchForActivity) {
Log.d(TAG, "onLaunchAnimationCancelled 111 : ");
mShadeController.onClosingFinished();
} else {
Log.d(TAG, "onLaunchAnimationCancelled 222 : ");
mShadeController.collapseShade(true /* animate */);
}
}
2、正常的log
ActivityLaunchAnimator com.android.systemui I Remote animation timed out
CentralSurfaces com.android.systemui D onLaunchAnimationCancelled isLaunchForActivity : true mPresenter.isPresenterFullyCollapsed(): true !mPresenter.isCollapsing(): true
CentralSurfaces com.android.systemui D onLaunchAnimationCancelled 111 :
ShadeControllerImpl com.android.systemui D runPostCollapseRunnables : java.lang.Throwable
at com.android.systemui.shade.ShadeControllerImpl.runPostCollapseRunnables(go/retraceme 9178d533851e63cce33c940350e02d73bf6a749d5f5230e5e232ce22202cc45e:10)
at com.android.systemui.shade.ShadeControllerImpl.onClosingFinished(go/retraceme 9178d533851e63cce33c940350e02d73bf6a749d5f5230e5e232ce22202cc45e:1)
at com.android.systemui.statusbar.phone.StatusBarLaunchAnimatorController.onLaunchAnimationCancelled(go/retraceme 9178d533851e63cce33c940350e02d73bf6a749d5f5230e5e232ce22202cc45e:100)
at com.android.systemui.animation.ActivityLaunchAnimator$AnimationDelegate$onTimeout$1.run(go/retraceme 9178d533851e63cce33c940350e02d73bf6a749d5f5230e5e232ce22202cc45e:29)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:243)
at android.os.Looper.loop(Looper.java:338)
at android.app.ActivityThread.main(ActivityThread.java:8524)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1064)
3、异常的log
ActivityLaunchAnimator com.android.systemui I Remote animation timed out
CentralSurfaces com.android.systemui D onLaunchAnimationCancelled isLaunchForActivity : true isPresenterFullyCollapsed(): false !mPresenter.isCollapsing(): true mKeyguardViewMediator.isOccludeAnimationPlaying(): false
CentralSurfaces com.android.systemui D onLaunchAnimationCancelled 222 :
ShadeControllerImpl com.android.systemui D animateCollapse(): mExpandedVisible=trueflags=2
NotificationPanelView com.android.systemui D isFullyCollapsed mExpandedFraction : 1.0
NotificationPanelView com.android.systemui D collapse delayed: true java.lang.Throwable
at com.android.systemui.shade.NotificationPanelViewController.collapse(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:18)
at com.android.systemui.shade.NotificationPanelViewController.collapse(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:2)
at com.android.systemui.shade.ShadeControllerImpl.animateCollapsePanels(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:99)
at com.android.systemui.shade.ShadeControllerImpl.collapseShade(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:2)
at com.android.systemui.shade.ShadeControllerImpl.collapseShade(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:4)
at com.android.systemui.statusbar.phone.StatusBarLaunchAnimatorController.onLaunchAnimationCancelled(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:123)
at com.android.systemui.animation.ActivityLaunchAnimator$AnimationDelegate$onTimeout$1.run(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:29)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:243)
at android.os.Looper.loop(Looper.java:338)
at android.app.ActivityThread.main(ActivityThread.java:8524)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1064)
4、差异点
查看log发现 是isPresenterFullyCollapsed值的差异,导致走了不同的流程。调用了通知栏展开动画。
5、isPresenterFullyCollapsed
判断如下
@Override
public boolean isPresenterFullyCollapsed() {
return mNotificationPanel.isFullyCollapsed();
}
@Override
public boolean isFullyCollapsed() {
Log.d(TAG, "isFullyCollapsed mExpandedFraction : "+mExpandedFraction);
return mExpandedFraction <= 0.0f;
}
修改这个值的地方如下,因为点击了home键,过早的更新布局
NotificationPanelView com.android.systemui D setExpandedHeight height: 778.0 java.lang.Throwable
at com.android.systemui.shade.NotificationPanelViewController.setExpandedHeight(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:33)
at com.android.systemui.shade.NotificationPanelViewController.setExpandedFraction(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:7)
at com.android.systemui.shade.NotificationPanelViewController$7.onGlobalLayout(go/retraceme dada36def4a397b77030bcfb92af176e90c9826a066f37462f87d2e57727b944:80)
at android.view.ViewTreeObserver.dispatchOnGlobalLayout(ViewTreeObserver.java:1142)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:4021)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2779)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10037)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1508)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1517)
at android.view.Choreographer.doCallbacks(Choreographer.java:1085)
at android.view.Choreographer.doFrame(Choreographer.java:977)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1491)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:243)
at android.os.Looper.loop(Looper.java:338)
at android.app.ActivityThread.main(ActivityThread.java:8524)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1064)
NotificationPanelView com.android.systemui D setExpandedHeightInternal h: 778.0
修复方案
考虑在onGlobalLayout判断一下
NotificationPanelViewController.java
this.mView.getViewTreeObserver().addOnGlobalLayoutListener(
new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
if (mIsLaunchAnimationRunning){//添加过滤,动画期间,不改变Expanded的高度
Log.d(TAG, "onGlobalLayout mIsLaunchAnimationRunning return: "+mIsLaunchAnimationRunning);
return;
}
if (!mInstantExpanding) {
mView.getViewTreeObserver().removeOnGlobalLayoutListener(
this);
return;
}
if (mCentralSurfaces.getNotificationShadeWindowView()
.isVisibleToUser()) {
mView.getViewTreeObserver().removeOnGlobalLayoutListener(
this);
if (mAnimateAfterExpanding) {
notifyExpandingStarted();
mQsController.beginJankMonitoring(isFullyCollapsed());
fling(0 /* expand */);
} else {
setExpandedFraction(1f);//这里设置的高度
}
mInstantExpanding = false;
}
}
});
// Make sure a layout really happens.
this.mView.requestLayout();