문제

인터넷 검색을 시도했는데 직접 및/또는 명확한 컷 답변이 없습니다.

그만큼 개발자 웹 사이트의 정의는 명확하지 않습니다.

앱이 Window Manager와 대화하는 데 사용하는 인터페이스. 사용 Context.getSystemService(Context.WINDOW_SERVICE) 이 중 하나를 얻으려면.

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

그리고 어떻게 그것을 사용하여 여러 활성화를 통해 남아있는 떠 다니는 물체를 만들 수 있습니까?

도움이 되었습니까?

해결책

Android Windowmanager는 시스템 서비스로 Z에 의한 Windows 목록을 관리하는 Windows가 보이고 화면에 배치되는 방법. 무엇보다도 앱을 열거 나 닫거나 화면을 회전 할 때 자동으로 창 전환 및 애니메이션을 수행합니다.

모든 활동에는 화면에 내용을 표시하는 데 사용되는 창이 있습니다. 활동에서 setContentView를 호출하면 해당보기가 활동의 기본 창에 첨부됩니다. 기본 창이 화면을 채우므로 활동의 창이 다른 활동을 숨 깁니다. WindowManager는 위에있는 창이 표시됩니다. 따라서 일반적으로 Windows에 대해 걱정할 필요가 없습니다. 단지 활동을 만들고 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;
}

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

다음은 떠 다니는 물체의 멋진 오픈 소스 예입니다.부동 물체 예제

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top