Multi-Window στο Android N: Τι πρέπει να γνωρίζουν οι προγραμματιστές για να κάνουν το καλύτερο δυνατό

Παρέχουμε μια επισκόπηση του τι σημαίνει για τους προγραμματιστές η επερχόμενη υποστήριξη πολλαπλών παραθύρων στο Android N και πώς να την αξιοποιήσετε στο έπακρο!

Η υποστήριξη πολλών παραθύρων είναι μια προσεγμένη λειτουργία που περιμένουμε στο Android N και ένα που θέλαμε να είναι διαθέσιμο σε όλες τις συσκευές εδώ και πολύ καιρό. Ωστόσο, για να είναι μια ευχάριστη εμπειρία, οι προγραμματιστές μπορεί να χρειαστεί να κάνουν κάποιες αλλαγές στις εφαρμογές τους για να την υποστηρίξουν σωστά.

Μία από τις συνεδρίες Google I/O ήταν για τους προγραμματιστές να μάθουν για τα νέα API και τις αλλαγές συμπεριφοράς του συστήματος που φέρνει η υποστήριξη πολλών παραθύρων.

Η συνεδρία παρουσιάστηκε από τον Wale Ogunwale, τον Τεχνικό Υπεύθυνο Διευθυντή για το Android ActivityManager και Στοιχεία πλαισίου WindowManager -- αυτός και η ομάδα του είναι αυτοί που είναι υπεύθυνοι για τα πολλαπλά παράθυρα στο Android.

Μπορείτε να παρακολουθήσετε το Συνεδρία λειτουργίας πολλών παραθύρων στο YouTube, αλλά παρέχουμε επίσης μια επισκόπηση της συνεδρίας εδώ.

Το N εισάγει τρεις διαφορετικές λειτουργίες πολλαπλών παραθύρων:
  • Λειτουργία διαίρεσης οθόνης: αυτή είναι η λειτουργία που είναι διαθέσιμη από προεπιλογή. Όπως υποδηλώνει το όνομα, σας επιτρέπει να ανοίξετε δύο εφαρμογές δίπλα-δίπλα.
  • Λειτουργία ελεύθερης μορφής: οι κατασκευαστές μπορούν να το ενεργοποιήσουν σε μεγαλύτερες συσκευές, γεγονός που επιτρέπει στους χρήστες να αλλάζουν ελεύθερα το μέγεθος των δραστηριοτήτων εκτός από τη λειτουργία διαίρεσης οθόνης.
  • Λειτουργία εικόνας σε εικόνα: απευθύνεται σε συσκευές Android TV, αυτή η λειτουργία προορίζεται για προγράμματα αναπαραγωγής βίντεο να εκτελούνται σε ένα καρφιτσωμένο παράθυρο ενώ ο χρήστης αλληλεπιδρά με άλλες εφαρμογές.
Android N Λειτουργία διαίρεσης οθόνηςΛειτουργία Android N PiP
Αξίζει να σημειωθεί ότι. Έχουμε καλύψει τα πολλαπλά παράθυρα στο N στο παρελθόν και έχουμε ασκήσει κάποια κριτική για το τρέχον σύστημα. Έχοντας αυτό κατά νου, ελπίζουμε ότι η λειτουργία ελεύθερης μορφής πλησιάζει λίγο πιο κοντά στη λειτουργία εικόνας σε εικόνα, καθώς αυτό θα είχε χρήσιμες εφαρμογές σε όλες τις συσκευές.
Η ενεργοποίηση της υποστήριξης πολλών παραθύρων στις εφαρμογές σας είναι απλή: δεν χρειάζεται να κάνετε τίποτα εάν στοχεύετε ήδη το N. Εάν επιλέξετε να απενεργοποιήσετε το multi-window, μπορείτε να το κάνετε ρυθμίζοντας το. android: resizeableActivity χαρακτηριστικό δραστηριότητας στο μανιφέστο σας προς. false. Αυτό θα πρέπει να γίνεται μόνο εάν είναι πραγματικά δικαιολογημένο, καθώς κάνει την εφαρμογή σας να ξεχωρίζει πάντα με άσχημο τρόπο εκκίνηση σε λειτουργία πλήρους οθόνης ακόμα κι αν ο χρήστης (ή άλλη εφαρμογή) προσπαθήσει να την εκκινήσει σε πολλά παράθυρα τρόπος. Είναι σημαντικό να σημειωθεί ότι τα χαρακτηριστικά μιας ριζικής δραστηριότητας ισχύουν για όλες τις δραστηριότητες στη στοίβα εργασιών της. Με άλλα λόγια, εάν έχετε μια δραστηριότητα που μπορεί να ξεκινήσει από άλλες εφαρμογές, βεβαιωθείτε ότι υποστηρίζει λειτουργία πολλών παραθύρων καθώς δεν μπορείτε να εγγυηθείτε ότι άλλες εφαρμογές θα ξεκινήσουν τη δραστηριότητά σας σε μια νέα εργασία χρησιμοποιώντας. Intent#FLAG_ACTIVITY_NEW_TASK .Η υποστήριξη λειτουργίας εικόνας σε εικόνα πρέπει να δηλωθεί ρητά μέσω του. android: supportsPictureInPicture Χαρακτηριστικό. Σημειώστε ότι αυτό το χαρακτηριστικό αγνοείται εάν. android: resizeableActivity είναι. false .Τα χαρακτηριστικά διάταξης μπορούν να χρησιμοποιηθούν για τον ορισμό προεπιλεγμένων διαστάσεων και τοποθέτησης για παράθυρα ελεύθερης μορφής ή για τον καθορισμό ενός ελάχιστου πλάτους ή ύψους τόσο για λειτουργίες ελεύθερης μορφής όσο και για λειτουργίες διαίρεσης οθόνης:
  • android: defaultWidth/android: defaultHeight: οι προεπιλεγμένες διαστάσεις της δραστηριότητας (λειτουργία ελεύθερης μορφής).
  • android: gravity: η αρχική θέση της δραστηριότητας (λειτουργία ελεύθερης μορφής).
  • android: minimalWidth/android: minimalHeight: οι ελάχιστες διαστάσεις της δραστηριότητας (λειτουργίες ελεύθερης μορφής και διαίρεσης οθόνης)
Μπορείτε να βρείτε ένα παράδειγμα κώδικα στο. Δείγμα εφαρμογής Multi-Window Playground της Google στο GitHub: AndroidManifest.xml.
Με την εισαγωγή της υποστήριξης πολλών παραθύρων, ίσως χρειαστεί να ελέγξετε ξανά μερικά πράγματα στις εφαρμογές σας για να βεβαιωθείτε ότι λειτουργούν σωστά.

Κατανόηση του κύκλου ζωής της Δραστηριότητας

Ο. κύκλος ζωής δραστηριότητας είναι αμετάβλητο στη λειτουργία πολλαπλών παραθύρων: Βασικός κύκλος ζωής δραστηριότητας Android Τούτου λεχθέντος, ορισμένες λεπτές διαφορές μεταξύ των καταστάσεων δραστηριότητας μπορεί να οδηγήσουν σε ακούσια συμπεριφορά που κανονικά δεν θα παρατηρούσατε πριν από το Ν. Είναι σημαντικό να το γνωρίζουμε αυτό. Activity#onResume() και. Activity#onPause() καλούνται όταν η εφαρμογή σας κερδίζει ή χάνει εστίαση, αλλά όχι απαραίτητα όταν ξεκινά ή παύει να είναι ορατή. (Να θυμάστε ότι μόνο μία εφαρμογή μπορεί να έχει εστίαση ανά πάσα στιγμή.) Για εφαρμογές που ενημερώνουν συνεχώς το περιεχόμενο (π.χ. αναπαραγωγή βίντεο), φροντίστε να χειρίζεστε την έναρξη και τη διακοπή των ενημερώσεων περιεχομένου. Activity#onStart() και. Activity#onStop() αντι αυτου. Δεν το κάνετε για εφαρμογές βίντεο, για παράδειγμα, σημαίνει ότι η αναπαραγωγή θα γίνει μόνο εάν η εφαρμογή είναι εστιασμένη, το οποίο ακυρώνει το σκοπό της λειτουργίας πολλαπλών παραθύρων. Η επίσημη εφαρμογή YouTube είχε ένα παρόμοιο πρόβλημα όταν κυκλοφόρησε για πρώτη φορά το Android N Developer Preview.

Χειρισμός αλλαγών χρόνου εκτέλεσης

Όταν μια εφαρμογή τίθεται σε λειτουργία πολλαπλών παραθύρων, ορισμένες διαμορφώσεις συσκευών θα αλλάξουν. Μπορείτε είτε να επιτρέψετε την επανεκκίνηση της δραστηριότητάς σας (σε αυτή την περίπτωση. συγκρατώντας Θραύσματα μπορεί να είναι καλή ιδέα, εάν η δραστηριότητά σας πρέπει να εκτελέσει μια εντατική λειτουργία κατά την εκκίνηση), ή επιλέξτε να το κάνετε. χειριστεί ρητά τις αλλαγές διαμόρφωσης αντι αυτου. Τέσσερις διαμορφώσεις συσκευών ενδέχεται να αλλάξουν κατά την είσοδο ή τη λειτουργία πολλαπλών παραθύρων: screenSize, smallestScreenSize, screenLayout και. orientation. Αναφέρομαι στο. Τεκμηρίωση προγραμματιστών Android για περισσότερες πληροφορίες σχετικά με κάθε χαρακτηριστικό, αλλά σημειώστε ότι. orientation δεν αναφέρεται πλέον στον προσανατολισμό της συσκευής σε αυτήν την περίπτωση. Αντίθετα, απλώς υποδεικνύει εάν το πλάτος της δραστηριότητάς σας είναι μεγαλύτερο από το ύψος της (τοπία) ή όχι (πορτραίτο). Η δήλωση ότι η δραστηριότητά σας θα χειριστεί αυτές τις αλλαγές μπορεί να γίνει από τη δήλωση:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
Λάβετε υπόψη ότι αυτό σημαίνει ότι θα πρέπει πραγματικά να χειριστείτε αυτές τις αλλαγές. Activity#onConfigurationChanged(), με μη αυτόματη ενημέρωση προβολών ή επαναφόρτωση ορισμένων πόρων.

Απενεργοποιημένες λειτουργίες σε λειτουργία πολλαπλών παραθύρων

Ορισμένες λειτουργίες του συστήματος δεν θα επηρεαστούν από τις δραστηριότητές σας όταν βρίσκεστε σε λειτουργία πολλών παραθύρων:
  • Οι αλλαγές στη γραμμή κατάστασης και στη γραμμή πλοήγησης, όπως η μείωση της φωτεινότητας/απόκρυψης των γραμμών συστήματος ή η χρήση της λειτουργίας καθηλωτικής λειτουργίας, δεν θα έχουν κανένα αποτέλεσμα. Αυτό είναι λογικό αφού η δραστηριότητά σας καταλαμβάνει μόνο μέρος της οθόνης.
  • ο android: screenOrientation Το χαρακτηριστικό δραστηριότητας δεν έχει επίσης καμία επίδραση στη λειτουργία πολλών παραθύρων: καθώς η δραστηριότητά σας θα έχει δυνατότητα αλλαγής μεγέθους, δεν έχει πλέον νόημα να έχει σταθερό προσανατολισμό.
Έχουν προστεθεί νέες επανακλήσεις για συμβάντα πολλών παραθύρων, καθώς και μέθοδοι για την υποβολή ερωτημάτων για την τρέχουσα κατάσταση.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): καλείται όταν η κατάσταση δραστηριότητας αλλάζει από πλήρη οθόνη σε πολλαπλά παράθυρα και αντίστροφα.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): καλείται όταν η κατάσταση δραστηριότητας αλλάζει σε/από τη λειτουργία PIP.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): επιστροφή εάν η δραστηριότητα είναι σε λειτουργία πολλαπλών παραθύρων/εικόνα σε εικόνα ή όχι.
  • Activity#overlayWithDecorCaption(boolean overlay): για παράθυρα ελεύθερης μορφής, αυτή η μέθοδος μπορεί να χρησιμοποιηθεί για να κάνει τη λεζάντα (η γραμμή που χρησιμοποιείται για τη μεταφορά του παραθύρου) να επικαλύπτει το περιεχόμενο αντί να το πιέζει προς τα κάτω.
ΥΣΤΕΡΟΓΡΑΦΟ. Εκτός από. Activity#overlayWithDecorCaption(), αυτές οι μέθοδοι παρέχονται επίσης από το. Fragment τάξη.

Έναρξη δραστηριοτήτων σε λειτουργία πολλαπλών παραθύρων

  • Activity#enterPictureInPictureMode() μπορεί να χρησιμοποιηθεί για να τεθεί μια δραστηριότητα σε λειτουργία εικόνας σε εικόνα. Λάβετε υπόψη ότι οι δραστηριότητες στη λειτουργία PiP δεν ειδοποιούνται για συμβάντα εισαγωγής -- χρήση MediaSession#setMediaButtonReceiver() αν θέλετε να χειριστείτε τέτοια γεγονότα. Επίσης, φροντίστε να ελέγξετε τον ιστότοπο Android Developers εάν σας ενδιαφέρει Picture-in-picture στο Android N.
  • Εάν η συσκευή βρίσκεται σε λειτουργία διαίρεσης οθόνης, μπορείτε να πείτε στο σύστημα να ξεκινήσει μια άλλη δραστηριότητα δίπλα στη δική σας χρησιμοποιώντας το Intent#FLAG_ACTIVITY_LAUNCH_ADJACENT σημαία. Η σημαία δεν έχει κανένα αποτέλεσμα εάν δεν είναι σε λειτουργία διαχωρισμού οθόνης.
  • Εάν η συσκευή βρίσκεται σε λειτουργία ελεύθερης μορφής, ActivityOptions#setLaunchBounds() μπορεί να χρησιμοποιηθεί για τον καθορισμό των διαστάσεων και της τοποθεσίας της νέας δραστηριότητας στην οθόνη.
Για παραδείγματα κώδικα, ανατρέξτε στο δείγμα εφαρμογής Multi-Window Playground: Παράδειγμα γειτονικής δραστηριότητας, παράδειγμα ορίων εκκίνησης.

Σύρετε και αποθέστε

Ενώ η υποστήριξη μεταφοράς και απόθεσης υπήρχε από το Honeycomb, στο παρελθόν ήταν δυνατή μόνο στην ίδια δραστηριότητα. Χιονίζει. υποστηρίζεται σε πολλαπλά παράθυρα επισης. Η εφαρμογή αυτού φαίνεται να είναι. κυρίως το ίδιο με πριν, με μερικές προσθήκες για μεταφορά και απόθεση πολλαπλής δραστηριότητας:
  • View#startDragAndDrop()
    • Νέο ψευδώνυμο για View#startDrag().
    • Για να ενεργοποιήσετε τη μεταφορά και απόθεση πολλαπλών δραστηριοτήτων, περάστε τη νέα σημαία View#DRAG_FLAG_GLOBAL.
    • Εάν πρέπει να δώσετε δικαιώματα URI στη δραστηριότητα παραλήπτη, περάστε τις νέες σημαίες View#DRAG_FLAG_GLOBAL_URI_READ ή View#DRAG_FLAG_GLOBAL_URI_WRITE, ανάλογα με την περίπτωση.
  • View#updateDragShadow()
    • Αντικαθιστά τη σκιά μεταφοράς για μια λειτουργία μεταφοράς που βρίσκεται σε εξέλιξη. Μπορεί να κληθεί μόνο από την εφαρμογή που ξεκίνησε τη λειτουργία μεταφοράς.
  • View#cancelDragAndDrop()
    • Ακυρώνει μια λειτουργία μεταφοράς που βρίσκεται σε εξέλιξη. Μπορεί να κληθεί μόνο από την εφαρμογή που ξεκίνησε τη λειτουργία μεταφοράς.
  • Ο έλεγχος εάν μια συσκευή υποστηρίζει λειτουργίες ελεύθερης μορφής ή εικόνας σε εικόνα είναι δυνατός μέσω PackageManager#hasSystemFeature(), χρησιμοποιώντας PackageManager#FEATURE_FREEFORM_WINDOW_MANAGEMENT και PackageManager#FEATURE_FREEFORM_PICTURE_IN_PICTURE αντίστοιχα.
  • ο android: windowBackground Το χαρακτηριστικό μπορεί να χρησιμοποιηθεί ως σχέδιο σχεδίασης φόντου, εάν το μέγεθος της δραστηριότητας αλλάζει και η απόδοσή της καθυστερεί. Αν android: windowBackground δεν έχει οριστεί, android: windowBackgroundFallback χρησιμοποιείται αντ' αυτού. Ανατρέξτε στην εφαρμογή δείγματος Playground Multi-Window για παράδειγμα.
Η Wale προσέφερε ορισμένες βέλτιστες πρακτικές για να διασφαλίσει ότι οι χρήστες σας έχουν την καλύτερη δυνατή εμπειρία:
  • Η λειτουργία χειρισμού αλλάζει κομψά:
    • Διατηρήστε τη συνέπεια της διεπαφής χρήστη ανεξάρτητα από τον προσανατολισμό. Να μην αλλάζουν θέσεις τα στοιχεία για να επιτρέπονται ομαλές μεταβάσεις.
    • Επεκτείνοντας τα παραπάνω, μην κάνετε εναλλαγή μεταξύ πολύ διαφορετικών διατάξεων για διατάξεις τηλεφώνου/tablet. Αντίθετα, προσαρμόστε τη διάταξη του tablet για μικρότερα μεγέθη για συνέπεια.
  • Βεβαιωθείτε ότι οι δραστηριότητές σας προσαρμόζονται σε μικρά μεγέθη με ακολουθώντας τα πρότυπα σχεδιασμού υλικού.
  • Χρήση FLAG_ACTIVITY_LAUNCH_ADJACENT όταν είναι λογικό να δημιουργήσετε μια πιο ευχάριστη εμπειρία στη λειτουργία split-screen.
  • Δηλώστε ασυμβατότητα αλλαγής μεγέθους μόνο όταν δικαιολογείται. Όπως συζητήσαμε παραπάνω, κάνει την εφαρμογή σας να ξεχωρίζει με άσχημο τρόπο.
Ο Wale ολοκλήρωσε τη συνεδρία προσφέροντας μερικούς επιπλέον χρήσιμους πόρους:
  • Τεκμηρίωση πολλαπλών παραθύρων.
  • Οδηγίες σχεδίασης υλικού για λειτουργία διαχωρισμού οθόνης.
  • Δείγμα εφαρμογής πολλών παραθύρων.