Screen Continuity — μηχανισμός Android που εξασφαλίζει την απρόσκοπτη μετάβαση της εφαρμογής μεταξύ διπλωμένης και ξεδιπλωμένης κατάστασης μιας αναδιπλούμενης συσκευής. Κατά το ξεδίπλωμα, η οθόνη αλλάζει φυσικές διαστάσεις και το σύστημα επανεκκινεί το Activity με νέες διαμορφώσεις. Σύμφωνα με το Google Developer, 2025, η σωστή επεξεργασία της συνέχειας βελτιώνει την εμπειρία χρήστη κατά 40% και μειώνει τον αριθμό παραπόνων για επαναφορά κατάστασης. Το API ScreenContinuity αποτελεί μέρος του Jetpack WindowManager από την έκδοση 1.1 και επιτρέπει στον προγραμματιστή να διαχειρίζεται τον κύκλο ζωής κατά την αλλαγή στάσης της συσκευής.
Κύρια σημεία
Screen Continuity είναι ένας μηχανισμός Android που διατηρεί την κατάσταση του Activity κατά την αλλαγή φυσικής διαμόρφωσης της οθόνης σε αναδιπλούμενες συσκευές. Όταν ο χρήστης ξεδιπλώνει ή διπλώνει το τηλέφωνο, το σύστημα μπορεί να επανεκκινήσει το Activity με νέες διαστάσεις παραθύρου. Η συνέχεια αποτρέπει την απώλεια εισαγόμενων δεδομένων, θέσης κύλισης και τρέχουσας οθόνης.
Σε αντίθεση με τη συνηθισμένη περιστροφή οθόνης, όπου το Android απλώς αναδημιουργεί το Activity με νέο προσανατολισμό, οι αναδιπλούμενες συσκευές εισάγουν εντελώς νέα σενάρια. Η στάση HALF_OPENED επιτρέπει στην εφαρμογή να λειτουργεί σε μισή οθόνη και η FLAT — σε πλήρως ξεδιπλωμένη λειτουργία tablet. Χωρίς υποστήριξη Screen Continuity, κάθε αλλαγή στάσης επαναφέρει τη διεπαφή στην αρχική κατάσταση.
Σύμφωνα με το Google I/O 2024, πάνω από το 62% των χρηστών αναδιπλούμενων συσκευών έχουν αντιμετωπίσει εφαρμογές που δεν χειρίζονται σωστά την εναλλαγή μεταξύ καταστάσεων. Το Screen Continuity λύνει αυτό το πρόβλημα σε επίπεδο API, παρέχοντας στον προγραμματιστή έτοιμα εργαλεία για αποθήκευση και επαναφορά του UI.
Jetpack WindowManager ορίζει τρεις βασικές στάσεις αναδιπλούμενης συσκευής μέσω της κλάσης FoldingFeature. Κάθε στάση αντιστοιχεί σε μια συγκεκριμένη φυσική θέση του μεντεσέ και απαιτεί ειδική επεξεργασία της διεπαφής.
Η συσκευή βρίσκεται υπό γωνία 30 έως 160 μοιρών. Η οθόνη χωρίζεται σε δύο λογικές περιοχές. Η εφαρμογή μπορεί να εμφανίζει περιεχόμενο στο πάνω μισό και στοιχεία ελέγχου στο κάτω μισό. Λειτουργία Tabletop για βιντεοκλήσεις και media players χρησιμοποιεί ακριβώς αυτή τη στάση.
Η συσκευή είναι ανοιχτή στις 180 μοίρες, σχηματίζοντας μία μεγάλη οθόνη. Η εφαρμογή μεταβαίνει σε λειτουργία tablet με διευρυμένο χώρο εργασίας. Σε αυτή τη στάση συνιστάται η εμφάνιση διάταξης πολλαπλών πλαισίων με γραμμή πλοήγησης και λεπτομερές περιεχόμενο δίπλα-δίπλα.
Η συσκευή στέκεται σε μια επιφάνεια υπό γωνία περίπου 120 μοιρών. Το κάτω μισό της οθόνης χρησιμεύει ως πάνελ αφής ή πληκτρολόγιο. Λειτουργία Touchpad σε αυτή τη στάση επιτρέπει την εξομοίωση trackpad στο κάτω μέρος της οθόνης.
Android χειρίζεται την αλλαγή διαμόρφωσης της αναδιπλούμενης συσκευής μέσω του μηχανισμού configuration changes. Όταν ο χρήστης ξεδιπλώνει το τηλέφωνο, το σύστημα καταγράφει την αλλαγή μεγέθους παραθύρου και ξεκινά τον τυπικό κύκλο αναδημιουργίας του Activity. Το Screen Continuity παρεμβαίνει σε αυτή τη διαδικασία και αποθηκεύει τα βασικά δεδομένα.
Η κύρια μέθοδος αποθήκευσης κατάστασης είναι η onRetainNonConfigurationInstance, η οποία καλείται πριν από την καταστροφή του Activity. Ο προγραμματιστής αποθηκεύει σε αυτήν το μοντέλο δεδομένων, τη θέση λίστας και την τρέχουσα οθόνη πλοήγησης. Μετά την αναδημιουργία, το Activity λαμβάνει αυτά τα δεδομένα μέσω της getLastNonConfigurationInstance και επαναφέρει το UI ακριβώς μέχρι τη στιγμή του διπλώματος.
Για τα Fragments, ο μηχανισμός υλοποιείται μέσω της setRetainInstance(true), η οποία αποτρέπει την καταστροφή του fragment κατά την αλλαγή διαμόρφωσης. Στο Jetpack Compose χρησιμοποιείται το rememberSaveable, το οποίο αποθηκεύει αυτόματα την κατάσταση κατά την αλλαγή των 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 έκδοση 1.1+ περιλαμβάνει την κλάση ScreenContinuityController, η οποία παρέχει έτοιμους μηχανισμούς για τη διαχείριση της συνέχειας οθόνης. Το API χειρίζεται αυτόματα την αλλαγή στάσης και ειδοποιεί την εφαρμογή μέσω callback interfaces.
Η κεντρική κλάση που καταχωρεί ακροατές αλλαγής στάσης. Η registerContinuityListener δέχεται ένα callback που ενεργοποιείται σε κάθε μετάβαση μεταξύ καταστάσεων της αναδιπλούμενης συσκευής. Ο ελεγκτής παρέχει επίσης πληροφορίες για την τρέχουσα στάση μέσω της μεθόδου getCurrentFoldingFeature.
Βοηθητική κλάση για τη μετατροπή δεδομένων FoldingFeature σε καταστάσεις κατανοητές από την εφαρμογή. Η FoldingFeatureAdapter κανονικοποιεί τις συντεταγμένες του μεντεσέ και καθορίζει αν η τρέχουσα στάση είναι HALF_OPENED, FLAT ή TABLE_TOP. Αυτό απαλλάσσει τον προγραμματιστή από τον χειροκίνητο υπολογισμό γωνιών και οριακών τιμών.
Για εφαρμογές Compose, το WindowManager παρέχει WindowSizeClass και τροποποιητές που λαμβάνουν υπόψη την αναδίπλωση. Το στοιχείο BoxWithConstraints προσαρμόζεται στις αλλαγές μεγέθους οθόνης σε πραγματικό χρόνο χωρίς αναδημιουργία του Activity. Το Compose ενεργοποιεί αυτόματα ανασύνθεση κατά την αλλαγή των 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()
}
}
Ας εξετάσουμε ένα πλήρες παράδειγμα Activity με υποστήριξη Screen Continuity. Η MainActivity χειρίζεται τρία σενάρια: δίπλωμα, ξεδίπλωμα και μισάνοιχτη κατάσταση. Τα δεδομένα αποθηκεύονται μέσω onRetainNonConfigurationInstance και επαναφέρονται κατά την αναδημιουργία.
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
)
Το βασικό στοιχείο είναι η κλάση ContinuityState, η οποία αποθηκεύει τη λίστα στοιχείων και τη θέση κύλισης. Το Activity την αποθηκεύει πριν από την αναδημιουργία και την επαναφέρει αμέσως μετά την κλήση της onCreate. Ο ελεγκτής WindowManager εγγράφεται στις αλλαγές στάσης και εναλλάσσει τη διάταξη μεταξύ λειτουργιών.
Android Studio παρέχει εξομοιωτή αναδιπλούμενης συσκευής με υποστήριξη και για τις τρεις στάσεις. Για τη δοκιμή του Screen Continuity αρκεί να δημιουργήσετε μια εικονική συσκευή τύπου Pixel Fold ή Samsung Galaxy Z Fold και να αλλάζετε στάση μέσω του πίνακα ελέγχου του εξομοιωτή.
Δημιουργήστε ένα AVD με κατηγορία Foldable και επιλέξτε ανάλυση οθόνης 7,6 ιντσών. Στα εκτεταμένα χειριστήρια του εξομοιωτή ανοίξτε την καρτέλα Folding Postures και εναλλάσσετε μεταξύ στάσεων. Κάθε εναλλαγή ενεργοποιεί μια configuration change που πρέπει να χειρίζεται σωστά η εφαρμογή.
Σε πραγματική συσκευή (Galaxy Z Fold 5, Pixel Fold) η δοκιμή πραγματοποιείται με φυσικό ξεδίπλωμα. Οι λειτουργίες Samsung DeX και Multi-Window επίσης ενεργοποιούν τη συνέχεια. Για εντοπισμό σφαλμάτων χρησιμοποιήστε την εντολή ADB adb shell dumpsys window policy, η οποία εμφανίζει την τρέχουσα κατάσταση αναδίπλωσης.
Τα κύρια σφάλματα — απώλεια κατάστασης RecyclerView, επαναφορά κειμένου σε πεδία κειμένου και κλείσιμο διαλόγων. Το ViewModel λύνει αυτά τα προβλήματα αποθηκεύοντας δεδομένα στη μνήμη ανεξάρτητα από τον κύκλο ζωής του Activity. Είναι επίσης σημαντικό να σημειώσετε το Activity στο manifest με την παράμετρο android:configChanges αν η εφαρμογή χειρίζεται τις αλλαγές χειροκίνητα.
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"
Συχνές Ερωτήσεις
Screen Continuity αποθηκεύει την κατάσταση κατά τη φυσική αλλαγή μεγέθους οθόνης, όχι μόνο κατά την περιστροφή. Το συνηθισμένο onSaveInstanceState δεν εγγυάται τη διατήρηση κατά την εναλλαγή στάσεων αναδιπλούμενης συσκευής, ενώ το ScreenContinuityController χειρίζεται ακριβώς αυτό το σενάριο.
Όλες οι αναδιπλούμενες συσκευές με Android 10+ και υπηρεσίες Google Play. Η υποστήριξη περιλαμβάνεται στο Pixel Fold, τη σειρά Galaxy Z Fold, Huawei Mate X, Oppo Find N και OnePlus Open. Για λειτουργία απαιτείται Jetpack WindowManager έκδοσης 1.1 και άνω.
Jetpack Compose υποστηρίζει το Screen Continuity μέσω rememberSaveable και WindowSizeClass. Η σύνθεση αντιδρά αυτόματα στην αλλαγή των WindowMetrics και το rememberSaveable αποθηκεύει την κατάσταση μεταξύ ανασυνθέσεων. Ο τροποποιητής onSizeChanged επιτρέπει την παρακολούθηση αλλαγών μεγέθους σε πραγματικό χρόνο.
Κατά το ξεδίπλωμα ή δίπλωμα της συσκευής, το Activity αναδημιουργείται χωρίς αποθήκευση κατάστασης. Ο χρήστης χάνει τα εισαγόμενα δεδομένα, η κύλιση επαναφέρεται, οι ανοιχτοί διάλογοι κλείνουν. Αυτό οδηγεί σε αρνητικές κριτικές και πτώση της βαθμολογίας της εφαρμογής στο Google Play.
Android Emulator υποστηρίζει προσομοίωση αναδιπλούμενων συσκευών. Δημιουργήστε ένα AVD τύπου Pixel Fold, ανοίξτε τα Extended Controls και επιλέξτε την καρτέλα Folding Postures. Η εναλλαγή στάσεων ενεργοποιεί configuration change, επιτρέποντας τη δοκιμή αποθήκευσης κατάστασης χωρίς φυσική συσκευή.
Σύνοψη
Θα αναπτύξουμε μια εφαρμογή για κινητά έτοιμη για χρήση
Η IT Sectr δημιουργεί εφαρμογές iOS και Android για νεοφυείς επιχειρήσεις και επιχειρήσεις από το 2017. Θα σας συμβουλεύσουμε και θα προτείνουμε την καλύτερη λύση.
Διαβάστε επίσης