- 从如下log看失败的时候V Toast : ADD! Toast也add到window了,为啥就显示不出来呢
11-10 16:51:04.787 6381 6381 D logcxy : class:Toast,Methed:show enqueueToast
11-10 16:51:04.789 1594 1782 D logcxy : class:NotificationManagerService,Methed:enqueueToast 1 pkg=com.movisionxr.soundrecorddemokt
11-10 16:51:04.789 1594 1782 D logcxy : class:NotificationManagerService,Methed:enqueueToast 2
11-10 16:51:04.789 1594 1782 D logcxy : class:NotificationManagerService,Methed:enqueueToast isSystemToast=false,isPackageSuspended=false,notificationsDisabledForPackage=false
11-10 16:51:04.789 1594 1782 D logcxy : class:NotificationManagerService,Methed:enqueueToast appIsForeground=true
11-10 16:51:04.789 1594 1782 D logcxy : isSystemToast=false
11-10 16:51:04.792 1594 1782 D logcxy : class:NotificationManagerService,Methed:showNextToastLocked 0
11-10 16:51:04.792 1594 1782 D logcxy : class:NotificationManagerService,Methed:showNextToastLocked 1
11-10 16:51:06.794 1594 1594 D logcxy : class:NotificationManagerService,Methed:cancelToastLocked 1
11-10 16:51:06.794 1594 1594 D logcxy : class:NotificationManagerService,Methed:cancelToastLocked 2
11-10 16:51:06.804 1594 1594 D logcxy : class:NotificationManagerService,Methed:scheduleKillTokenTimeout
11-10 16:51:06.804 1594 1594 D logcxy : class:NotificationManagerService,Methed:cancelToastLocked 4
logcat | grep HANDLE
failed:
11-10 17:24:30.527 6117 7096 V Toast : SHOW: android.widget.Toast$TN@1a5cd3f
11-10 17:24:30.539 6117 6117 V Toast : HANDLE SHOW: android.widget.Toast$TN@1a5cd3f mView=null mNextView=android.widget.LinearLayout{e332b55 V.E...... ......I. 0,0-0,0}
11-10 17:24:30.539 6117 6117 V Toast : HANDLE HIDE: android.widget.Toast$TN@1a5cd3f mView=null
11-10 17:24:30.539 6117 6117 V Toast : ADD! android.widget.LinearLayout{e332b55 V.E...... ......I. 0,0-0,0} in android.widget.Toast$TN@1a5cd3f
11-10 17:24:32.528 6117 6133 V Toast : HIDE: android.widget.Toast$TN@1a5cd3f
11-10 17:24:32.529 6117 6117 V Toast : HANDLE HIDE: android.widget.Toast$TN@1a5cd3f mView=android.widget.LinearLayout{e332b55 V.E...... ........ 0,0-3840,133}
11-10 17:24:32.529 6117 6117 V Toast : REMOVE! android.widget.LinearLayout{e332b55 V.E...... ........ 0,0-3840,133} in android.widget.Toast$TN@1a5cd3f
成功:
11-10 17:27:16.737 6032 6032 V Toast : CANCEL: android.widget.Toast$TN@79e29f2
11-10 17:27:16.747 6032 6049 V Toast : SHOW: android.widget.Toast$TN@2f5054a
11-10 17:27:16.747 6032 6032 V Toast : HANDLE HIDE: android.widget.Toast$TN@79e29f2 mView=null
11-10 17:27:16.747 6032 6032 V Toast : HANDLE SHOW: android.widget.Toast$TN@2f5054a mView=null mNextView=android.widget.LinearLayout{b2bfcbb V.E..V... ......I. 0,0-0,0}
11-10 17:27:16.747 6032 6032 V Toast : HANDLE HIDE: android.widget.Toast$TN@2f5054a mView=null
11-10 17:27:16.747 6032 6032 V Toast : ADD! android.widget.LinearLayout{b2bfcbb V.E..V... ......I. 0,0-0,0} in android.widget.Toast$TN@2f5054a
11-10 17:27:18.748 6032 6612 V Toast : HIDE: android.widget.Toast$TN@2f5054a
11-10 17:27:18.748 6032 6032 V Toast : HANDLE HIDE: android.widget.Toast$TN@2f5054a mView=android.widget.LinearLayout{b2bfcbb V.E..V... ........ 0,0-3840,133}
11-10 17:27:18.748 6032 6032 V Toast : REMOVE! android.widget.LinearLayout{b2bfcbb V.E..V... ........ 0,0-3840,133} in android.widget.Toast$TN@2f5054a
- 从add 继续往下看,17:35:15.960 V/WindowManager( 1552): onExitAnimationDone 退出了启动动画,也就是说它退出了
if (localLOGV) Log.v(TAG, "ADD! " + mView + " in " + this);
// Since the notification manager service cancels the token right
// after it notifies us to cancel the toast there is an inherent
// race and we may attempt to add a window after the token has been
// invalidated. Let us hedge against that.
try {
mWM.addView(mView, mParams);
trySendAccessibilityEvent();
}
V/Toast ( 6932): ADD! android.widget.LinearLayout{5474eea V.E...... ......I. 0,0-0,0} in android.widget.Toast$TN@949af8c
11-10 17:35:15.950 I/WindowManager( 1552): SURFACE controller=Surface(name=StatusBar)/@0x38b6c21alpha=1.0 matrix=[1.0*1.0,0.0*1.0][0.0*1.0,1.0*1.0]: Window{c26e9a1 u0 StatusBar}
11-10 17:35:15.950 I/WindowManager( 1552): SURFACE SHOW (performLayout): StatusBar
11-10 17:35:15.950 V/WindowManager( 1552): Showing Surface(name=StatusBar)/@0x38b6c21 during relayout
11-10 17:35:15.950 I/WindowManager( 1552): <<< CLOSE TRANSACTION animate
11-10 17:35:15.950 I/WindowManager( 1552): !!! animate: exit mAnimating=false mBulkUpdateParams=4 hasPendingLayoutChanges=false
11-10 17:35:15.957 V/WindowManager( 1552): Window Window{80c5fec u0 Toast} client=android.os.BinderProxy@ef3229f token=WindowToken{a13443e android.os.Binder@a847cf9} (android.os.Binder@a847cf9) params={(0,54)(fillxwrap) gr=BOTTOM CENTER ty=TOAST fmt=TRANSLUCENT wanim=0x1030004
11-10 17:35:15.957 V/WindowManager( 1552): fl=NOT_FOCUSABLE NOT_TOUCHABLE KEEP_SCREEN_ON HARDWARE_ACCELERATED}
11-10 17:35:15.959 E/MY_TAG_Z( 1552): onWindowStateCreate windowWindow{80c5fec u0 Toast} mAttrs = {(0,54)(fillxwrap) gr=BOTTOM CENTER ty=TOAST fmt=TRANSLUCENT wanim=0x1030004
11-10 17:35:15.959 E/MY_TAG_Z( 1552): fl=NOT_FOCUSABLE NOT_TOUCHABLE KEEP_SCREEN_ON HARDWARE_ACCELERATED}
11-10 17:35:15.959 V/WindowManager( 1552): Attaching Window{80c5fec u0 Toast} token=WindowToken{a13443e android.os.Binder@a847cf9}
11-10 17:35:15.959 I/WindowManager( 1552): selectAnimation in Window{80c5fec u0 Toast}: transit=2
11-10 17:35:15.959 V/WindowManager( 1552): Loading animations: layout params pkg=com.test.toast resId=0x1030004
11-10 17:35:15.959 V/WindowManager( 1552): Loading animations: picked package=android
11-10 17:35:15.960 V/WindowManager( 1552): applyAnimation: win=WindowStateAnimator{f06efb5 Toast} anim=0 attr=0x1 a=android.view.animation.AlphaAnimation@dfb664a transit=2 type=2005 isEntrance=false Callers com.android.server.wm.WindowState.hideLw:2711 com.android.server.wm.WindowState.setForceHideNonSystemOverlayWindowIfNeeded:2750 com.android.server.wm.WindowManagerService.addWindow:1533
11-10 17:35:15.960 I/WindowManager( 1552): Loaded animation android.view.animation.AlphaAnimation@dfb664a for WindowStateAnimator{f06efb5 Toast}
11-10 17:35:15.960 I/WindowManager( 1552): java.lang.RuntimeException
11-10 17:35:15.960 I/WindowManager( 1552): at com.android.server.wm.WindowManagerService.logWithStack(WindowManagerService.java:1900)
11-10 17:35:15.960 I/WindowManager( 1552): at com.android.server.wm.WindowStateAnimator.applyAnimationLocked(WindowStateAnimator.java:1404)
11-10 17:35:15.960 I/WindowManager( 1552): at com.android.server.wm.WindowState.hideLw(WindowState.java:2711)
11-10 17:35:15.960 I/WindowManager( 1552): at com.android.server.wm.WindowState.setForceHideNonSystemOverlayWindowIfNeeded(WindowState.java:2750)
11-10 17:35:15.960 I/WindowManager( 1552): at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1533)
11-10 17:35:15.960 I/WindowManager( 1552): at com.android.server.wm.Session.addToDisplay(Session.java:164)
11-10 17:35:15.960 I/WindowManager( 1552): at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:525)
11-10 17:35:15.960 I/WindowManager( 1552): at com.android.server.wm.Session.onTransact(Session.java:139)
11-10 17:35:15.960 I/WindowManager( 1552): at android.os.Binder.execTransactInternal(Binder.java:1021)
11-10 17:35:15.960 I/WindowManager( 1552): at android.os.Binder.execTransact(Binder.java:994)
11-10 17:35:15.960 V/WindowManager( 1552): Starting animation on Window{80c5fec u0 Toast}: com.android.server.wm.LocalAnimationAdapter@a558ed8
11-10 17:35:15.960 I/WindowManager( 1552): Cancelling animation restarting=true
11-10 17:35:15.960 W/WindowManager( 1552): Unable to start animation, surface is null or no children.
11-10 17:35:15.960 I/WindowManager( 1552): Cancelling animation restarting=false
11-10 17:35:15.960 V/WindowManager( 1552): Animation done in WindowStateAnimator{f06efb5 Toast}: exiting=false, reportedVisible=false
11-10 17:35:15.960 V/WindowManager( 1552): onExitAnimationDone in Window{80c5fec u0 Toast}: exiting=false remove=false selfAnimating=false
11-10 17:35:15.960 V/WindowManager( 1552): Policy visibility false: Window{80c5fec u0 Toast}
11-10 17:35:15.961 I/WindowManager( 1552): enableScreenIfNeededLocked: mDisplayEnabled=true mForceDisplayEnabled=false mShowingBootMessages=false mSystemBooted=true
11-10 17:35:15.961 I/WindowManager( 1552): java.lang.RuntimeException: here
WindowManager( 1552): at com.android.server.wm.WindowManagerService.enableScreenIfNeededLocked(WindowManagerService.java:3287)
11-10 17:35:15.961 I/WindowManager( 1552): at com.android.server.wm.WindowState.hideLw(WindowState.java:2724)
11-10 17:35:15.961 I/WindowManager( 1552): at com.android.server.wm.WindowState.setForceHideNonSystemOverlayWindowIfNeeded(WindowState.java:2750)
11-10 17:35:15.961 I/WindowManager( 1552): at com.android.server.wm.WindowManagerService.addWindow(WindowManagerService.java:1533)
11-10 17:35:15.961 I/WindowManager( 1552): at com.android.server.wm.Session.addToDisplay(Session.java:164)
11-10 17:35:15.961 I/WindowManager( 1552): at android.view.IWindowSession$Stub.onTransact(IWindowSession.java:525)
11-10 17:35:15.961 I/WindowManager( 1552): at com.android.server.wm.Session.onTransact(Session.java:139)
11-10 17:35:15.961 I/WindowManager( 1552): at android.os.Binder.execTransactInternal(Binder.java:1021)
11-10 17:35:15.961 I/WindowManager( 1552): at android.os.Binder.execTransact(Binder.java:994
- 找到log里的addWindow(WindowManagerService.java:1533) mHidingNonSystemOverlayWindows肯定不是空,SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS属性很重要啊,就是后台有某个app有这个属性,TMD。
WMS
final boolean hideSystemAlertWindows = !mHidingNonSystemOverlayWindows.isEmpty();
Log.d("logcxy","class:WindowManagerService,Methed:addWindow hideSystemAlertWindows="+hideSystemAlertWindows);
for(int i =0 ;i < mHidingNonSystemOverlayWindows.size();i++){
Log.d("logcxy","class:WindowManagerService,Methed:addWindow window[i]="+i+",value="+mHidingNonSystemOverlayWindows.get(i).toString());
}
win.setForceHideNonSystemOverlayWindowIfNeeded(hideSystemAlertWindows);
if (surfaceShown && win.hideNonSystemOverlayWindowsWhenVisible()) {
if (!mHidingNonSystemOverlayWindows.contains(win)) {
mHidingNonSystemOverlayWindows.add(win);
}
} else {
mHidingNonSystemOverlayWindows.remove(win);
}
/**
* Returns true if any window added by an application process that if of type
* {@link android.view.WindowManager.LayoutParams#TYPE_TOAST} or that requires that requires
* {@link android.app.AppOpsManager#OP_SYSTEM_ALERT_WINDOW} permission should be hidden when
* this window is visible.
*/
boolean hideNonSystemOverlayWindowsWhenVisible() {
return (mAttrs.privateFlags & SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS) != 0
&& mSession.mCanHideNonSystemOverlayWindows;
}
- 想到我们是从设置启动的,做了实验,启动后后台kill设置,也好了,找到了使用这个的代码
这是google的系统设计 user版本的限制,去掉就好了,看你自己需求。
public class HideNonSystemOverlayMixin implements LifecycleObserver {
@VisibleForTesting
boolean isEnabled() {
return !Build.IS_DEBUGGABLE;
}
@OnLifecycleEvent(ON_START)
public void onStart() {
if (mActivity == null || !isEnabled()) {
return;
}
mActivity.getWindow().addSystemFlags(SYSTEM_FLAG_HIDE_NON_SYSTEM_OVERLAY_WINDOWS);
android.util.EventLog.writeEvent(0x534e4554, "120484087", -1, "");
}
网友评论