Multi-Window Android N-ში: რა უნდა იცოდნენ დეველოპერებმა, რომ საუკეთესოდ გამოიყენონ

click fraud protection

ჩვენ გთავაზობთ მიმოხილვას, თუ რას ნიშნავს მომავალი მრავალფანჯრის მხარდაჭერა Android N-ში დეველოპერებისთვის და როგორ გამოვიყენოთ საუკეთესო მისგან!

მრავალ ფანჯრის მხარდაჭერა არის სუფთა ფუნქცია, რომელსაც ჩვენ ველოდებით Android N-ში და ის, რაც დიდი ხანია გვინდოდა ყველა მოწყობილობაზე ყოფილიყო ხელმისაწვდომი. იმისთვის, რომ ეს იყოს სასიამოვნო გამოცდილება, დეველოპერებს შეიძლება მოუწიონ გარკვეული ცვლილებების შეტანა თავიანთ აპებში, რათა ის სწორად მხარდაჭერილი იყოს.

Google I/O-ის ერთ-ერთი სესია იყო დეველოპერებისთვის, რათა გაეცნოთ ახალი API-ების და სისტემის ქცევითი ცვლილებების შესახებ, რასაც მრავალი ფანჯრის მხარდაჭერა მოაქვს.

სესიას წარუდგინა Wale Ogunwale, ტექნიკური წამყვანი მენეჯერი Android ActivityManager-ისთვის და WindowManager Framework კომპონენტები -- ის და მისი გუნდი პასუხისმგებელნი არიან მრავალ ფანჯარაზე Android-ზე.

შეგიძლიათ უყუროთ მრავალ ფანჯრის რეჟიმის სესია YouTube-ზე, მაგრამ ჩვენ ასევე გთავაზობთ სესიის მიმოხილვას აქ.

N წარმოგიდგენთ სამ განსხვავებულ მრავალ ფანჯრის რეჟიმს:
  • გაყოფილი ეკრანის რეჟიმი: ეს არის ნაგულისხმევად ხელმისაწვდომი რეჟიმი. როგორც სახელი გულისხმობს, ის საშუალებას გაძლევთ გახსნათ ორი აპლიკაცია გვერდიგვერდ.
  • თავისუფალი ფორმის რეჟიმი: მწარმოებლებს შეუძლიათ ამის ჩართვა უფრო დიდ მოწყობილობებზე, რაც მომხმარებლებს საშუალებას აძლევს თავისუფლად შეცვალონ აქტივობების ზომა ეკრანის გაყოფილი რეჟიმის გარდა.
  • სურათი სურათში რეჟიმი: განკუთვნილია Android TV მოწყობილობებზე, ეს რეჟიმი განკუთვნილია ვიდეო პლეერებისთვის, რომ იმუშაონ დამაგრებულ ფანჯარაში, სანამ მომხმარებელი ურთიერთობს სხვა აპლიკაციებთან.
Android N გაყოფილი ეკრანის რეჟიმიAndroid N PiP რეჟიმი
აღსანიშნავია, რომ. ჩვენ ადრე გავაშუქეთ მრავალ ფანჯარა N-ზე და შევთავაზეთ გარკვეული კრიტიკა მიმდინარე სისტემის მიმართ. ამის გათვალისწინებით, ვიმედოვნებთ, რომ თავისუფალი ფორმის რეჟიმი ოდნავ მიუახლოვდება სურათს-სურათის რეჟიმს, რადგან მას ექნება სასარგებლო აპლიკაციები ყველა მოწყობილობაზე.
თქვენს აპებში მრავალფანჯრის მხარდაჭერის ჩართვა მარტივია: არაფრის გაკეთება არ გჭირდებათ, თუ უკვე მიზნად ისახავთ N. თუ აირჩევთ მრავალ ფანჯრის გამორთვას, ამის გაკეთება შეგიძლიათ დაყენებით. android: resizeableActivity აქტივობის ატრიბუტი თქვენს manifest-ში. false. ეს უნდა გაკეთდეს მხოლოდ იმ შემთხვევაში, თუ ნამდვილად გამართლებულია, რადგან ეს თქვენს აპს ყოველთვის ცუდად გამოარჩევს გაშვება სრულეკრანიან რეჟიმში მაშინაც კი, თუ მომხმარებელი (ან სხვა აპლიკაცია) ცდილობს მის გაშვებას მრავალ ფანჯარაში რეჟიმი. მნიშვნელოვანია აღინიშნოს, რომ root აქტივობის ატრიბუტები ვრცელდება ყველა აქტივობაზე მისი ამოცანების დასტაში. სხვა სიტყვებით რომ ვთქვათ, თუ თქვენ გაქვთ აქტივობა, რომლის დაწყებაც შესაძლებელია სხვა აპების მიერ, დარწმუნდით, რომ იგი მხარს უჭერს მრავალ ფანჯრის რეჟიმს რადგან ვერ მოგცემთ გარანტიას, რომ სხვა აპლიკაციები დაიწყებენ თქვენს აქტივობას ახალ ამოცანაში გამოყენებით. Intent#FLAG_ACTIVITY_NEW_TASK .Picture-in-picture რეჟიმის მხარდაჭერა უნდა გამოცხადდეს ცალსახად მეშვეობით. android: supportsPictureInPicture ატრიბუტი. გაითვალისწინეთ, რომ ეს ატრიბუტი იგნორირებულია თუ. android: resizeableActivity არის. false განლაგების ატრიბუტები შეიძლება გამოყენებულ იქნას ნაგულისხმევი ზომებისა და განლაგების დასაყენებლად თავისუფალი ფორმის ფანჯრებისთვის, ან მინიმალური სიგანის ან სიმაღლის დასადგენად, როგორც თავისუფალი ფორმის, ასევე გაყოფილი ეკრანის რეჟიმებისთვის:
  • android: defaultWidth/android: defaultHeight: აქტივობის ნაგულისხმევი ზომები (freeform mode).
  • android: gravity: აქტივობის საწყისი პოზიცია (freeform mode).
  • android: minimalWidth/android: minimalHeight: აქტივობის მინიმალური ზომები (თავისუფალი და გაყოფილი ეკრანის რეჟიმები)
შეგიძლიათ იპოვოთ კოდის მაგალითი. Google-ის Multi-Window Playground-ის ნიმუშის აპლიკაცია GitHub-ზე: AndroidManifest.xml.
მრავალ ფანჯრის მხარდაჭერის დანერგვით, შესაძლოა დაგჭირდეთ რამდენიმე რამის ორჯერ შემოწმება თქვენს აპებში, რათა დარწმუნდეთ, რომ ისინი სწორად მუშაობენ.

აქტივობის სასიცოცხლო ციკლის გაგება

The. საქმიანობის სასიცოცხლო ციკლი უცვლელია მრავალფანჯრის რეჟიმში: Android აქტივობის ძირითადი სასიცოცხლო ციკლი როგორც ითქვა, ზოგიერთმა დახვეწილმა განსხვავებამ აქტივობის მდგომარეობებს შორის შეიძლება გამოიწვიოს არასასურველი ქცევა, რომელსაც ჩვეულებრივ ვერ შეამჩნევდით ნ-მდე. მნიშვნელოვანია ამის ცოდნა. Activity#onResume() და. Activity#onPause() იწოდება მაშინ, როდესაც თქვენი აპი იძენს ან კარგავს ფოკუსს, მაგრამ არა აუცილებელი, როდესაც ის იწყება ან შეწყვეტს ხილვას. (გახსოვდეთ, რომ მხოლოდ ერთ აპს შეიძლება ჰქონდეს ფოკუსირება ნებისმიერ დროს.) აპებისთვის, რომლებიც მუდმივად განაახლებს კონტენტს (მაგ. ვიდეოს დაკვრა), დარწმუნდით, რომ ამუშავებთ კონტენტის განახლებების დაწყებას და შეწყვეტას. Activity#onStart() და. Activity#onStop() სამაგიეროდ. ამას არ აკეთებთ ვიდეო აპებისთვის, მაგალითად, ეს ნიშნავს, რომ დაკვრა მოხდება მხოლოდ იმ შემთხვევაში, თუ აპლიკაცია ფოკუსირებულია, რომელიც ამარცხებს მრავალფანჯრის რეჟიმის მიზანს. YouTube-ის ოფიციალურ აპს ჰქონდა მსგავსი პრობლემა, როდესაც პირველად ამოქმედდა Android N Developer Preview.

გაშვების დროის ცვლილებების მართვა

როდესაც აპლიკაცია გადადის მრავალ ფანჯრის რეჟიმში, მოწყობილობის ზოგიერთი კონფიგურაცია შეიცვლება. თქვენ შეგიძლიათ დაუშვათ თქვენი აქტივობის გადატვირთვა (ამ შემთხვევაში. ფრაგმენტების შენახვა შეიძლება კარგი იდეა იყოს, თუ თქვენმა საქმიანობამ უნდა შეასრულოს ინტენსიური ოპერაცია გაშვებისას), ან აირჩიე. გაუმკლავდეს კონფიგურაციის ცვლილებებს აშკარად სამაგიეროდ. ოთხი მოწყობილობის კონფიგურაცია შეიძლება შეიცვალოს მრავალ ფანჯრის რეჟიმში შესვლისას ან შიგნით: screenSize, smallestScreenSize, screenLayout და. orientation. იხილეთ. Android დეველოპერების დოკუმენტაცია დამატებითი ინფორმაციისთვის თითოეული ატრიბუტის შესახებ, მაგრამ გაითვალისწინეთ, რომ. orientation ამ შემთხვევაში აღარ ეხება მოწყობილობის ორიენტაციას. ამის ნაცვლად, ის უბრალოდ მიუთითებს, არის თუ არა თქვენი აქტივობის სიგანე მის სიმაღლეზე (ლანდშაფტი) უფრო დიდი თუ არა (პორტრეტი). გამოცხადება, რომ თქვენი აქტივობა გაუმკლავდება ამ ცვლილებებს, შეიძლება გაკეთდეს manifest-დან:
android: name=".MyActivity"android: configChanges="screenSize|smallestScreenSize|screenLayout|orientation"/>
გაითვალისწინეთ, რომ ეს ნიშნავს, რომ თქვენ ნამდვილად დაგჭირდებათ ამ ცვლილებების გატარება. Activity#onConfigurationChanged(), ხედების ხელით განახლებით ან ზოგიერთი რესურსის გადატვირთვით.

გამორთული ფუნქციები მრავალ ფანჯრის რეჟიმში

სისტემის ზოგიერთ ფუნქციაზე გავლენას არ მოახდენს თქვენი აქტივობები მრავალფანჯრის რეჟიმში ყოფნისას:
  • სტატუსის ზოლისა და ნავიგაციის ზოლის ცვლილებები, როგორიცაა სისტემის ზოლების ჩაბნელება/დამალვა ან ჩაძირვის რეჟიმის გამოყენება, ეფექტი არ ექნება. ეს ლოგიკურია, რადგან თქვენი აქტივობა მხოლოდ ეკრანის ნაწილს იკავებს.
  • The android: screenOrientation საქმიანობის ატრიბუტს ასევე არ აქვს ეფექტი მრავალფანჯრის რეჟიმში: ვინაიდან თქვენი აქტივობა იქნება ზომის შეცვლა, აზრი აღარ აქვს მას ჰქონდეს ფიქსირებული ორიენტაცია.
დამატებულია ახალი გამოხმაურებები მრავალფანჯრიანი მოვლენებისთვის, ასევე არსებული მდგომარეობის შეკითხვის მეთოდები.
  • Activity#onMultiWindowModeChanged(boolean inMultiWindow): იწოდება, როდესაც აქტივობის მდგომარეობა იცვლება სრულეკრანიდან მრავალ ფანჯარაში და პირიქით.
  • Activity#onPictureInPictureModeChanged(boolean inPictureOnPicture): გამოიძახება, როდესაც აქტივობის მდგომარეობა იცვლება PIP რეჟიმში/დან.
  • Activity#isInMultiWindowMode()/Activity#isInPictureInPictureMode(): დააბრუნეთ, არის თუ არა აქტივობა მრავალფანჯრის/სურათზე-სურათზე რეჟიმში თუ არა.
  • Activity#overlayWithDecorCaption(boolean overlay): თავისუფალი ფორმის ფანჯრებისთვის, ეს მეთოდი შეიძლება გამოყენებულ იქნას იმისთვის, რომ წარწერა (ზოლი, რომელიც გამოიყენება ფანჯრის ირგვლივ გადასატანად) გადაფაროს შიგთავსზე, იმის ნაცვლად, რომ დაწიოს.
PS. Გარდა. 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 შესაბამისად.
  • The android: windowBackground ატრიბუტი შეიძლება გამოყენებულ იქნას როგორც ფონის ნახაზი, თუ აქტივობის ზომა იცვლება და მისი რენდერი ჩამორჩება. თუ android: windowBackground დაუყენებელია, android: windowBackgroundFallback ნაცვლად გამოიყენება. მაგალითისთვის იხილეთ Multi-Window Playground-ის ნიმუშის აპლიკაცია.
უელსმა შემოგვთავაზა რამდენიმე საუკეთესო პრაქტიკა, რათა დარწმუნდეთ, რომ თქვენს მომხმარებლებს აქვთ საუკეთესო გამოცდილება:
  • სახელურის რეჟიმი ელეგანტურად იცვლება:
    • შეინარჩუნეთ UI თანმიმდევრულობა ორიენტაციის მიუხედავად. ელემენტები არ ცვლის პოზიციებს, რათა მოხდეს გლუვი გადასვლები.
    • ზემოაღნიშნულის გაფართოება, არ გადახვიდეთ ძალიან განსხვავებულ განლაგებებს შორის ტელეფონის/ტაბლეტის განლაგებისთვის. ამის ნაცვლად, შეცვალეთ ტაბლეტის განლაგება მცირე ზომისთვის თანმიმდევრულობისთვის.
  • დარწმუნდით, რომ თქვენი საქმიანობა მოერგება მცირე ზომებს მიერ მასალის დიზაინის ნიმუშების დაცვით.
  • გამოყენება FLAG_ACTIVITY_LAUNCH_ADJACENT როდესაც აზრი აქვს უფრო სასიამოვნო გამოცდილების მიღებას გაყოფილი ეკრანის რეჟიმში.
  • ზომების შეუთავსებლობის გამოცხადება მხოლოდ მაშინ, როცა გამართლებულია. როგორც ზემოთ განვიხილეთ, სხვაგვარად ის თქვენს აპს ცუდად გამოარჩევს.
უილმა დაასრულა სესია რამდენიმე დამატებითი სასარგებლო რესურსის შეთავაზებით:
  • მრავალ ფანჯრის დოკუმენტაცია.
  • მასალის დიზაინის ინსტრუქციები გაყოფილი ეკრანის რეჟიმისთვის.
  • მრავალ ფანჯრის აპლიკაციის ნიმუში.