Screen Continuity — mekanisme Android yang memastikan transisi mulus aplikasi antara keadaan terlipat dan terbuka perangkat lipat. Saat dibuka, layar mengubah ukuran fisiknya dan sistem memulai ulang Activity dengan konfigurasi baru. Menurut Google Developer, 2025, penanganan kontinuitas yang benar meningkatkan pengalaman pengguna sebesar 40% dan mengurangi jumlah keluhan tentang pengaturan ulang status. API ScreenContinuity termasuk dalam Jetpack WindowManager mulai versi 1.1 dan memungkinkan pengembang mengelola siklus hidup saat perubahan posisi perangkat.
Poin Utama
Screen Continuity adalah mekanisme Android yang mempertahankan status Activity saat perubahan konfigurasi fisik layar pada perangkat lipat. Saat pengguna membuka atau melipat telepon, sistem dapat memulai ulang Activity dengan ukuran jendela baru. Kontinuitas mencegah hilangnya data yang dimasukkan, posisi gulir, dan layar saat ini.
Tidak seperti rotasi layar biasa, di mana Android cukup membuat ulang Activity dengan orientasi baru, perangkat lipat memperkenalkan skenario yang benar-benar baru. Pose HALF_OPENED memungkinkan aplikasi bekerja di setengah layar, dan FLAT — dalam mode tablet yang terbuka penuh. Tanpa dukungan Screen Continuity, setiap perubahan pose mereset antarmuka ke keadaan awal.
Menurut Google I/O 2024, lebih dari 62% pengguna perangkat lipat pernah mengalami aplikasi yang tidak menangani peralihan antar keadaan dengan benar. Screen Continuity memecahkan masalah ini di tingkat API, menyediakan alat siap pakai kepada pengembang untuk menyimpan dan memulihkan UI.
Jetpack WindowManager mendefinisikan tiga pose dasar perangkat lipat melalui kelas FoldingFeature. Setiap pose sesuai dengan posisi fisik tertentu dari engsel dan memerlukan penanganan antarmuka khusus.
Perangkat berada pada sudut 30 hingga 160 derajat. Layar terbagi menjadi dua area logis. Aplikasi dapat menampilkan konten di bagian atas dan kontrol di bagian bawah. Mode Tabletop untuk panggilan video dan pemutar media menggunakan pose ini.
Perangkat terbuka 180 derajat, membentuk satu layar besar. Aplikasi beralih ke mode tablet dengan area kerja yang diperbesar. Dalam pose ini disarankan untuk menampilkan tata letak multi-panel dengan bilah navigasi dan konten detail berdampingan.
Perangkat berdiri di permukaan pada sudut sekitar 120 derajat. Bagian bawah layar berfungsi sebagai panel sentuh atau keyboard. Mode Touchpad dalam pose ini memungkinkan emulasi trackpad di bagian bawah layar.
Android menangani perubahan konfigurasi perangkat lipat melalui mekanisme configuration changes. Saat pengguna membuka telepon, sistem mencatat perubahan ukuran jendela dan memulai siklus standar pembuatan ulang Activity. Screen Continuity mencegat proses ini dan menyimpan data penting.
Metode utama untuk menyimpan status adalah onRetainNonConfigurationInstance, yang dipanggil sebelum Activity dihancurkan. Pengembang menyimpan model data, posisi daftar, dan layar navigasi saat ini di dalamnya. Setelah pembuatan ulang, Activity menerima data ini melalui getLastNonConfigurationInstance dan memulihkan UI persis hingga saat pelipatan.
Untuk Fragments, mekanisme ini diimplementasikan melalui setRetainInstance(true), yang mencegah penghancuran fragment saat perubahan konfigurasi. Di Jetpack Compose digunakan rememberSaveable, yang secara otomatis menyimpan status saat perubahan Window Metrics.
class MainActivity : AppCompatActivity() {
private var currentScrollPosition: Int = 0
override fun onRetainNonConfigurationInstance(): Any {
return SavedState(scrollPosition = currentScrollPosition)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val saved = lastNonConfigurationInstance as? SavedState
saved?.let { currentScrollPosition = it.scrollPosition }
}
}
Jetpack WindowManager versi 1.1+ menyertakan kelas ScreenContinuityController, yang menyediakan mekanisme siap pakai untuk mengelola kontinuitas layar. API secara otomatis menangani perubahan pose dan memberi tahu aplikasi melalui antarmuka callback.
Kelas pusat yang mendaftarkan pendengar perubahan pose. registerContinuityListener menerima callback yang dipicu pada setiap transisi antara keadaan perangkat lipat. Kontroler juga menyediakan informasi tentang pose saat ini melalui metode getCurrentFoldingFeature.
Kelas utilitas untuk mengubah data FoldingFeature menjadi keadaan yang dapat dipahami aplikasi. FoldingFeatureAdapter menormalkan koordinat engsel dan menentukan apakah pose saat ini adalah HALF_OPENED, FLAT atau TABLE_TOP. Ini membebaskan pengembang dari perhitungan manual sudut dan nilai ambang batas.
Untuk aplikasi Compose, WindowManager menyediakan WindowSizeClass dan pengubah yang mempertimbangkan lipatan. Komponen BoxWithConstraints beradaptasi terhadap perubahan ukuran layar secara real-time tanpa membuat ulang Activity. Compose secara otomatis memicu rekomposisi saat perubahan WindowMetrics.
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController
controller.registerContinuityListener { feature: FoldingFeature ->
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
FoldingFeature.State.FLAT -> expandToTablet()
}
}
Mari kita lihat contoh lengkap Activity dengan dukungan Screen Continuity. MainActivity menangani tiga skenario: melipat, membuka, dan keadaan setengah terbuka. Data disimpan melalui onRetainNonConfigurationInstance dan dipulihkan saat pembuatan ulang.
class ContinuityActivity : AppCompatActivity() {
private lateinit var binding: ActivityContinuityBinding
private var itemList = mutableListOf<String>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityContinuityBinding.inflate(layoutInflater)
setContentView(binding.root)
val savedState = lastNonConfigurationInstance as? ContinuityState
if (savedState != null) {
itemList.addAll(savedState.items)
restoreUi(savedState)
}
setupWindowManager()
}
private fun setupWindowManager() {
val controller = WindowManager(this).screenContinuityController
controller.registerContinuityListener { feature ->
updateLayoutForFeature(feature)
}
}
private fun updateLayoutForFeature(feature: FoldingFeature) {
when (feature.state) {
FoldingFeature.State.HALF_OPENED -> binding.root.enableTabletopMode()
FoldingFeature.State.FLAT -> binding.root.enableTabletMode()
FoldingFeature.State.TABLE_TOP -> binding.root.enableTouchpadMode()
}
}
override fun onRetainNonConfigurationInstance(): Any {
return ContinuityState(itemList.toList(), binding.listView.firstVisiblePosition)
}
}
data class ContinuityState(
val items: List<String>,
val scrollPosition: Int
)
Elemen kuncinya adalah kelas ContinuityState, yang menyimpan daftar elemen dan posisi gulir. Activity menyimpannya sebelum pembuatan ulang dan memulihkannya segera setelah pemanggilan onCreate. Kontroler WindowManager berlangganan perubahan pose dan mengalihkan tata letak antar mode.
Android Studio menyediakan emulator perangkat lipat dengan dukungan untuk ketiga pose. Untuk menguji Screen Continuity, cukup buat perangkat virtual dengan tipe Pixel Fold atau Samsung Galaxy Z Fold dan alihkan pose melalui panel kontrol emulator.
Buat AVD dengan kategori Foldable dan pilih resolusi layar 7,6 inci. Di kontrol lanjutan emulator, buka tab Folding Postures dan alihkan antar pose. Setiap peralihan memicu configuration change yang harus ditangani dengan benar oleh aplikasi.
Pada perangkat nyata (Galaxy Z Fold 5, Pixel Fold) pengujian dilakukan dengan membuka secara fisik. Mode Samsung DeX dan Multi-Window juga mengaktifkan kontinuitas. Untuk debugging, gunakan perintah ADB adb shell dumpsys window policy yang menampilkan status lipatan saat ini.
Kesalahan utama — hilangnya status RecyclerView, pengaturan ulang teks di bidang teks dan penutupan dialog. ViewModel memecahkan masalah ini dengan menyimpan data di memori terlepas dari siklus hidup Activity. Juga penting untuk menandai Activity di manifes dengan parameter android:configChanges jika aplikasi menangani perubahan secara manual.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Pertanyaan yang Sering Diajukan
Screen Continuity menyimpan status saat perubahan fisik ukuran layar, bukan hanya saat rotasi. onSaveInstanceState biasa tidak menjamin penyimpanan saat peralihan pose perangkat lipat, sedangkan ScreenContinuityController menangani skenario ini.
Semua perangkat lipat dengan Android 10+ dan layanan Google Play. Dukungan termasuk dalam Pixel Fold, seri Galaxy Z Fold, Huawei Mate X, Oppo Find N dan OnePlus Open. Untuk bekerja diperlukan Jetpack WindowManager versi 1.1 dan lebih tinggi.
Jetpack Compose mendukung Screen Continuity melalui rememberSaveable dan WindowSizeClass. Komposisi secara otomatis merespons perubahan WindowMetrics dan rememberSaveable menyimpan status antar rekomposisi. Pengubah onSizeChanged memungkinkan melacak perubahan ukuran secara real-time.
Saat membuka atau melipat perangkat, Activity dibuat ulang tanpa menyimpan status. Pengguna kehilangan data yang dimasukkan, gulir diatur ulang, dialog yang terbuka ditutup. Ini menyebabkan ulasan negatif dan penurunan peringkat aplikasi di Google Play.
Android Emulator mendukung simulasi perangkat lipat. Buat AVD dengan tipe Pixel Fold, buka Extended Controls dan pilih tab Folding Postures. Peralihan pose memicu configuration change, memungkinkan pengujian penyimpanan status tanpa perangkat fisik.
Ringkasan
Kami akan mengembangkan aplikasi seluler turnkey
IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.
Baca juga