• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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&lt;activity&gt;</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">&lt;activity&gt;</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&#64;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&#64;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">&lt;activity&gt;</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&lt;activity&gt;</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">&lt;activity&gt;</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">&lt;activity&gt;</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">&lt;activity&gt;</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