Android Framework 常见解决方案(11)关闭View Full Screen弹窗

1 原理

  • Android O:在PhoneWindowManager中找到可以添加白名单的地方,直接屏蔽即可。
  • Android Q:主要就是找到其对应的handler,对于显示部分压根不允许其给主进程发送消息。

2 修改方案

对话框显示为:

Android Framework 常见解决方案(11)关闭View Full Screen弹窗_第1张图片

2.1 不让view full screen弹出的解决方案(Android O)

在文件frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java中做如下修改:

public class PhoneWindowManager implements WindowManagerPolicy {
    //...
    //添加新方法initIMCWhileList,加入白名单
    private void initIMCWhileList(){
       String preconfirmIMCWhileList = "immersive.preconfirms=com.seedland.launcher";
       Settings.Global.putStringForUser(mContext.getContentResolver(),
                       Settings.Global.POLICY_CONTROL,
                       preconfirmIMCWhileList,
                       UserHandle.USER_CURRENT);
    }

     /** {@inheritDoc} */
     @Override
     public void init(Context context, IWindowManager windowManager,
         //...
         mImmersiveModeConfirmation = new ImmersiveModeConfirmation(mContext);
         initIMCWhileList();//调用新方法
         mWindowManagerFuncs.registerPointerEventListener(mSystemGestures);
 
         mVibrator = (Vibrator)context.getSystemService(Context.VIBRATOR_SERVICE);
         //...
     }
     //...
}

2.2 修改方案(Android Q)

在文件frameworks/base/services/core/java/com/android/server/wm/ImmersiveModeConfirmation.java中做如下修改:

public class ImmersiveModeConfirmation {
    private static final String TAG = "ImmersiveModeConfirmation";
    //...
    void immersiveModeChangedLw(String pkg, boolean isImmersiveMode,
            boolean userSetupComplete, boolean navBarEmpty) {
        mHandler.removeMessages(H.SHOW);
        if (isImmersiveMode) {
            final boolean disabled = PolicyControl.disableImmersiveConfirmation(pkg);
            if (DEBUG) Slog.d(TAG, String.format("immersiveModeChanged() disabled=%s sConfirmed=%s",
                    disabled, sConfirmed));
            if (!disabled
                    && (DEBUG_SHOW_EVERY_TIME || !sConfirmed)
                    && userSetupComplete
                    && !mVrModeEnabled
                    && !navBarEmpty
                    && !UserManager.isDeviceInDemoMode(mContext)
                    && (mLockTaskState != LOCK_TASK_MODE_LOCKED)) {
                //注释掉的内容为显示View Full Screen的对话框所需要发送的消息
                //mHandler.sendEmptyMessageDelayed(H.SHOW, mShowDelayMs);
            }
        } else {
            mHandler.sendEmptyMessage(H.HIDE);
        }
    }
    //...
}

 

 

 

 

你可能感兴趣的:(常见解决方案,framework,android)