Surface Duo 화면 관리자

주의

이 구성 요소는 사용되지 않으며 더 이상 지원되지 않습니다.

디스플레이 영역 및 접기 기능에 대한 정보를 검색하려면 Jetpack Window Manager를 사용해야 합니다.

또는 이중 화면 및 폴더블 디바이스에 자동으로 적응할 수 있는 이중 화면 컨트롤 및 레이아웃 중 하나를 사용합니다.

SurfaceDuoScreenManager는 두 가지 화면 관리자 구현을 위한 공통 프로토콜로, 하나는 Microsoft DisplayMask 라이브러리를 사용하고 다른 하나는 Google WindowManager 라이브러리를 사용합니다. 이 인터페이스는 화면 정보 수신기를 등록 및 등록 취소하는 데 사용해야 하는 메서드를 정의합니다.

화면 관리자를 만들려면 SurfaceDuoScreenManager 구현의 singleton 인스턴스를 반환하는 ScreenManagerProvider.getScreenManager()를 사용해야 합니다. 이 메서드를 호출하기 전에 Application.onCreate() 내부에서 ScreenManagerProvider.init(Application)를 호출하여 SurfaceDuoScreenManager의 singleton 인스턴스를 초기화해야 합니다. 이 호출은 필수입니다. 그렇지 않으면 IllegalStateException("SurfaceDuoScreenManager must be initialized inside Application#onCreate()") 예외가 발생합니다. SurfaceDuoScreenManager의 인스턴스를 만든 후 SurfaceDuoScreenManager.addScreenInfoListener(ScreenInfoListener?)를 사용하여 ScreenInfoListener 콜백을 등록하여 화면 모드 변경 시 알림을 받을 수 있습니다. 여러 수신기를 추가할 수도 있으므로 메모리 누수를 방지하려면 SurfaceDuoScreenManager.removeScreenInfoListener(ScreenInfoListener?)를 사용하여 등록을 취소해야 합니다.

또한 구성 변경을 처리하기로 한 경우 Activity에서 SurfaceDuoScreenManager.onConfigurationChanged(Configuration)를 호출해야 합니다. 그렇지 않으면 콜백이 트리거되지 않습니다.

class SampleApp : Application() {
    override fun onCreate() {
        super.onCreate()
        ScreenManagerProvider.init(this)
    }
}
class SampleActivity : AppCompatActivity(), ScreenInfoListener {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)
    }

    override fun onScreenInfoChanged(screenInfo: ScreenInfo) {
        if (screenInfo.isDualMode()) {
            // TODO: Add dual-screen behavior.
        } else {
            // TODO: Add single-screen behavior.
        }
    }

    override fun onResume() {
        super.onResume()
        ScreenManagerProvider.getScreenManager().addScreenInfoListener(this)
    }

    override fun onPause() {
        super.onPause()
        ScreenManagerProvider.getScreenManager().removeScreenInfoListener(this)
    }

    override fun onConfigurationChanged(newConfig: Configuration) {
        super.onConfigurationChanged(newConfig)
        ScreenManagerProvider.getScreenManager().onConfigurationChanged()
    }
}

콜백을 등록할 필요 없이 ScreenInfo 개체를 검색해야 하는 또 한 가지 옵션은 ScreenInfoProvider.getScreenInfo(Context) 메서드를 사용하는 것입니다. 보기를 창에 연결한 후 이 메서드를 호출해야 합니다. 그렇지 않으면 ScreenInfo의 일부 메서드가 null을 반환하거나 예외를 발생시킵니다.

class SampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        window?.decorView?.rootView?.let { rootView ->
            if (ViewCompat.isAttachedToWindow(rootView)) {
                val screenInfo = ScreenInfoProvider.getScreenInfo(this)
            } else {
                rootView.addOnAttachStateChangeListener(object : View.OnAttachStateChangeListener {
                    override fun onViewAttachedToWindow(view: View) {
                        rootView.removeOnAttachStateChangeListener(this)
                        val screenInfo = ScreenInfoProvider.getScreenInfo(this)
                    }

                    override fun onViewDetachedFromWindow(view: View) {}
                })
            }
        }
    }
}

Core Ktx 라이브러리를 사용하는 경우 다음을 수행합니다.

class SampleActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_sample)

        window?.decorView?.rootView?.doOnAttach {
            val screenInfo = ScreenInfoProvider.getScreenInfo(this)
        }
    }
}