blob: 0a176145f9caa72d9b2b19552d2da69ac5340016 [file] [log] [blame]
page.title=Màn hình Tng quan
page.tags="recents","overview"
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Trong tài liu này</h2>
<ol>
<li><a href="#adding">Thêm Tác v vào Màn hình Tng quan</a>
<ol>
<li><a href="#flag-new-doc">S dng c Ý định để thêm mt tác vụ</a></li>
<li><a href="#attr-doclaunch">S dng thuc tính Hot động để thêm mt tác vụ</a></li>
</ol>
</li>
<li><a href="#removing">Loi b Tác vụ</a>
<ol>
<li><a href="#apptask-remove">S dng lp AppTask để loi b tác vụ</a></li>
<li><a href="#retain-finished">Gi li tác v đã hoàn thành</a></li>
</ol>
</li>
</ol>
<h2>Lp khóa</h2>
<ol>
<li>{@link android.app.ActivityManager.AppTask}</li>
<li>{@link android.content.Intent}</li>
</ol>
<h2>Mã mu</h2>
<ol>
<li><a href="{@docRoot}samples/DocumentCentricApps/index.html">Ứng dng tp trung vào tài liu</a></li>
</ol>
</div>
</div>
<p>Màn hình tng quan (còn được gi là màn hình gn đây, danh sách tác v gn đây, hay ng dng gn đây)
là mt UI cp h thng lit kê các <a href="{@docRoot}guide/components/activities.html">
hot độ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
có 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
danh 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
hoạ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ụ,
Google 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
tác vụ trong màn hình tổng quan.</p>
<img src="{@docRoot}images/components/recents.png" alt="" width="284" />
<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
, mỗi tài liệu được biểu diễn như một tác vụ riêng.</p>
<p>Thường thì bạn sẽ cho phép hệ thống định nghĩa cách tác vụ và
hoạ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.
Tuy 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
{@link android.app.ActivityManager.AppTask} cho phép bạn quản lý tác vụ, và cờ hoạt động của
lớ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
màn hình tổng quan. Đồng thời, thuộc tính <code><a href="{@docRoot}guide/topics/manifest/activity-element.html">
&lt;activity&gt;</a></code> cho phép bạn đặt hành vi trong bản kê khai.</p>
<h2 id="adding">Thêm Tác vụ vào Màn hình Tổng quan</h2>
<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
đố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
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
, 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
tác vụ hiện có cho tài liệu.</p>
<h3 id="flag-new-doc">Sử dụng cờ Ý định để thêm một tác vụ</h3>
<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
{@link android.app.ActivityManager.AppTask#startActivity(android.content.Context, android.content.Intent, android.os.Bundle) startActivity()}
của lớp {@link android.app.ActivityManager.AppTask}, chuyển cho nó ý định có
chứ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ụ
mới trong màn hình tổng quan, hãy chuyển cờ {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
trong phương pháp {@link android.content.Intent#addFlags(int) addFlags()} của {@link android.content.Intent}
có chức năng khởi chạy hoạt động.</p>
<p class="note"><strong>Lưu ý:</strong> Cờ {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
thay thế cờ {@link android.content.Intent#FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET},
được rút bớt kể từ phiên bản Android 5.0 (API mức 21).</p>
<p>Nếu bạn đặt cờ {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK} khi tạo
tà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.
Thiế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
cách mà hoạt động chính thực hiện điều này:</p>
<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
DocumentCentricActivity.java</a></p>
<pre>
public void createNewDocument(View view) {
final Intent newDocumentIntent = newDocumentIntent();
if (useMultipleTasks) {
newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_MULTIPLE_TASK);
}
startActivity(newDocumentIntent);
}
private Intent newDocumentIntent() {
boolean useMultipleTasks = mCheckbox.isChecked();
final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT);
newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
return newDocumentIntent;
}
private static int incrementAndGet() {
Log.d(TAG, "incrementAndGet(): " + mDocumentCounter);
return mDocumentCounter++;
}
}
</pre>
<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}
phải có giá trị thuộc tính {@code android:launchMode="standard"} (mặc định) được đặt trong
bản kê khai.</p>
<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 để
xem 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ụ
không được tìm thấy, hoặc ý định chứa cờ {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}
thì 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ụ đó
tới phía trước và chuyển ý định mới tới {@link android.app.Activity#onNewIntent onNewIntent()}.
Hoạ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ụ
sau:</p>
<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
NewDocumentActivity.java</a></p>
<pre>
&#64;Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_new_document);
mDocumentCount = getIntent()
.getIntExtra(DocumentCentricActivity.KEY_EXTRA_NEW_DOCUMENT_COUNTER, 0);
mDocumentCounterTextView = (TextView) findViewById(
R.id.hello_new_document_text_view);
setDocumentCounterText(R.string.hello_new_document_counter);
}
&#64;Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
/* If FLAG_ACTIVITY_MULTIPLE_TASK has not been used, this activity
is reused to create a new document.
*/
setDocumentCounterText(R.string.reusing_document_counter);
}
</pre>
<h3 id="#attr-doclaunch">Sử dụng thuộc tính hoạt động để thêm một tác vụ</h3>
<p>Mt hot động cũng có th quy định trong bn kê khai ca nó rng nó luôn khi chy vào mt tác v mi bng cách s dng
thuc tính <code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
, <a href="{@docRoot}guide/topics/manifest/activity-element.html#dlmode">
{@code android:documentLaunchMode}</a>. Thuc tính này có bn giá tr to ra hiu ng
sau khi người dùng m mt tài liu bng ng dng:</p>
<dl>
<dt>"{@code intoExisting}"</dt>
<dd>Hot động s dng li mt tác v hin có cho tài liu. Điu này ging như khi thiết đặt c
{@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT} mà <em>không</em> thiết đặt cờ
{@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}, như được mô tả trong phần
<a href="#flag-new-doc">S dng c Ý định để thêm mt tác vụ</a> bên trên.</dd>
<dt>"{@code always}"</dt>
<dd>Hot động to mt tác v mi cho tài liu, ngay c khi tài liu đã được mở. S dng
giá tr này ging như thiết đặt c c {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
và {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}.</dd>
<dt>"{@code none”}"</dt>
<dd>Hot động không to mt tác v mi cho tài liu. Màn hình tng quan x lý hot động
như theo mc định: nó hin th mt tác v đơn l cho ng dng, tác v này
tiếp tc t bt k hot động nào mà người dùng đã gi ra cui cùng.</dd>
<dt>"{@code never}"</dt>
<dd>Hot động không to mt tác v mi cho tài liu. Vic thiết đặt giá tr này s khng chế
hành vi ca {@link android.content.Intent#FLAG_ACTIVITY_NEW_DOCUMENT}
và c {@link android.content.Intent#FLAG_ACTIVITY_MULTIPLE_TASK}, nếu một trong hai được đặt
trong ý định, và màn hình tng quan s hin th mt tác v đơn l cho ng dng, tác v này tiếp tc t
bt k hot động nào mà người dùng đã gi ra cui cùng.</dd>
</dl>
<p class="note"><strong>Lưu ý:</strong> Đối vi nhng giá tr ngoài {@code none} và {@code never}
hot động phi được định nghĩa bng {@code launchMode="standard"}. Nếu thuc tính này không được quy định thì
{@code documentLaunchMode="none"} s được s dng.</p>
<h2 id="removing">Loi b Tác vụ</h2>
<p>Theo mc định, mt tác v tài liu s t động được loi b khi màn hình tng quan khi hot động ca nó
hoàn thành. Bn có th khng chế hành vi này bng lp {@link android.app.ActivityManager.AppTask},
bng mt c {@link android.content.Intent}, hoc bng mt thuc tính<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">
&lt;activity&gt;</a></code>.</p>
<p>Bn có th luôn loi tr hoàn toàn mt tác v khi màn hình tng quan bng cách thiết đặt thuc tính
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
, <a href="{@docRoot}guide/topics/manifest/activity-element.html#exclude">
{@code android:excludeFromRecents}</a> thành {@code true}.</p>
<p>Bn có th thiết đặt s lượng tác v ti đa mà ng dng ca bn có th bao gm trong màn hình tng quan bng cách đặt thuc tính
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
<a href="{@docRoot}guide/topics/manifest/activity-element.html#maxrecents">{@code android:maxRecents}
</a> thành mt giá tr s nguyên. Mc định là 16. Khi đạt được s tác v ti đa,
tác v ít s dng gn đây nht s b loi b khi màn hình tng quan. Giá tr ti đa {@code android:maxRecents}
bng 50 (25 trên các thiết b có bộ nh thp); giá tr thp hơn 1 không hp lệ.</p>
<h3 id="#apptask-remove">S dng lp AppTask để loi b tác vụ</h3>
<p>Trong hot động mà to mt tác v mi trong màn hình tng quan, bn có th
quy định khi nào thì loi b tác v và hoàn thành tt c các hot động gn lin vi nó bng cách gi
phương pháp {@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()}.</p>
<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
NewDocumentActivity.java</a></p>
<pre>
public void onRemoveFromRecents(View view) {
// The document is no longer needed; remove its task.
finishAndRemoveTask();
}
</pre>
<p class="note"><strong>Lưu ý:</strong> S dng phương pháp
{@link android.app.ActivityManager.AppTask#finishAndRemoveTask() finishAndRemoveTask()}
s khng chế vic s dng tag {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS},
như được trình bày bên dưới.</p>
<h3 id="#retain-finished">Gi li tác v đã hoàn thành</h3>
<p>Nếu bn mun gi li mt tác v trong màn hình tng quan, ngay c khi hot động ca nó đã hoàn thành, hãy chuyn
c {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS} trong phương pháp
{@link android.content.Intent#addFlags(int) addFlags()} của Ý định mà khởi chạy hoạt động.</p>
<p class="code-caption"><a href="{@docRoot}samples/DocumentCentricApps/index.html">
DocumentCentricActivity.java</a></p>
<pre>
private Intent newDocumentIntent() {
final Intent newDocumentIntent = new Intent(this, NewDocumentActivity.class);
newDocumentIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_DOCUMENT |
android.content.Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
newDocumentIntent.putExtra(KEY_EXTRA_NEW_DOCUMENT_COUNTER, incrementAndGet());
return newDocumentIntent;
}
</pre>
<p>Để đạt được cùng kết qu như vy, hãy đặt thuc tính
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
<a href="{@docRoot}guide/topics/manifest/activity-element.html#autoremrecents">
{@code android:autoRemoveFromRecents}</a> thành {@code false}. Giá tr mc định bng {@code true}
đối vi các hot động tài liu, và {@code false} đối vi các hot động thông thường. Vic s dng thuc tính này s khng chế
c {@link android.content.Intent#FLAG_ACTIVITY_RETAIN_IN_RECENTS}, như đã trình bày trước đó.</p>