系統(tǒng)窗口創(chuàng)建過程

客戶端通過以下方式添加系統(tǒng)窗口

TextView textView = LayoutInflater.from(MainActivity.this).inflate(R.layout.window_view, null);
  TextView edit = (TextView) textView.findViewById(R.id.passwordEntry);
  edit.setInputType(InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_VARIATION_PASSWORD);
  
  WindowManager.LayoutParams mLp = new WindowManager.LayoutParams();
  mLp.type = WindowManager.LayoutParams.TYPE_TOAST;
  mLp.width = WindowManager.LayoutParams.MATCH_PARENT;
  mLp.height = WindowManager.LayoutParams.MATCH_PARENT;
  mLp.flags = WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
  | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
  | WindowManager.LayoutParams.FLAG_LAYOUT_INSET_DECOR;
  mLp.format = PixelFormat.TRANSLUCENT;
  mLp.gravity = Gravity.BOTTOM;
  mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
  ((WindowManager) getApplication().getSystemService(Context.WINDOW_SERVICE)).addView(textView, mLp);

之后系統(tǒng)的調用流程如下:

windows.png

WindowManagerServices$addWindow

    public int addWindow(Session session, IWindow client, int seq,
            WindowManager.LayoutParams attrs, int viewVisibility, int displayId,
            Rect outContentInsets, Rect outStableInsets, Rect outOutsets,
            InputChannel outInputChannel) {
       // OP_TOAST_WINDOW
       if (win.mAppOp != AppOpsManager.OP_NONE) {
       //在這里進行直接攔截,如果是要攔截的toast,設置改window不可見
       if (WmInjector.isAdToastApp(attrs)) {
           win.setAppOpVisibilityLw(false);
       } else {
          int startOpResult = mAppOps.startOpNoThrow(win.mAppOp, win.getOwningUid(),
               win.getOwningPackage());
           if ((startOpResult != AppOpsManager.MODE_ALLOWED) &&
                (startOpResult != AppOpsManager.MODE_DEFAULT)) {
                win.setAppOpVisibilityLw(false);
           }
       }
        return res;
    }
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容