Giới thiệu về Multi-Window Support trong Android N
Nếu các bạn quan tâm đến những tính năng mới trên Android N, hẳn các bạn cũng đã biết là Andoroid N (7.0) có thêm tính năng hỗ trợ hiển thị multi-window. Trong bài viết dưới đây, mình sẽ giới thiệu sơ lược về tính năng vô cùng thú vị này. Ở các phiên bản trước, người dùng chỉ có thể xem một ứng ...
Nếu các bạn quan tâm đến những tính năng mới trên Android N, hẳn các bạn cũng đã biết là Andoroid N (7.0) có thêm tính năng hỗ trợ hiển thị multi-window. Trong bài viết dưới đây, mình sẽ giới thiệu sơ lược về tính năng vô cùng thú vị này.
Ở các phiên bản trước, người dùng chỉ có thể xem một ứng dụng một lúc, muốn xem ứng dụng khác phải switch qua lại. Thử tưởng tượng bạn đang chat với một người, đồng thời duyệt web để tìm kiếm các nội dung để trả lời người đó (ví dụ như nhắc bài cho người đang làm bài kiểm tra chẳng hạn (yaoming)), bạn sẽ phải đọc nội dung câu hỏi bên màn hình chat, chuyển qua browser để tìm kiếm, sau đó chuyển về lại màn hình chat để viết (hoặc paste) câu trả lời, rồi lại sang browser tìm kiếm tiếp... cứ lặp đi lặp lại như vậy thật bất tiện chưa kể việc switch ứng dụng còn khá tốn thời gian trong khi bài kiểm tra của người bạn kia đã sắp đến giờ phải nộp. (dead) Tính năng Multi-Window trên Android N sẽ giúp bạn vượt qua sự bất tiện đó (tất nhiên với điều kiện là cả 2 ứng dụng chat và browser trong ví dụ trên đều support Multi-Window và bạn đang dùng 1 thiết bị chạy Android N trở lên), tính năng này cho phép hiển thị đồng thời nhiều hơn một ứng dụng vào cùng một thời điểm. Trên thiết bị cầm tay, hai ứng dụng có thể chạy song song hoặc trên dưới nhau trong chế độ chia màn hình. Trên thiết bị TV, ứng dụng có thể sử dụng chế độ ảnh trong ảnh để tiếp tục phát lại video trong khi người dùng đang tương tác với ứng dụng khác.
Nếu bạn dựng ứng dụng của bạn bằng Android N SDK, bạn có thể cấu hình cách ứng dụng của bạn xử lý hiển thị đa cửa sổ. Ví dụ, bạn có thể quy định các kích thước tối thiểu cho phép của hoạt động của bạn. Bạn cũng có thể vô hiệu hóa hiển thị đa cửa sổ cho ứng dụng của bạn, đảm bảo rằng hệ thống chỉ hiển thị ứng dụng của bạn trong chế độ toàn màn hình.
Tổng quan
Android N cho phép một vài ứng dụng chia sẻ màn hình ngay lập tức. Ví dụ, người dùng có thể chia đôi màn hình ra, xem một trang web ở bên trái màn hình trong khi đang tạo email ở bên phải màn hình. Trải nghiệm này của người dùng phụ thuộc vào thiết bị:
- Thiết bị cầm tay đang chạy Android N có chế độ chia màn hình. Trong chế độ này, hệ thống sẽ lấp đầy màn hình bằng hai ứng dụng song song nhau hoặc trên dưới. Người dùng có thể kéo đường chia phân tách hai ứng dụng để hiển thị một ứng dụng rộng hơn và ứng dụng còn lại nhỏ đi.
- Trên Thiết bị như TV đang chạy Android N, các ứng dụng có thể tự đặt chúng vào trong chế độ ảnh trong ảnh (picture-in-picture mode), cho phép các ứng dụng này tiếp tục hiển thị nội dung khi người dùng duyệt web hoặc tương tác với ứng dụng khác.
- Các nhà sản xuất thiết bị có kích cỡ lớn hơn có thể chọn kích hoạt chế độ hình dạng tự do, trong đó người dùng có thể tự do thay đổi kích thước mỗi hoạt động. Nếu nhà sản xuất đã kích hoạt tính năng này, ngoài chế độ chia màn hình, thiết bị sẽ còn có chế độ hình dạng tự do.
Người dùng có thể chuyển vào trong chế độ đa cửa sổ bằng các cách sau:
- Nếu người dùng mở màn hình Overview và thực hiện nhấn giữ tiêu đề của hoạt động, họ có thể kéo hoạt động đó đến phần được tô sáng của màn hình để đặt hoạt động đó vào trong chế độ đa cửa sổ.
- Nếu người dùng thực hiện nhấn giữ nút Overview, thiết bị sẽ đặt hoạt động hiện tại vào trong chế độ đa cửa sổ, và mở màn hình Overview để cho phép người dùng chọn một hoạt động khác để chia sẻ màn hình. Người dùng có thể kéo thả dữ liệu từ một Activity sang một Activity khác trong khi các Activity này đang chia sẻ cùng một màn hình. (Ở các phiên bản trước, người dùng chỉ có thể kéo và thả dữ liệu trong một Activity đơn lẻ.)
Multi-Window Lifecycle
Chế độ đa cửa sổ không thay đổi vòng đời của Activity.
Trong chế độ đa cửa sổ, chỉ Activity mà người dùng đã tương tác gần đây nhất mới hoạt động trong một thời điểm xác định. Activity này được ưu tiên nhất, tất cả các Activity khác sẽ ở trong tình trạng tạm dừng, ngay cả khi chúng vẫn hiển thị. Tuy nhiên, hệ thống vẫn sẽ ưu tiên các Activity đang tạm-dừng-nhưng-vẫn-hiển-thị cao hơn so với các Activity hoàn toàn không hiển thị. Nếu người dùng tương tác với một trong những Activity bị tạm dừng, Activity đó sẽ được tiếp tục, và Activity trên cùng trước đó sẽ bị tạm dừng.
Lưu ý: Trong chế độ đa cửa sổ, một ứng dụng có thể trong trạng thái tạm dừng và vẫn hiển thị với người dùng. Ứng dụng có thể cần tiếp tục các hoạt động của nó thậm chí trong khi đamg bị tạm dừng. Ví dụ, một ứng dụng phát video đang ở trong chế độ tạm dừng nhưng vẫn hiển thị thì sẽ tiếp tục hiển thị video của nó. Vì lý do này, Google khuyến nghị các Activity phát video không tạm dừng video trong trình xử lý onPause(). Thay vào đó, các ứng dụng nên tạm dừng video trong onStop(), và tiếp tục phát lại trong onStart().
Khi người dùng đặt một ứng dụng vào trong chế độ đa cửa sổ, hệ thống sẽ thông báo cho Activity về việc thay đổi cấu hình đó, như được đề cập đến trong Handling Configuration Changes. Về cơ bản, thay đổi này tương tự như khi hệ thống thông báo cho ứng dụng rằng thiết bị đã chuyển từ chế độ màn hình dọc sang chế độ màn hình ngang (screen orientation change), ngoại trừ trường hợp các kích thước của thiết bị đã được thay đổi thay vì chỉ bị hoán đổi. Như đã thảo luận trong phần Handling Configuration Changes, Activity của bạn có thể tự xử lý thay đổi cấu hình này, hoặc nó có thể cho phép hệ thống hủy và tạo lại nó với các kích thước mới.
Nếu người dùng thay đổi kích thước của một cửa sổ và làm nó rộng hơn ở bất kỳ kích thước nào, hệ thống sẽ thay đổi kích thước của Activity để khớp với hành động của người dùng và notify các runtime-change nếu cần. Nếu ứng dụng bị trễ lại trong khi vẽ các vùng mới được hiển thị, hệ thống sẽ tạm thời lấp đầy các vùng đó bằng một màu được quy định bởi thuộc tính windowBackground hoặc bằng thuộc tính kiểu windowBackgroundFallback mặc định.
Cấu hình Ứng dụng của bạn cho Chế độ Đa cửa sổ
Nếu ứng dụng của bạn hướng đến Android N, bạn có thể cấu hình cách thức và tính xem liệu các Activity của ứng dụng có hỗ trợ hiển thị đa cửa sổ không. Bạn có thể đặt các thuộc tính trong file Manifest của ứng dụng để kiểm soát cả kích cỡ và cách bố trí. Cài đặt thuộc tính của root Activity sẽ áp dụng cho tất cả các Activity nằm trong Task Stack của nó.
Lưu ý: Nếu bạn xây dựng một ứng dụng hỗ trợ multi screen-orientation bằng phiên bản SDK thấp hơn Android N, và người dùng sử dụng ứng dụng đó trong chế độ đa cửa sổ, hệ thống sẽ bắt buộc thay đổi kích thước của ứng dụng đó. Hệ thống sẽ hiển thị một hộp hội thoại cảnh báo người dùng rằng ứng dụng này có thể hoạt động không như kỳ vọng. Hệ thống không thay đổi kích cỡ của ứng dụng fix cứng orientation; nếu người dùng cố mở một ứng dụng đó dưới chế độ đa cửa sổ, ứng dụng này sẽ chiếm toàn bộ màn hình.
android:resizeableActivity Đặt thuộc tính này trong node <activity> trong file Manifest của bạn hoặc node <application> để kích hoạt hoặc vô hiệu hóa hiển thị đa cửa sổ:
android:resizeableActivity=["true" | "false"] Nếu thuộc tính này được đặt thành true, Activity có thể được khởi chạy trong chế độ chia màn hình và hình dạng tự do. Nếu thuộc tính này được đặt thành false, Activity sẽ không hỗ trợ chế độ đa cửa sổ. Nếu giá trị này là false, và người dùng cố khởi chạy Activity trong chế độ đa cửa sổ, Activity đó sẽ chiếm toàn màn hình.
Nếu ứng dụng của bạn nhắm đến Android N, nhưng bạn chưa quy định giá trị cho thuộc tính này, giá trị của thuộc tính sẽ mặc định đặt là true.
android:supportsPictureInPicture Đặt thuộc tính này trong node <activity> của bạn để cho biết liệu Activity này có hỗ trợ hiển thị ảnh trong ảnh hay không. Thuộc tính này được bỏ qua nếu android:resizeableActivity là false.
android:supportsPictureInPicture=["true" | "false"]
Thuộc tính của Layout
Với Android N, phần tử <layout> của Manifest có hỗ trợ một số thuộc tính sẽ ảnh hưởng đến cách Activity có hành vi như thế nào trong chế độ đa cửa sổ:
android:defaultWidth Chiều rộng mặc định của Activity khi được khởi chạy trong chế độ freeform.
android:defaultHeight Chiều cao mặc định của Activity khi được khởi chạy trong chế độ freeform.
android:gravity Vị trí ban đầu của Activity khi được khởi chạy trong chế độ freeform. Tham khảo Gravity về các giá trị phù hợp.
android:minimalSize Chiều cao và chiều rộng tối thiểu cho Activity trong cả chế độ chia màn hình và chế độ freeform. Nếu người dùng di chuyển thanh phân chia trong chế độ chia màn hình để làm cho Activity nhỏ hơn mức tối thiểu quy định, hệ thống sẽ crop Activity đó thành kích cỡ mà người dùng yêu cầu. Ví dụ, đoạn mã sau đây sẽ cho biết cách quy định kích thước và vị trí mặc định của một Activity và kích thước tối thiểu của nó, khi Activity được hiển thị trong chế độ freeform:
<activity android:name=".MyActivity"> <layout android:defaultHeight="500dp" android:defaultWidth="600dp" android:gravity="top|end" android:minimalSize="450dp" /> </activity>Chạy Ứng dụng của bạn trong Chế độ Đa cửa sổ
Android N có tính năng mới để hỗ trợ các ứng dụng có thể chạy trong chế độ đa cửa sổ.
Các tính năng bị vô hiệu hóa trong Chế độ Đa cửa sổ
Một số tính năng bị vô hiệu hóa hoặc bỏ qua khi một thiết bị đang ở chế độ đa cửa sổ bởi các tính năng này không có ý nghĩa đối với một Activity có thể đang chia sẻ màn hình thiết bị với các Activity hoặc ứng dụng khác. Các tính năng đó bao gồm:
- Ví dụ, một vài tùy chọn tùy chỉnh System UI sẽ bị vô hiệu hóa, ứng dụng không thể ẩn thanh trạng thái nếu chúng đang chạy trong chế độ toàn màn hình.
- Hệ thống sẽ bỏ qua các thay đổi đối với thuộc tính android:screenOrientation.
Thông báo và truy vấn thay đổi đa cửa sổ
Các phương thức mới sau đây đã được thêm vào lớp Activity để hỗ trợ hiển thị đa cửa sổ. Để biết thêm chi tiết về mỗi phương thức, tham khảo Activity.
Activity.inMultiWindow() Kiểm tra xem Activity có đang ở chế độ đa cửa sổ hay không.
Activity.inPictureInPicture() Kiểm tra xem Activity có đang ở chế độ ảnh trong ảnh hay không.
Lưu ý: Chế độ Ảnh trong ảnh (picture-in-picture) là trường hợp đặc biệt của chế độ đa cửa sổ. Nếu myActivity.inPictureInPicture() trả về là true, thì myActivity.inMultiWindow() cũng trả về là true.
Activity.onMultiWindowChanged() Hệ thống sẽ gọi phương thức này bất cứ khi nào Activity đi vào hay ra khỏi chế độ đa cửa sổ. Hệ thống sẽ chuyển cho phương thức giá trị true nếu Activity đang đi vào chế độ đa cửa sổ, và false nếu nó đang rời chế độ đa cửa sổ.
Activity.onPictureInPictureChanged() Hệ thống sẽ gọi phương thức này bất cứ khi nào Activity đi vào trong hay ra ngoài chế độ ảnh trong ảnh. Hệ thống sẽ chuyển cho phương thức một giá trị true nếu Activity đang đi vào chế độ ảnh trong ảnh, và false nếu nó đang rời chế độ ảnh trong ảnh.
Lưu ý: Cũng có các phiên bản Fragment của từng phương thức này, ví dụ như Fragment.onMultiWindowModeChanged().
Vào chế độ ảnh trong ảnh
Để đặt một Activity vào trong chế độ ảnh trong ảnh, hãy gọi phương thức mới Activity.enterPictureInPicture(). Phương thức này sẽ không có ảnh hưởng nếu thiết bị không hỗ trợ chế độ ảnh trong ảnh. Để biết thêm thông tin, tham khảo Ảnh trong ảnh.
Khởi chạy Activity Mới trong Chế độ Đa cửa sổ
Khi bạn khởi chạy một Activity mới, bạn có thể gợi ý cho hệ thống rằng Activity mới sẽ được hiển thị liền kề Activity hiện tại, nếu có thể. Để thực hiện điều này, hãy dùng flag Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT. Yêu cầu để flag này có hiệu lực:
- Nếu thiết bị đang ở chế độ chia màn hình, hệ thống sẽ cố tạo ra Activity mới bên cạnh Activity đã khởi chạy nó, vì vậy hai Activity này sẽ chia sẻ cùng một màn hình. Hệ thống không được đảm bảo có thể làm được điều này, nhưng nó làm cho các Activity ở liền kề nhau nếu có thể.
- Nếu thiết bị không ở chế độ chia màn hình, cờ này sẽ không có tác dụng. Nếu thiết bị đang ở chế độ freeform và bạn đang khởi chạy một Activity mới, bạn có thể quy định kích thước của Activity mới và vị trí màn hình bằng cách gọi ActivityOptions.setLaunchBounds(). Phương thức này sẽ không có ảnh hưởng nếu thiết bị không ở chế độ đa cửa sổ.
Lưu ý: Nếu bạn khởi chạy một Activity trong một Task Stack, Activity này sẽ thay thế Activity trên màn hình, kế thừa tất cả các thuộc tính đa cửa sổ của nó. Nếu bạn muốn khởi chạy Activity mới dưới dạng một cửa sổ riêng trong chế độ đa cửa sổ, bạn phải khởi chạy nó trong một Task Stack mới.
Hỗ trợ kéo và thả
Người dùng có thể kéo và thả dữ liệu từ một Activity này sang một Activity khác trong khi các Activity này vẫn đang chia sẻ cùng một màn hình. (Trước đó, người dùng chỉ có thể kéo và thả dữ liệu trong một Activity đơn lẻ.) Vì lý do này, bạn có thể muốn thêm tính năng kéo và thả vào ứng dụng của bạn nếu ứng dụng của bạn hiện không hỗ trợ tính năng này.
Android N SDK mở rộng gói android.view để hỗ trợ kéo và thả giữa các ứng dụng.
android.view.DropPermissions Token chịu trách nhiệm về việc quy định các quyền cấp cho ứng dụng nhận được thao tác thả.
View.startDragAndDrop() Tên mới cho View.startDrag(). Để kích hoạt kéo và thả giữa các Android, hãy truyền flag mới View.DRAG_FLAG_GLOBAL. Nếu bạn cần cấp quyền cho Android nhận, hãy truyền các flag mới View.DRAG_FLAG_GLOBAL_URI_READ hoặc View.DRAG_FLAG_GLOBAL_URI_WRITE.
View.cancelDragAndDrop() Hủy thao tác kéo hiện đang diễn ra. Chỉ có thể được gọi bằng ứng dụng đã khởi nguồn thao tác kéo đó.
View.updateDragShadow() Thay thế bóng cho thao tác kéo hiện đang diễn ra. Chỉ có thể được gọi bằng ứng dụng đã khởi nguồn thao tác kéo đó.
Activity.requestDropPermissions() Yêu cầu các quyền cho nội dung đã truyền với ClipData có chứa trong DragEvent.
Kiểm thử Hỗ trợ Đa cửa sổ cho Ứng dụng của bạn
Dù cho bạn có cập nhật ứng dụng của mình lên Android N hay không, bạn cũng nên xác minh cách thiết bị có hành vi như thế nào trong chế độ đa cửa sổ trong trường hợp người dùng cố khởi chạy nó ở chế độ đa cửa sổ trên thiết bị chạy Android N.
Cấu hình Thiết bị Kiểm thử
Nếu bạn cài đặt Android N trên thiết bị, chế độ chia màn hình sẽ được tự động hỗ trợ.
Nếu ứng dụng của bạn không được build bằng Android N SDK
-
Nếu bạn xây dựng ứng dụng của mình bằng Android N SDK, và người dùng cố sử dụng ứng dụng này trong chế độ đa cửa sổ, hệ thống sẽ bắt buộc thay đổi kích thước của ứng dụng đó trừ khi ứng dụng này fix cứng orientation.
-
Nếu ứng dụng không fix cứng orientation, bạn nên khởi chạy ứng dụng của bạn trên thiết bị đang chạy Android N và cố đặt ứng dụng vào trong chế độ chia màn hình. Xác minh rằng trải nghiệm người dùng là chấp nhận được khi ứng dụng bị bắt buộc thay đổi kích cỡ.
-
Nếu ứng dụng fix cứng orientation, bạn nên cố đặt ứng dụng vào trong chế độ đa cửa sổ. Xác minh xem khi bạn làm như vậy, ứng dụng vẫn giữ ở chế độ toàn màn hình.
Nếu bạn hỗ trợ chế độ đa cửa sổ
Nếu bạn xây dựng ứng dụng của bạn bằng Android N SDK và chưa vô hiệu hóa hỗ trợ đa cửa sổ, hãy kiểm tra các hành vi sau dưới chế độ chia màn hình và chế độ hình dạng tự do (freeform).
- Khởi chạy ứng dụng trong chế độ toàn màn hình, rồi chuyển sang chế độ đa cửa sổ bằng cách nhấn giữ nút Overview. Xác minh rằng ứng dụng đã chuyển đổi đúng cách.
- Khởi chạy ứng dụng trực tiếp trong chế độ đa cửa sổ, và xác thực rằng ứng dụng này khởi chạy đúng cách. Bạn có thể khởi chạy ứng dụng trong chế độ đa cửa sổ bằng cách nhấn vào nút Overview, rồi nhấn giữ vào thanh tiều đề của ứng dụng của bạn và kéo nó đến một trong những vùng được tô sáng trên màn hình.
- Thay đổi kích thước ứng dụng của bạn trong chế độ chia màn hình bằng cách kéo đường phân chia. Xác minh rằng ứng dụng thay đổi kích thước mà không bị lỗi, và các phần tử UI cần thiết vẫn hiển thị.
- Nếu bạn đã quy định các kích cỡ tối thiểu cho ứng dụng của bạn, hãy cố thay đổi kích thước của ứng dụng sao cho nhỏ hơn các kích thước đã quy định đó. Xác minh rằng bạn không thể thay đổi kích cỡ của ứng dụng để nhỏ hơn kích cỡ tối thiểu đã quy định. Thông qua tất cả các bài kiểm thử, hãy xác minh rằng hiệu năng của ứng dụng của bạn là có thể chấp nhận được. Ví dụ, xác minh rằng sẽ không bị trễ quá lâu để cập nhật UI sau khi ứng dụng bị thay đổi kích thước.
Testing checklist
Để xác minh hiệu năng ứng dụng của bạn trong chế độ đa cửa sổ, hãy thử các thao tác sau. Bạn nên thử các thao tác này trong cả chế độ chia màn hình và chế độ đa cửa sổ, trừ khi có lưu ý khác.
- Vào trong và rời khỏi chế độ đa cửa sổ. *Hãy chuyển từ ứng dụng của bạn sang ứng dụng khác, và xác minh rằng ứng dụng có hành vi đúng cách trong khi nó hiển thị nhưng không hoạt động. Ví dụ nếu ứng dụng của bạn đang phát video, hãy chắc chắn rằng video tiếp tục phát trong khi người dùng đang tương tác với một ứng dụng khác. *Trong chế độ chia màn hình, hãy thử di chuyển thanh phân chia để làm cho ứng dụng của bạn rộng hơn và nhỏ hơn. Thử các thao tác này trong cả cấu hình song song và trên dưới. Xác minh rằng ứng dụng không bị treo, các chức năng thiết yếu vẫn hiển thị, và thao tác thay đổi kích cỡ không quá lâu. *Thực hiện một vài thao tác thay đổi kích cỡ nối tiếp nhau thật nhanh. Chắc chắn rằng ứng dụng của bạn không bị lỗi hoặc bị rò rỉ bộ nhớ. Để biết thông tin về kiểm tra việc sử dụng bộ nhớ của ứng dụng, tham khảo Investigating Your RAM Usage.
- Sử dụng ứng dụng của bạn như bình thường trong một số window configuration khác nhau, và xác minh rằng ứng dụng có hành vi bình thường. Chắc chắn rằng có thể đọc được các chữ và các phần tử UI không quá nhỏ để tương tác với chúng.
Nếu bạn đã vô hiệu hóa hỗ trợ đa cửa sổ
Nếu bạn đã vô hiệu hóa hỗ trợ đa cửa sổ bằng cách đặt android:resizableActivity="false", bạn nên khởi chạy ứng dụng của mình trên thiết bị chạy Android N và cố đặt ứng dụng này vào trong cả chế độ hình dạng tự do và chế độ chia màn hình. Xác minh xem khi bạn làm như vậy, ứng dụng vẫn giữ ở chế độ toàn màn hình.
Lược dịch từ https://developer.android.com/guide/topics/ui/multi-window.html