노트:window 및 window Manager

5187 단어
window 및 window Manager
  • 윈도우는 일상적인 개발에서 플로팅 창과 같이 아이폰 윈도우
  • 를 실현한다.
  • 윈도우의 창설은 윈도우 관리자를 통해 윈도우 관리자는 외부에서 윈도우에 접근하는 입구이다.

  • windowManager 가져오기:
          WindowManager      wm = (WindowManager)mContext.getSystemService(Context.WINDOW_SERVICE);
    

    window는 setWindow Manager() 방법을 통해 Window Manager와 연결됩니다.
  • 윈도우의 구체적인 실현은 윈도우 관리자 서비스에 있다. 윈도우 관리자와 윈도우 관리자 서비스의 상호작용은 IPC 과정이다
  • 안드로이드의 모든 보기는 윈도를 통해 나타난다. Activity,Dialog,Toast를 막론하고 그들의 보기는 실제적으로 윈도에 부가되어 있기 때문에 윈도는 실제적으로View의 실제 관리자이다
  • Activity에서 보기를 설정하는 방법 setContentView () 밑바닥도 윈도우를 통해 이루어진다
  • Window에는 3가지 유형
  • 이 있습니다.
  • 응용 프로그램 종류window는 하나의Activity(1~99)
  • 에 대응한다
  • 하위 window는 단독으로 존재할 수 없으며 특정한 아버지 window에 의존해야 한다. 예를 들어Dialog(1000~1999)
  • 시스템 윈도우는 설명 권한이 있어야만 만들 수 있는 윈도우입니다. 예를 들어toast, 시스템 상태 표시줄(2000~2999)
  • 윈도는 층으로 나뉘어져 있으며 모든 윈도에는 대응하는 z-ordered가 있다. 층이 큰 것은 층이 작은 위에 덮여 있고 html의 z-index 개념과 완전히 일치한다*
  • 계층은 각각 위쪽 범위이며 WindowManager에 해당합니다.LayoutParams.type 매개 변수, 맨 위에 덮어쓰려면 등급 범위를 최대로 설정하면 됩니다. 즉, 시스템 등급입니다. 일반적으로 다음과 같습니다.
    TYPE_SYSTEM_OVERLAY
    TYPE_SYSTEM_ERROR
    mLayoutParams.type = LayoutParams.TYPE_SYSTEM_동시에 ERROR 권한 선언
    
    
  • Window Manage는 개발자가 계승하여 사용할 수 있는 세 가지 방법만 제공한다:
  • public interface ViewManager{
        public void addView(View view, ViewGroup.LayoutParams params);
        public void updateViewLayout(View view, ViewGroup.LayoutParams params);
        public void removeView(View view);
    }
    
  • Window Manager 구현 클래스는 Window Manager Impl
  • 입니다.
    Window Manager Impl은 Window의 3대 조작을 직접적으로 실현하지 않고 모두 Window Manager Global에 맡겨 처리한다. Window Manager Global은 공장의 형식으로 외부에 실례를 제공한다. - 전형적인 브리지 모델
    Activity Window 작성 프로세스
  • Activity의 윈도 창설은attach() 방법에서 이루어졌고,attach() 방법에서는 시스템이Activity에 속하는 윈도 대상을 만들고 리셋 인터페이스를 설정합니다.윈도 대상의 창설은Policy Manager의makeNew 윈도 방법으로 이루어집니다
  • Activity가 윈도의 CallBack 인터페이스를 실현했기 때문에 윈도가 외부의 리셋을 받아들이면 Activity로 리셋하는 방법, 예를 들어 onAttachToWindow(), onDetachFromWindow(), dispatchTouchEvent()
    Policy Manager는 정책 클래스입니다. Policy Manager에서 실현된 몇 가지 공장 방법은 정책 인터페이스 IPolicy에서 설명합니다. 그 중에서make New Window () 방법에서 new Phone Window () 를 완성합니다.
    (25 버전에서 원본 Activity의attch 방법에서 new PhoneWindow () 를 직접 사용하고 공장 모드가 없음)
  • Activity 보기가 윈도에 어떻게 붙는지
  • setContentView()를 사용하여 첨부할 수 있습니다. setContent는 구체적으로 다음과 같습니다.
  • DecorView가 없으면 생성
  • DecorView의 mContentParent에 View 추가
  • Activity를 리셋하는 onContentChanged () 방법은Activity의 보기가 변경되었음을 알립니다
  • Activity Thread의handle ResumeActivity 방법에서 먼저onResume 방법을 호출한 다음에Activity의makeVivible () 방법을 호출합니다.makeVisible () 방법에서DecorView는 이 두 과정을 표시하고 추가하는 것을 완료하고Activity를 사용자에게 보여 줍니다.
    //Activity.java
        void makeVisible() {
            if (!mWindowAdded) {
                ViewManager wm = getWindowManager();
                wm.addView(mDecor, getWindow().getAttributes());
                mWindowAdded = true;
            }
            mDecor.setVisibility(View.VISIBLE);
        }
    

    Dialog Window 작성 프로세스
  • Dialog는 Phone Window를 사용하고 낮은 버전은 Plicy Manager의make New Window 방법을 사용하여 완성하며 높은 버전은 직접 new Phone Window()를 사용한다.소스 참조
  • 작성 단계
  • Window
  • 작성
  • DecorView를 초기화하고 Dialog 보기를 DecorView에 추가
  • setContentView()
  • DecorView를 윈도에 추가하고Dialog의 show () 방법에 표시하며 윈도 관리자를 통해 DecorView를 윈도에 추가합니다
     mWindowManager.addView(mDecor, l);
     mShowing = true;
    
  • 일반 Dialog의 Context는 Activity의 Context를 사용해야 하며 ApplicationContext를 사용하면 오류가 발생합니다.일반 Dialog에는 Window
  • 가 필요합니다.
    Toast의 Window 작성 프로세스
  • Toast 내부에는 두 가지 유형의 IPC 통신 프로세스가 있음
  • Toast 액세스 Notification Manager Service
  • Notification Manager 서비스 리셋 TN의 인터페이스
  • TN은 Binder 클래스로 NMS가 크로스 프로세스에서 TN을 호출하는 방법입니다. 예를 들어hide(), show()
  • 모든 TN의hide, show () 등 방법은 Binder 스레드 탱크에서 실행되기 때문에handle을 현재 스레드로 전환해야 합니다.
    현재 라인으로 전환하는 것을 주의하십시오.Looper가 없는 스레드에서는 Toast가 제대로 작동하지 않습니다.
  • Toast의 show () 방법
  •     public void show() {
            if (mNextView == null) {
                throw new RuntimeException("setView must have been called");
            }
    
            INotificationManager service = getService();
            String pkg = mContext.getOpPackageName();
            TN tn = mTN;
            tn.mNextView = mNextView;
    
            try {
                service.enqueueToast(pkg, tn, mDuration);
            } catch (RemoteException e) {
                // Empty
            }
        }
    

    queueToast는 먼저 Toast를 Toast Record 대상으로 봉하여 mToast Queue 대기열에 추가합니다. mToast Queue는 사실상Array List입니다. 비시스템 응용 프로그램의 경우 이list 길이는 최대 50개의 Toast Record입니다. 이렇게 하는 것은 DOS(서비스 공격 거부)를 방지하기 위해서입니다. 즉, 대량의 순환으로 Toast를 튕기면 다른 응용 프로그램은 튕길 수 없습니다.
  • 토스트의 원리는 바로 Binder 통신이다. 토스트는 쇼 방법을 사용하고 내부에서 이 토스트와 TN을 시스템 프로세스에서 실행되는 NMS에 전달한다. 시스템 프로세스가 TN의 쇼를 제어하는 방법이다. 시스템은 토스트를 통일적으로 관리해야 한다. NMS는 이 토스트를 Array List 실행 대기열에 넣고 while가 이 토스트로 순환할 때 이 토스트가 TN에 대한 대상을 꺼낸다.다시 Binder 통신을 통해 원격 TN 대상의 show 방법을 실행합니다. show 방법은handle을 통해 show 프로세스를 Binder 스레드 풀에서 벗어나 Looper 스레드에서 실행합니다. show에서 실제적으로 Window Manage의addView 방법을 통해 View를 window에 추가합니다.이렇게 하면 Toast 디스플레이 프로세스가 한 번 완성되고 hide 프로세스와 같다.
  • 좋은 웹페이지 즐겨찾기