锁屏界面点击通话通知,快速home返回,返回锁屏后自动进入密码界面

问题描述

锁屏界面点击通话通知,进入通话界面后,快速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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值