developer tip

Android의 WindowManager는 무엇입니까?

copycodes 2020. 12. 7. 08:22
반응형

Android의 WindowManager는 무엇입니까?


인터넷 검색을 시도했지만 직접적이고 명확한 답변이 없습니다.

개발자 웹 사이트 의 정의는 하나 분명하지 않다 :

앱이 창 관리자와 대화하는 데 사용하는 인터페이스입니다. Context.getSystemService(Context.WINDOW_SERVICE)이 중 하나를 얻으려면 사용하십시오 .

평범한 6 학년 영어를 가진 사람이 그것이 무엇인지 설명 할 수 있습니까?

그리고이 기능을 사용하여 한 활동에서 다른 활동으로 이동하더라도 여러 활동을 통해 남아있는 부동 개체를 만들 수 있습니까?


Android WindowManager는 z 순으로 정렬 된 창 목록, 표시되는 창 및 화면에 배치되는 방식을 관리하는 시스템 서비스입니다. 무엇보다도 앱을 열거 나 닫거나 화면을 회전 할 때 창 전환 및 애니메이션을 자동으로 수행합니다.

모든 활동에는 화면에 컨텐츠를 표시하는 데 사용되는 창이 있습니다. 활동에 대해 setContentView를 호출하면 해당보기가 활동의 기본 창에 연결됩니다. 기본 창은 화면을 채우므로 활동의 창은 다른 모든 활동을 숨 깁니다. WindowManager는 맨 위에있는 창을 표시합니다. 따라서 일반적으로 창에 대해 걱정할 필요가 없습니다. 활동을 생성하기 만하면 Android가 나머지 작업을 수행합니다.

그러나 화면을 채우지 않는 부동 창을 만드는 것과 같은 비정상적인 작업을 수행하려면 WindowManager와 상호 작용해야합니다. 다른 애플리케이션 앞에 표시되는 부동 창을 만들려는 경우 다른 앱이 포 그라운드로 오면 활동이 중지되고 해당 창이 숨겨 지거나 파괴되므로 활동을 사용할 수 없습니다. 대신 백그라운드 서비스에서 창을 표시해야합니다. 예를 들면 :

WindowManager.LayoutParams p = new WindowManager.LayoutParams(
    // Shrink the window to wrap the content rather than filling the screen 
    WindowManager.LayoutParams.WRAP_CONTENT,
    WindowManager.LayoutParams.WRAP_CONTENT,
    // Display it on top of other application windows, but only for the current user
    WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
    // Don't let it grab the input focus
    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
    // Make the underlying application window visible through any transparent parts
    PixelFormat.TRANSLUCENT);

// Define the position of the window within the screen
p.gravity = Gravity.TOP | Gravity.RIGHT;
p.x = 0;
p.y = 100;

WindowManager windowManager = (WindowManager)getSystemService(WINDOW_SERVICE);
windowManager.addView(myView, p);

이 작업을 수행하려면 AndroidManifest.xml에 다음 권한을 추가해야합니다.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

Android API 버전이 23보다 크면 android.permission.SYSTEM_ALERT_WINDOW런타임을 요청해야합니다. 또한 TYPE_SYSTEM_ERROR일부 유형은 Android API 26에서 더 이상 사용되지 않습니다. 방법은 다음과 같습니다.

public void showWindowManager() {
    if (requestPermission()) {
        return;
    }

    WindowManager.LayoutParams p =
            new WindowManager.LayoutParams(WindowManager.LayoutParams.WRAP_CONTENT,
                    WindowManager.LayoutParams.WRAP_CONTENT,
                    Build.VERSION.SDK_INT > Build.VERSION_CODES.O
                            ? WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
                            : WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    PixelFormat.TRANSLUCENT);


    final WindowManager windowManager = (WindowManager) getSystemService(WINDOW_SERVICE);
    LayoutInflater layoutInflater =
            (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
    final View popupView = layoutInflater.inflate(R.layout.window_manager_layout, null);
    windowManager.addView(popupView, p);

    // dismiss windowManager after 3s
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            windowManager.removeView(popupView);
        }
    }, 3000);
}

@TargetApi(Build.VERSION_CODES.M)
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE) {
        if (Settings.canDrawOverlays(this)) {
            showWindowManager();
        }
    }
}

public boolean requestPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        if (!Settings.canDrawOverlays(this)) {
            Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                    Uri.parse("package:" + getPackageName()));
            startActivityForResult(intent, ACTION_MANAGE_OVERLAY_PERMISSION_REQUEST_CODE);
            return true;
        }
    }
    return false;
}

창 관리자는 화면을 구성하고 어디로 가야하는지, 어떻게 계층화해야하는지 처리합니다.

Here is a nice open source example of a floating object. Floating Object Example

참고URL : https://stackoverflow.com/questions/19846541/what-is-windowmanager-in-android

반응형