1page.title=Màn hình Tổng quan 2page.tags="recents","overview" 3 4@jd:body 5 6<div id="qv-wrapper"> 7<div id="qv"> 8 9 <h2>Trong tài liệu này</h2> 10 <ol> 11 <li><a href="#adding">Thêm Tác vụ vào Màn hình Tổng quan</a> 12 <ol> 13 <li><a href="#flag-new-doc">Sử dụng cờ Ý định để thêm một tác vụ</a></li> 14 <li><a href="#attr-doclaunch">Sử dụng thuộc tính Hoạt động để thêm một tác vụ</a></li> 15 </ol> 16 </li> 17 <li><a href="#removing">Loại bỏ Tác vụ</a> 18 <ol> 19 <li><a href="#apptask-remove">Sử dụng lớp AppTask để loại bỏ tác vụ</a></li> 20 <li><a href="#retain-finished">Giữ lại tác vụ đã hoàn thành</a></li> 21 </ol> 22 </li> 23 </ol> 24 25 <h2>Lớp khóa</h2> 26 <ol> 27 <li>{@link android.app.ActivityManager.AppTask}</li> 28 <li>{@link android.content.Intent}</li> 29 </ol> 30 31 <h2>Mã mẫu</h2> 32 <ol> 33 <li><a href="{@docRoot}samples/DocumentCentricApps/index.html">Ứng dụng tập trung vào tài liệu</a></li> 34 </ol> 35 36</div> 37</div> 38 39<p>Màn hình tổng quan (còn được gọi là màn hình gần đây, danh sách tác vụ gần đây, hay ứng dụng gần đây) 40là một UI cấp hệ thống liệt kê các <a href="{@docRoot}guide/components/activities.html"> 41hoạt động</a> và <a href="{@docRoot}guide/components/tasks-and-back-stack.html">tác vụ</a> mới được truy cập gần đây. Người dùng 42có thể điều hướng qua danh sách này và chọn một tác vụ để tiếp tục, hoặc người dùng có thể loại bỏ một tác vụ khỏi 43danh sách bằng cách trượt nhanh nó đi. Với việc phát hành Android 5.0 (API mức 21), nhiều thực thể của 44hoạt động tương tự chứa các tài liệu khác nhau có thể xuất hiện dưới dạng các tác vụ trong màn hình tổng quan. Ví dụ, 45Google Drive có thể có một tác vụ cho từng tài liệu trong một vài tài liệu Google. Mỗi tài liệu xuất hiện thành một 46tác vụ trong màn hình tổng quan.</p> 47 48<img src="{@docRoot}images/components/recents.png" alt="" width="284" /> 49<p class="img-caption"><strong>Hình 1.</strong> Màn hình tổng quan hiển thị ba tài liệu Google Drive 50, mỗi tài liệu được biểu diễn như một tác vụ riêng.</p> 51 52<p>Thường thì bạn sẽ cho phép hệ thống định nghĩa cách tác vụ và 53hoạt động của mình được biểu diễn như thế nào trong màn hình tổng quan, và bạn không cần sửa đổi hành vi này. 54Tuy nhiên, ứng dụng của bạn có thể xác định cách thức và thời gian các hoạt động xuất hiện trong màn hình tổng quan. Lớp 55{@link android.app.ActivityManager.AppTask} cho phép bạn quản lý tác vụ, và cờ hoạt động của 56lớp {@link android.content.Intent} cho phép bạn quy định khi nào thì một hoạt động được thêm hoặc loại bỏ khỏi 57màn hình tổng quan. Đồng thời, thuộc tính <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"> 58<activity></a></code> cho phép bạn đặt hành vi trong bản kê khai.</p> 59 60<h2 id="adding">Thêm Tác vụ vào Màn hình Tổng quan</h2> 61 62<p>Sử dụng cờ của lớp {@link android.content.Intent} để thêm một tác vụ cho phép kiểm soát nhiều hơn 63đối với thời điểm và cách thức một tài liệu được mở hoặc mở lại trong màn hình tổng quan. Khi sử dụng các thuộc tính 64<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 65, bạn có thể chọn giữa luôn mở tài liệu trong một tác vụ mới hoặc sử dụng lại một 66tác vụ hiện có cho tài liệu.</p> 67 68<h3 id="flag-new-doc">Sử dụng cờ Ý định để thêm một tác vụ</h3> 69 70<p>Khi tạo một tài liệu mới cho hoạt động của bạn, bạn gọi phương pháp 71{@link android.app.ActivityManager.AppTask#startActivity(android.content.Context, android.content.Intent, android.os.Bundle) startActivity()} 72của lớp {@link android.app.ActivityManager.AppTask}, chuyển cho nó ý định có 73chức năng khởi chạy hoạt động. Để chèn một ngắt lô-gic sao cho hệ thống coi hoạt động của bạn như một tác vụ 74mới trong màn hình tổng quan, hãy chuyển cờ {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 75trong phương pháp {@link android.content.Intent#addFlags(int) addFlags()} của {@link android.content.Intent} 76có chức năng khởi chạy hoạt động.</p> 77 78<p class="note"><strong>Lưu ý:</strong> Cờ {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 79thay thế cờ {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET}, 80được rút bớt kể từ phiên bản Android 5.0 (API mức 21).</p> 81 82<p>Nếu bạn đặt cờ {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} khi tạo 83tài liệu mới, hệ thống sẽ luôn tạo một tác vụ mới lấy hoạt động mục tiêu đó làm gốc. 84Thiết đặt này cho phép mở cùng tài liệu trong nhiều hơn một tác vụ. Đoạn mã sau thể hiện 85cách mà hoạt động chính thực hiện điều này:</p> 86 87<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html"> 88DocumentCentricActivity.java</a></p> 89<pre> 90public void createNewDocument(View view) { 91 final Intent newDocumentIntent = newDocumentIntent(); 92 if (useMultipleTasks) { 93 newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK); 94 } 95 startActivity(newDocumentIntent); 96 } 97 98 private Intent newDocumentIntent() { 99 boolean useMultipleTasks = mCheckbox.isChecked(); 100 final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class); 101 newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT); 102 newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet()); 103 return newDocumentIntent; 104 } 105 106 private static int incrementAndGet() { 107 Log.d(TAG, "incrementAndGet(): " + mDocumentCounter); 108 return mDocumentCounter++; 109 } 110} 111</pre> 112 113<p class="note"><strong>Lưu ý:</strong> Các hoạt động được khởi chạy bằng cờ {@code FLAG_ACTIVITY_NEW_DOCUMENT} 114phải có giá trị thuộc tính {@code android:launchMode="standard"} (mặc định) được đặt trong 115bản kê khai.</p> 116 117<p>Khi hoạt động chính khởi chạy một hoạt động mới, hệ thống sẽ tìm kiếm thông qua các tác vụ hiện tại để 118xem tác vụ nào có ý định khớp với tên thành phần ý định và dữ liệu Ý định cho hoạt động đó. Nếu tác vụ 119không được tìm thấy, hoặc ý định chứa cờ {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} 120thì một tác vụ mới sẽ được tạo lấy hoạt động làm gốc. Nếu tìm thấy, nó sẽ mang tác vụ đó 121tới phía trước và chuyển ý định mới tới {@link android.app.Activity#onNewIntent onNewIntent()}. 122Hoạt động mới sẽ nhận ý định và tạo một tài liệu mới trong màn hình tổng quan, như trong ví dụ 123sau:</p> 124 125<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html"> 126NewDocumentActivity.java</a></p> 127<pre> 128@Override 129protected void onCreate(Bundle savedInstanceState) { 130 super.onCreate(savedInstanceState); 131 setContentView(R.layout.activity_new_document); 132 mDocumentCount = getIntent() 133 .getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0); 134 mDocumentCounterTextView = (TextView) findViewById( 135 R.id.hello_new_document_text_view); 136 setDocumentCounterText(R.string.hello_new_document_counter); 137} 138 139@Override 140protected void onNewIntent(Intent intent) { 141 super.onNewIntent(intent); 142 /* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this activity 143 is reused to create a new document. 144 */ 145 setDocumentCounterText(R.string.reusing_document_counter); 146} 147</pre> 148 149 150<h3 id="#attr-doclaunch">Sử dụng thuộc tính hoạt động để thêm một tác vụ</h3> 151 152<p>Một hoạt động cũng có thể quy định trong bản kê khai của nó rằng nó luôn khởi chạy vào một tác vụ mới bằng cách sử dụng 153thuộc tính <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 154, <a href="{@docRoot}guide/topics/manifest/activity-element.html#dlmode"> 155{@code android:documentLaunchMode}</a>. Thuộc tính này có bốn giá trị tạo ra hiệu ứng 156sau khi người dùng mở một tài liệu bằng ứng dụng:</p> 157 158<dl> 159 <dt>"{@code intoExisting}"</dt> 160 <dd>Hoạt động sử dụng lại một tác vụ hiện có cho tài liệu. Điều này giống như khi thiết đặt cờ 161 {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} mà <em>không</em> thiết đặt cờ 162 {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}, như được mô tả trong phần 163 <a href="#flag-new-doc">Sử dụng cờ Ý định để thêm một tác vụ</a> bên trên.</dd> 164 165 <dt>"{@code always}"</dt> 166 <dd>Hoạt động tạo một tác vụ mới cho tài liệu, ngay cả khi tài liệu đã được mở. Sử dụng 167 giá trị này giống như thiết đặt cả cờ {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 168 và {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}.</dd> 169 170 <dt>"{@code none”}"</dt> 171 <dd>Hoạt động không tạo một tác vụ mới cho tài liệu. Màn hình tổng quan xử lý hoạt động 172 như theo mặc định: nó hiển thị một tác vụ đơn lẻ cho ứng dụng, tác vụ này 173 tiếp tục từ bất kỳ hoạt động nào mà người dùng đã gọi ra cuối cùng.</dd> 174 175 <dt>"{@code never}"</dt> 176 <dd>Hoạt động không tạo một tác vụ mới cho tài liệu. Việc thiết đặt giá trị này sẽ khống chế 177 hành vi của {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} 178 và cờ {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}, nếu một trong hai được đặt 179 trong ý định, và màn hình tổng quan sẽ hiển thị một tác vụ đơn lẻ cho ứng dụng, tác vụ này tiếp tục từ 180 bất kỳ hoạt động nào mà người dùng đã gọi ra cuối cùng.</dd> 181</dl> 182 183<p class="note"><strong>Lưu ý:</strong> Đối với những giá trị ngoài {@code none} và {@code never} 184hoạt động phải được định nghĩa bằng {@code launchMode="standard"}. Nếu thuộc tính này không được quy định thì 185{@code documentLaunchMode="none"} sẽ được sử dụng.</p> 186 187<h2 id="removing">Loại bỏ Tác vụ</h2> 188 189<p>Theo mặc định, một tác vụ tài liệu sẽ tự động được loại bỏ khỏi màn hình tổng quan khi hoạt động của nó 190hoàn thành. Bạn có thể khống chế hành vi này bằng lớp {@link android.app.ActivityManager.AppTask}, 191bằng một cờ {@link android.content.Intent}, hoặc bằng một thuộc tính<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"> 192<activity></a></code>.</p> 193 194<p>Bạn có thể luôn loại trừ hoàn toàn một tác vụ khỏi màn hình tổng quan bằng cách thiết đặt thuộc tính 195<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 196, <a href="{@docRoot}guide/topics/manifest/activity-element.html#exclude"> 197{@code android:excludeFromRecents}</a> thành {@code true}.</p> 198 199<p>Bạn có thể thiết đặt số lượng tác vụ tối đa mà ứng dụng của bạn có thể bao gồm trong màn hình tổng quan bằng cách đặt thuộc tính 200 <code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 201 <a href="{@docRoot}guide/topics/manifest/activity-element.html#maxrecents">{@code android:maxRecents} 202</a> thành một giá trị số nguyên. Mặc định là 16. Khi đạt được số tác vụ tối đa, 203tác vụ ít sử dụng gần đây nhất sẽ bị loại bỏ khỏi màn hình tổng quan. Giá trị tối đa {@code android:maxRecents} 204bằng 50 (25 trên các thiết bị có bộ nhớ thấp); giá trị thấp hơn 1 không hợp lệ.</p> 205 206<h3 id="#apptask-remove">Sử dụng lớp AppTask để loại bỏ tác vụ</h3> 207 208<p>Trong hoạt động mà tạo một tác vụ mới trong màn hình tổng quan, bạn có thể 209quy định khi nào thì loại bỏ tác vụ và hoàn thành tất cả các hoạt động gắn liền với nó bằng cách gọi 210phương pháp {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()}.</p> 211 212<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html"> 213NewDocumentActivity.java</a></p> 214<pre> 215public void onRemoveFromRecents(View view) { 216 // The document is no longer needed; remove its task. 217 finishAndRemoveTask(); 218} 219</pre> 220 221<p class="note"><strong>Lưu ý:</strong> Sử dụng phương pháp 222{@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()} 223sẽ khống chế việc sử dụng tag {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}, 224như được trình bày ở bên dưới.</p> 225 226<h3 id="#retain-finished">Giữ lại tác vụ đã hoàn thành</h3> 227 228<p>Nếu bạn muốn giữ lại một tác vụ trong màn hình tổng quan, ngay cả khi hoạt động của nó đã hoàn thành, hãy chuyển 229cờ {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} trong phương pháp 230{@link android.content.Intent#addFlags(int) addFlags()} của Ý định mà khởi chạy hoạt động.</p> 231 232<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html"> 233DocumentCentricActivity.java</a></p> 234<pre> 235private Intent newDocumentIntent() { 236 final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class); 237 newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT | 238 android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS); 239 newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet()); 240 return newDocumentIntent; 241} 242</pre> 243 244<p>Để đạt được cùng kết quả như vậy, hãy đặt thuộc tính 245<code><a href="{@docRoot}guide/topics/manifest/activity-element.html"><activity></a></code> 246<a href="{@docRoot}guide/topics/manifest/activity-element.html#autoremrecents"> 247{@code android:autoRemoveFromRecents}</a> thành {@code false}. Giá trị mặc định bằng {@code true} 248đối với các hoạt động tài liệu, và {@code false} đối với các hoạt động thông thường. Việc sử dụng thuộc tính này sẽ khống chế 249cờ {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}, như đã trình bày trước đó.</p> 250 251 252 253 254 255 256 257