page.title=Hỗ trợ đa cửa sổ page.metaDescription=Hỗ trợ mới trong Android N để hiển thị nhiều hơn một ứng dụng cùng lúc. page.keywords="multi-window", "android N", "split screen", "free-form" @jd:body

Trong tài liệu này

  1. Tổng quan
  2. Vòng đời đa cửa sổ
  3. Cấu hình Ứng dụng của bạn cho Chế độ Đa cửa sổ
  4. Chạy Ứng dụng của bạn trong Chế độ Đa cửa sổ
  5. Kiểm thử Hỗ trợ Đa cửa sổ của Ứng dụng của bạn

Xem thêm

  1. Ứng dụng mẫu Multi-Windows Playground

Android N thêm hỗ trợ cho 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 N Preview 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ị:

Hình 1. Hai ứng dụng chạy trong chế độ chia màn hình.

Người dùng có thể chuyển vào trong chế độ đa cửa sổ bằng các cách sau:

Người dùng có thể kéo và thả từ một hoạt động sang một hoạt động khác trong khi các hoạt động 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 hoạt động đơn lẻ.)

Vòng đời đa cửa sổ

Chế độ đa cửa sổ không thay đổi vòng đời của hoạt động.

Trong chế độ đa cửa sổ, chỉ hoạt động mà người dùng đã tương tác gần đây nhất mới hoạt động trong khoảng thời gian xác định. Hoạt động này được cân nhắc ở trên cùng. Tất cả các hoạt động 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 sẽ cấp mức ưu tiên cao hơn cho hoạt động bị tạm dừng nhưng vẫn hiển thị này so với các hoạt động không hiển thị. Nếu người dùng tương tác với một trong những hoạt động bị tạm dừng, hoạt động đó sẽ được tiếp tục, và hoạt động 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, chúng tôi đề nghị các hoạt động phát video không tạm dừng video trong trình xử lý{@link android.app.Activity#onPause onPause()}. Thay vào đó, các ứng dụng nên tạm dừng video trong {@link android.app.Activity#onStop onStop()}, và tiếp tục phát lại trong {@link android.app.Activity#onStart 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 về hoạt động thay đổi cấu hình đó, như được quy định trong Xử lý Thay đổi Thời gian chạy. Về cơ bản, thay đổi này có ngụ ý về vòng đời hoạt động tương tự vì khi hệ thống thông báo cho ứng dụng rằng thiết bị đã chuyển từ chế độ hướng dọc sang chế độ ngang, 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 Xử lý Thay đổi Thời gian chạy, hoạt động 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 hoạt động nà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 hoạt động để khớp với hành động của người dùng và phát hành các thay đổi thời gian chạy 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 {@link android.R.attr#windowBackground 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 nhắm đến Android N, bạn có thể cấu hình cách thức và liệu các hoạt động 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 bản kê khai của bạn để kiểm soát cả kích cỡ và bố trí. Cài đặt thuộc tính của hoạt động gốc sẽ áp dụng cho tất cả các hoạt động nằm trong ngăn xếp hoạt động của nó.

Lưu ý: Nếu bạn dựng một ứng dụng đa hướng 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ể có hành vi không như kỳ vọng. Hệ thống không thay đổi kích cỡ của ứng dụng có hướng cố định; nếu người dùng cố mở một ứng dụng có hướng cố định 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 <activity> của bản kê khai 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, hoạt động 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, hoạt động 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 hoạt động trong chế độ đa cửa sổ, hoạt động đó 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 kê khai của bạn để cho biết liệu hoạt động 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 bố trí

Với Android N, phần tử bản kê khai <layout> có hỗ trợ một số thuộc tính sẽ ảnh hưởng đến cách hoạt động 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 hoạt động khi được khởi chạy trong chế độ hình dạng tự do.
android:defaultHeight
Chiều cao mặc định của hoạt động khi được khởi chạy trong chế độ hình dạng tự do.
android:gravity
Vị trí ban đầu của hoạt động khi được khởi chạy trong chế độ hình dạng tự do. Xem tham chiếu {@link android.view.Gravity} về các giá trị phù hợp.
android:minimalSize
Chiều cao và chiều rộng tối thiểu cho hoạt động trong cả chế độ chia màn hình và chế độ hình dạng tự do. Nếu người dùng di chuyển thanh phân chia trong chế độ chia màn hình để làm cho hoạt động nhỏ hơn mức tối thiểu quy định, hệ thống sẽ cắt xén hoạt động đó 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 hoạt động và kích thước tối thiểu của nó, khi hoạt động được hiển thị trong chế độ hình dạng tự do:

<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 hoạt động có thể đang chia sẻ màn hình thiết bị với các hoạt động hoặc ứng dụng khác. Các tính năng đó bao gồm:

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 {@link android.app.Activity} để hỗ trợ hiển thị đa cửa sổ. Để biết chi tiết về mỗi phương thức, xem Tham chiếu N Preview SDK.

Activity.inMultiWindow()
Lệnh gọi để tìm hiểu xem hoạt động có đang ở chế độ đa cửa sổ hay không.
Activity.inPictureInPicture()
Lệnh gọi để tìm hiểu xem hoạt động có đang ở chế độ ảnh trong ảnh hay không.

Lưu ý: Chế độ Ảnh trong ảnh 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 hoạt động đi vào trong hay ra ngoài chế độ đa cửa sổ. Hệ thống sẽ chuyển cho phương thức giá trị true nếu hoạt động đang đi vào chế độ đa cửa sổ, và false nếu hoạt động đ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 hoạt động đ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 hoạt động đang đi vào chế độ ảnh trong ảnh, và false nếu hoạt động đang rời chế độ ảnh trong ảnh.

Cũng có các phiên bản {@link android.app.Fragment} của từng phương thức này, ví dụ như Fragment.inMultiWindow().

Vào chế độ ảnh trong ảnh

Để đặt một hoạt động 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, hãy xem tài liệu Ảnh trong ảnh.

Khởi chạy Hoạt động Mới trong Chế độ Đa cửa sổ

Khi bạn khởi chạy một hoạt động mới, bạn có thể gợi ý cho hệ thống rằng hoạt động mới sẽ được hiển thị liền kề hoạt động hiện tại, nếu có thể. Để thực hiện điều này, hãy dùng cờ Intent.FLAG_ACTIVITY_LAUNCH_TO_ADJACENT. Việc chuyển cờ này yêu cầu hành vi sau:

Nếu thiết bị đang ở chế độ hình dạng tự do và bạn đang khởi chạy một hoạt động mới, bạn có thể quy định kích thước của hoạt động 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 hoạt động trong một ngăn xếp tác vụ, hoạt động này sẽ thay thế hoạt động 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 hoạt động 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 ngăn xếp tác vụ mới.

Hỗ trợ kéo và thả

Người dùng có thể kéo và thả dữ liệu từ một hoạt động này sang một hoạt động khác trong khi các hoạt động 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 hoạt động đơ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.

N Preview SDK mở rộng gói android.view để hỗ trợ kéo và thả giữa các ứng dụng. Để biết chi tiết về các lớp và phương thức sau, hãy xem Tham chiếu N Preview SDK.

android.view.DropPermissions
Đối tượng mã thông báo 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()
Bí danh mới cho {@link android.view.View#startDrag View.startDrag()}. Để kích hoạt kéo và thả giữa các hoạt động, hãy chuyển cờ mới View.DRAG_FLAG_GLOBAL. Nếu bạn cần cấp quyền URI cho hoạt động của đối tượng nhận, hãy chuyển các cờ mới View.DRAG_FLAG_GLOBAL_URI_READ hoặc View.DRAG_FLAG_GLOBAL_URI_WRITE, nếu phù hợp.
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 kéo 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 URI nội dung đã chuyển với {@link android.content.ClipData} có chứa trong {@link android.view.DragEvent}.

Kiểm thử Hỗ trợ Đa cửa sổ của Ứ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 dựng bằng N Preview SDK

Nếu bạn dựng ứng dụng của mình bằng N Preview 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 khai báo hướng cố định.

Nếu ứng dụng không khai báo hướng cố định, 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 khai báo hướng cố định, 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 dựng ứng dụng của bạn bằng N Preview SDK và chưa vô hiệu hóa hỗ trợ đa cửa sổ, hãy xác minh hành vi sau dưới chế độ chia màn hình và chế độ hình dạng tự do.

Danh sách kiểm thử

Để 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.

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.