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)
}
}
}