blob: 8b6e1c8458c91dafa7749a61c070a35de484a053 [file] [log] [blame]
page.title=Thông báo
@jd:body
<div id="qv-wrapper">
<div id="qv">
<h2>Trong tài liu này</h2>
<ol>
<li><a href="#Design">Cân nhc Thiết kế</a></li>
<li><a href="#CreateNotification">To mt Thông báo</a>
<ol>
<li><a href="#Required">Ni dung thông báo được yêu cu</a></li>
<li><a href="#Optional">Ni dung và cài đặt thông báo tùy chn</a></li>
<li><a href="#Actions">Hành động thông báo</a></li>
<li><a href="#Priority">Mc ưu tiên ca thông báo</a></li>
<li><a href="#SimpleNotification">To mt thông báo đơn gin</a></li>
<li><a href="#ApplyStyle"p dng b trí m rng cho mt thông báo</a></li>
<li><a href="#Compatibility">X lý tính tương thích</a></li>
</ol>
</li>
<li><a href="#Managing">Qun lý Thông báo</a>
<ol>
<li><a href="#Updating">Cp nht thông báo</a></li>
<li><a href="#Removing">Loi b thông báo</a></li>
</ol>
</li>
<li><a href="#NotificationResponse">Gi li Điu hướng khi Bt đầu mt Hot động</a>
<ol>
<li><a href="#DirectEntry">Thiết đặt mt PendingIntent cho hot động thường xuyên</a></li>
<li><a href="#ExtendedNotification">Thiết đặt mt PendingIntent cho hot động đặc bit</a></li>
</ol>
</li>
<li><a href="#Progress">Hin th Tiến độ trong mt Thông báo</a>
<ol>
<li><a href="#FixedProgress">Hin th mt ch báo tiến độ thi lượng c định</a></li>
<li><a href="#ActivityIndicator">Hin th mt ch báo hot động liên tc</a></li>
</ol>
</li>
<li><a href="#metadata">Siêu d liu Thông báo</a></li>
<li><a href="#Heads-up">Thông báo Cnh báo</a></li>
<li><a href="#lockscreenNotification">Thông báo Màn hình Khóa</a></li>
<ol>
<li><a href="#visibility">Thiết đặt Kh năng Hin thị</a></li>
<li><a href="#controllingMedia"iu khin Phát li Phương tin trên Màn hình Khóa</a></li>
</ol>
<li><a href="#CustomNotification">B trí Thông báo Tùy chnh</a></li>
</ol>
<h2>Lp khóa</h2>
<ol>
<li>{@link android.app.NotificationManager}</li>
<li>{@link android.support.v4.app.NotificationCompat}</li>
</ol>
<h2>Video</h2>
<ol>
<li>
<a href="http://www.youtube.com/watch?v=Yc8YrVc47TI&amp;feature=player_detailpage#t=1672s">
Thông báo trong 4.1</a>
</li>
</ol>
<h2>Xem thêm</h2>
<ol>
<li>
<a href="{@docRoot}design/patterns/notifications.html">Thiết kế Android: Thông báo</a>
</li>
</ol>
</div>
</div>
<p>
Thông báo là mt thông đip bn có th hin th vi người dùng bên ngoài
UI bình thường ca ng dng ca bn. Khi bn yêu cu h thng phát hành mt thông báo, trước tiên nó xut hin như mt biu tượng trong
<strong>khu vc thông báo</strong>. Để xem chi tiết thông báo, người dùng m
<strong>ngăn kéo thông báo</strong>. C khu vc thông báo và ngăn kéo thông báo đều
là các khu vc do h thng kim soát mà người dùng có th xem vào bt c lúc nào.
</p>
<img id="figure1" src="{@docRoot}images/ui/notifications/notification_area.png" height="" alt="" />
<p class="img-caption">
<strong>Hình 1.</strong> Thông báo trong khu vc thông báo.
</p>
<img id="figure2" src="{@docRoot}images/ui/notifications/notification_drawer.png" width="280px" alt="" />
<p class="img-caption">
<strong>Hình 2.</strong> Thông báo trong ngăn kéo thông báo.
</p>
<p class="note"><strong>Lưu ý:</strong> Ngoi tr phn được lưu ý, hướng dn này nhc đến
lp {@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder}
trong phiên bn 4 ca <a href="{@docRoot}tools/support-library/index.html">Thư vin H trợ</a>.
Lp {@link android.app.Notification.Builder Notification.Builder} đã được thêm vào trong Android
3.0 (API mc 11).</p>
<h2 id="Design">Cân nhc Thiết kế</h2>
<p>Là mt phn quan trng ca giao din người dùng Android, thông báo có các hướng dn thiết kế ca riêng mình.
Nhng thay đổi thiết kế cơ bn được gii thiu trong Android 5.0 (API mc 21) đặc bit
quan trng và bn nên xem phn đào to v <a href="{@docRoot}training/material/index.html">Thiết kế Material</a>
để biết thêm thông tin. Để tìm hiu cách thiết kế thông báo và tương tác ca chúng, hãy đọc hướng dn thiết kế
<a href="{@docRoot}design/patterns/notifications.html">Thông báo</a>.</p>
<h2 id="CreateNotification">To mt Thông báo</h2>
<p>Bn quy định thông tin UI và các hành động cho mt thông báo trong mt đối tượng
{@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder}.
Để to chính thông báo, bn gi
{@link android.support.v4.app.NotificationCompat.Builder#build NotificationCompat.Builder.build()},
nó s tr v mt đối tượng {@link android.app.Notification} cha nhng đặc t ca bn. Để phát hành
thông báo, bn chuyn đối tượng {@link android.app.Notification} ti h thng bng cách gi
{@link android.app.NotificationManager#notify NotificationManager.notify()}.</p>
<h3 id="Required">Ni dung thông báo được yêu cu</h3>
<p>
Mt đối tượng {@link android.app.Notification} <em>phi</em> cha nhng điu sau:
</p>
<ul>
<li>
Mt biu tượng nh được đặt bi
{@link android.support.v4.app.NotificationCompat.Builder#setSmallIcon setSmallIcon()}
</li>
<li>
Mt tiêu đề được đặt bi
{@link android.support.v4.app.NotificationCompat.Builder#setContentTitle setContentTitle()}
</li>
<li>
Văn bn chi tiết được đặt bi
{@link android.support.v4.app.NotificationCompat.Builder#setContentText setContentText()}
</li>
</ul>
<h3 id="Optional">Ni dung và cài đặt thông báo tùy chn</h3>
<p>
Tt c cài đặt và ni dung thông báo khác đều mang tính tùy chn. Để tìm hiu thêm v chúng,
hãy xem tài liu tham kho cho {@link android.support.v4.app.NotificationCompat.Builder}.
</p>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="Actions">Hành động thông báo</h3>
<p>
Mc dù chúng mang tính tùy chn, bn nên thêm ít nht mt hành động vào thông báo ca mình.
Mt hành động cho phép người dùng đi trc tiếp t thông báo ti mt
{@link android.app.Activity} trong ng dng ca bn, nơi mà h có th xem thêm mt hoc nhiu s kin
hoc làm vic thêm.
</p>
<p>
Mt thông báo có th cung cp nhiu hành động. Bn nên luôn định nghĩa hành động mà được
kích khi khi người dùng nhp vào thông báo; thường thì hành động này m ra mt
{@link android.app.Activity} trong ng dng ca bn. Bn cũng có th thêm các nút vào thông báo
để thc hin nhng hành động b sung chng hn như báo li báo thc hay hi đáp ngay lp tc mt tin nhn
văn bn; tính năng này sn có t phiên bn Android 4.1. Nếu s dng các nút hành động b sung, bn
cũng phi cung cp tính năng ca chúng trong mt {@link android.app.Activity} trong ng dng ca bn; xem
phn <a href="#Compatibility">X lý tính tương thích</a> để biết thêm chi tiết.
</p>
<p>
Bên trong mt {@link android.app.Notification}, bn thân hành động được định nghĩa bi mt
{@link android.app.PendingIntent} cha mt
{@link android.content.Intent} có chc năng bt đầu
mt {@link android.app.Activity} trong ng dng ca bn. Để liên kết
{@link android.app.PendingIntent} vi mt c chỉ, hãy gi phương pháp
{@link android.support.v4.app.NotificationCompat.Builder} phù hp. Ví dụ, nếu bn mun bt đầu
{@link android.app.Activity} khi người dùng nhp vào văn bn thông báo trong
ngăn kéo thông báo, bn hãy thêm {@link android.app.PendingIntent} bng cách gi
{@link android.support.v4.app.NotificationCompat.Builder#setContentIntent setContentIntent()}.
</p>
<p>
Bt đầu mt {@link android.app.Activity} khi người dùng nhp vào thông báo là kch bn
hành động ph biến nht. Bn cũng có th bt đầu mt {@link android.app.Activity} khi người dùng
b mt thông báo. Trong phiên bn Android 4.1 và sau đó, bn có th bt đầu mt
{@link android.app.Activity} t mt nút hành động. Để tìm hiu thêm, hãy đọc hướng dn tham kho cho
{@link android.support.v4.app.NotificationCompat.Builder}.
</p>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="Priority">Mc ưu tiên ca thông báo</h3>
<p>
Nếu mun, bn có th đặt mc ưu tiên ca mt thông báo. Mc ưu tiên đóng vai trò
như mt gi ý cho UI ca thiết b v cách thông báo s được hin thị.
Để đặt mc ưu tiên ca mt thông báo, hãy gi {@link
android.support.v4.app.NotificationCompat.Builder#setPriority(int)
NotificationCompat.Builder.setPriority()} và chuyn trong mt trong các hng s mc ưu tiên {@link
android.support.v4.app.NotificationCompat}. Có năm mc ưu tiên,
dao động t {@link
android.support.v4.app.NotificationCompat#PRIORITY_MIN} (-2) đến {@link
android.support.v4.app.NotificationCompat#PRIORITY_MAX} (2); nếu không được đặt,
mc ưu tiên mc định thành {@link
android.support.v4.app.NotificationCompat#PRIORITY_DEFAULT} (0).
</p>
<p> Để biết thông tin v vic đặt mt mc ưu tiên phù hp, hãy xem phn "Đặt
và quản lý mức ưu tiên của thông báo cho đúng" trong hướng dn Thiết kế <a href="{@docRoot}design/patterns/notifications.html">Thông báo</a>
.
</p>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="SimpleNotification">To mt thông báo đơn gin</h3>
<p>
Đon mã HTML sau minh ha mt thông báo đơn gin, trong đó quy định mt hot động s m khi
người dùng nhp vào thông báo. Để ý rng đon mã này s to mt đối tượng
{@link android.support.v4.app.TaskStackBuilder} và s dng nó để to
{@link android.app.PendingIntent} cho hành động. Kiu mu này được gii thích chi tiết hơn
trong phn <a href="#NotificationResponse">
Gi li Điu hướng khi Bt đầu mt Hot động</a>:
</p>
<pre>
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!");
// Creates an explicit intent for an Activity in your app
Intent resultIntent = new Intent(this, ResultActivity.class);
// The stack builder object will contain an artificial back stack for the
// started Activity.
// This ensures that navigating backward from the Activity leads out of
// your application to the Home screen.
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack for the Intent (but not the Intent itself)
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent that starts the Activity to the top of the stack
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(
0,
PendingIntent.FLAG_UPDATE_CURRENT
);
mBuilder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// mId allows you to update the notification later on.
mNotificationManager.notify(mId, mBuilder.build());
</pre>
<p>Vy là xong. Người dùng ca bn hin đã được thông báo.</p>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="ApplyStyle"p dng b trí m rng cho mt thông báo</h3>
<p>
Để có mt thông báo xut hin trong mt dng xem m rng, trước tiên hãy to mt đối tượng
{@link android.support.v4.app.NotificationCompat.Builder} vi các tùy chn dng xem thông thường
mà bn mun. Tiếp theo, hãy gi {@link android.support.v4.app.NotificationCompat.Builder#setStyle
Builder.setStyle()} vi mt đối tượng b trí m rng làm tham đối.
</p>
<p>
Ghi nh rng các thông báo m rng không sn có trên các nn tng trước Android 4.1. Để
tìm hiu v cách x lý thông báo đối vi nn tng phiên bn Android 4.1 và trước đó, hãy đọc
phn <a href="#Compatibility">X lý tính tương thích</a>.
</p>
<p>
Ví dụ, đon mã HTML sau minh ha cách thay đổi thông báo được to
trong đon mã HTML trước để s dng b trí m rng:
</p>
<pre>
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("Event tracker")
.setContentText("Events received")
NotificationCompat.InboxStyle inboxStyle =
new NotificationCompat.InboxStyle();
String[] events = new String[6];
// Sets a title for the Inbox in expanded layout
inboxStyle.setBigContentTitle("Event tracker details:");
...
// Moves events into the expanded layout
for (int i=0; i &lt; events.length; i++) {
inboxStyle.addLine(events[i]);
}
// Moves the expanded layout object into the notification object.
mBuilder.setStyle(inBoxStyle);
...
// Issue the notification here.
</pre>
<h3 id="Compatibility">X lý tính tương thích</h3>
<p>
Không phi tt c tính năng thông báo đều sn có đối vi mt phiên bn c thể, mc dù
các phương pháp đặt chúng đều nm trong lp thư vin h tr
{@link android.support.v4.app.NotificationCompat.Builder NotificationCompat.Builder}.
Ví dụ, nút hành động ph thuc vào thông báo m rng ch xut hin trên phiên bn Android
4.1 tr lên, bi bn thân thông báo m rng ch sn có trên phiên bn
Android 4.1 tr lên.
</p>
<p>
Để đảm bo tính tương thích tt nht, hãy to thông báo bng
{@link android.support.v4.app.NotificationCompat NotificationCompat} và các lp con ca nó,
đặc bit là {@link android.support.v4.app.NotificationCompat.Builder
NotificationCompat.Builder}. Bên cnh đó, hãy tuân theo tiến trình sau khi bn trin khai mt thông báo:
</p>
<ol>
<li>
Cung cp tt c tính năng thông báo cho tt c người dùng, không ph thuc vào phiên bn
mà h đang s dng. Để làm vy, hãy xác minh rng tt c tính năng đều sn có t mt
{@link android.app.Activity} trong ng dng ca bn. Bn có th mun thêm mt
{@link android.app.Activity} mi để làm điu này.
<p>
Ví dụ, nếu bn mun s dng
{@link android.support.v4.app.NotificationCompat.Builder#addAction addAction()} để
cung cp kh năng điu khin dng và bt đầu phát li phương tin, trước tiên hãy trin khai kh năng
điu khin này trong mt {@link android.app.Activity} trong ng dng ca bn.
</p>
</li>
<li>
Đảm bo rng tt c người dùng đều có th tiếp cn vi tính năng trong {@link android.app.Activity},
bng cách cho nó khi động khi người dùng nhp vào thông báo. Để làm điu này,
hãy to mt {@link android.app.PendingIntent}
cho {@link android.app.Activity}. Gi
{@link android.support.v4.app.NotificationCompat.Builder#setContentIntent
setContentIntent()} để thêm {@link android.app.PendingIntent} vào thông báo.
</li>
<li>
Bây giờ, hãy thêm các tính năng thông báo m rng mà bn mun s dng vào thông báo. Ghi nh
rng bt k tính năng nào mà bn thêm cũng phi sn có trong {@link android.app.Activity}
mà bt đầu khi người dùng nhp vào thông báo.
</li>
</ol>
<!-- ------------------------------------------------------------------------------------------ -->
<!-- ------------------------------------------------------------------------------------------ -->
<h2 id="Managing">Qun lý Thông báo</h2>
<p>
Khi cn phát hành mt thông báo nhiu ln cho cùng loi s kin, bn
nên tránh to mt thông báo hoàn toàn mi. Thay vào đó, bn nên cân nhc cp nht
mt thông báo trước đó, hoc bng cách thay đổi mt vài giá tr hoc bng cách thêm vào nó, hoc c hai.
</p>
<p>
Ví dụ, Gmail thông báo vi người dùng rng e-mail mi đã đến bng cách tăng s đếm
tin nhn chưa đọc và bng cách thêm mt phn tóm tt tng e-mail vào thông báo. Đây được gi là
"xếp chồng" thông báo; nó được mô t chi tiết hơn trong phn hướng dn Thiết kế
<a href="{@docRoot}design/patterns/notifications.html">Thông báo</a>.
</p>
<p class="note">
<strong>Lưu ý:</strong> Tính năng Gmail này yêu cu b trí m rng "hộp thư đến", đó là
mt phn ca tính năng thông báo m rng sn có bt đầu t Android 4.1.
</p>
<p>
Phn sau mô t cách cp nht thông báo và c cách loi b chúng.
</p>
<h3 id="Updating">Cp nht thông báo</h3>
<p>
Để thiết lp mt thông báo để nó có th được cp nht, hãy phát hành nó cùng mt ID thông báo bng cách gi
{@link android.app.NotificationManager#notify(int, android.app.Notification) NotificationManager.notify()}.
Để cp nht thông báo sau khi bn đã phát hành
nó, hãy cp nhật hoc to mt đối tượng {@link android.support.v4.app.NotificationCompat.Builder},
xây dng mt đối tượng {@link android.app.Notification} t nó, và phát hành
{@link android.app.Notification} vi cùng ID mà bn đã s dng trước đó. Nếu
thông báo trước đó vn hin thị, h thng s cp nht nó t ni dung ca
đối tượng {@link android.app.Notification}. Nếu thông báo trước đó đã b b đi, mt
thông báo mi s được to thay thế.
</p>
<p>
Đon mã HTML sau minh ha mt thông báo được cp nhật để phn ánh
s s kin đã xy ra. Nó xếp chng thông báo, hin th mt tóm tt:
</p>
<pre>
mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Sets an ID for the notification, so it can be updated
int notifyID = 1;
mNotifyBuilder = new NotificationCompat.Builder(this)
.setContentTitle("New Message")
.setContentText("You've received new messages.")
.setSmallIcon(R.drawable.ic_notify_status)
numMessages = 0;
// Start of a loop that processes data and then notifies the user
...
mNotifyBuilder.setContentText(currentText)
.setNumber(++numMessages);
// Because the ID remains unchanged, the existing notification is
// updated.
mNotificationManager.notify(
notifyID,
mNotifyBuilder.build());
...
</pre>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="Removing">Loi b thông báo</h3>
<p>
Thông báo vn hin th cho ti khi xy ra mt trong nhng điu sau:
</p>
<ul>
<li>
Người dùng b tng thông báo mt hoc b tt c bng cách s dng "Xóa Tất cả" (nếu
thông báo có th xóa được).
</li>
<li>
Người dùng nhp vào thông báo và bn đã gi
{@link android.support.v4.app.NotificationCompat.Builder#setAutoCancel setAutoCancel()} khi
to thông báo.
</li>
<li>
Bn gi {@link android.app.NotificationManager#cancel(int) cancel()} cho một ID thông báo
c thể. Phương pháp này cũng xóa các thông báo đang din ra.
</li>
<li>
Bn gi {@link android.app.NotificationManager#cancelAll() cancelAll()}, nó sẽ xóa
tt c thông báo mà bn đã phát hành trước đó.
</li>
</ul>
<!-- ------------------------------------------------------------------------------------------ -->
<!-- ------------------------------------------------------------------------------------------ -->
<h2 id="NotificationResponse">Gi li Điu hướng khi Bt đầu mt Hot động</h2>
<p>
Khi bn bt đầu mt {@link android.app.Activity} t mt thông báo, bn phi gi li tri nghim điu hướng k vng
ca người dùng. Nhp vào <i>Quay li</i> s đưa người dùng quay li thông qua
tiến trình làm vic bình thường ca ng dng v màn hình Trang chủ, và nhp vào <i>Gn đây</i> s hin th
{@link android.app.Activity} như mt tác v riêng. Để gi li tri nghim điu hướng, bn
nên bt đầu {@link android.app.Activity} trong mt tác v mi. Cách bn thiết lp
{@link android.app.PendingIntent} để cp cho bn mt tác v mi s ph thuc vào tính cht ca
{@link android.app.Activity} mà bn đang bt đầu. Có hai tình hung thông thường:
</p>
<dl>
<dt>
Hot động thường xuyên
</dt>
<dd>
Bn đang bt đầu mt {@link android.app.Activity} là mt phn ca tiến trình công vic
bình thường ca ng dng. Trong tình hung này, hãy thiết lp {@link android.app.PendingIntent} để
bt đầu mt tác v mi, và cung cp {@link android.app.PendingIntent} vi mt ngăn xếp
có chc năng tái to li hành vi thông thường <i>Quay li</i> ca ng dng.
<p>
Thông báo t ng dng Gmail th hin điu này. Khi bn nhp vào mt thông báo
cho mt thư e-mail đơn lẻ, bn s thy chính thư đó. Chm vào <b>Quay li</b> s đưa bn
ngược li qua Gmail v màn hình Trang chủ, ging như th bn đã vào Gmail t
màn hình Trang ch ch không phi vào t mt thông báo.
</p>
<p>
Điu này xy ra mà không ph thuc vào ng dng bn đang trong khi chm vào
thông báo. Ví dụ, nếu bn đang vào Gmail để son thư, và bn nhp vào mt
thông báo cho mt e-mail đơn lẻ, bn s đến e-mail đó ngay lp tc. Chm vào <i>Quay li</i>
s đưa bn v hp thư đến ri ti màn hình Trang chủ, thay vì đưa bn ti
thư mà bn đang son.
</p>
</dd>
<dt>
Hot động đặc bit
</dt>
<dd>
Người dùng ch thy {@link android.app.Activity} này nếu nó được bt đầu t mt thông báo.
Nghĩa là, {@link android.app.Activity} m rng thông báo bng cách cung cp
thông tin mà s khó hin th trong chính thông báo đó. Đối vi tình hung này,
hãy thiết lp {@link android.app.PendingIntent} để bt đầu mt tác v mi. Tuy nhiên, không cn to
mt ngăn xếp vì {@link android.app.Activity} được bt đầu không phi là mt phn trong
tiến trình hot động ca ng dng. Nhp vào <i>Quay li</i> s vn đưa người dùng đến
màn hình Trang chủ.
</dd>
</dl>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="DirectEntry">Thiết đặt mt PendingIntent cho hot động thường xuyên</h3>
<p>
Để thiết lp {@link android.app.PendingIntent} để bt đầu mt mc nhp trc tiếp
{@link android.app.Activity}, hãy làm theo nhng bước sau:
</p>
<ol>
<li>
Định nghĩa phân cp {@link android.app.Activity} ca ng dng ca bn trong bn kê khai.
<ol style="list-style-type: lower-alpha;">
<li>
Thêm h tr cho phiên bn Android 4.0.3 và trước đó. Để làm điu này, hãy quy định m ca
{@link android.app.Activity} mà bn đang bt đầu bng cách thêm phn t
<code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html">&lt;meta-data&gt;</a></code>
làm con ca
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>.
<p>
Đối vi phn t này, hãy đặt
<code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html#nm">android:name</a>="android.support.PARENT_ACTIVITY"</code>.
Đặt
<code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html#val">android:value</a>="&lt;parent_activity_name&gt;"</code>
trong đó <code>&lt;parent_activity_name&gt;</code> là giá tr ca
<code><a href="{@docRoot}guide/topics/manifest/meta-data-element.html#nm">android:name</a></code>
đối vi phn t
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
mẹ. Xem ví d trong XML sau.
</p>
</li>
<li>
Cũng thêm h tr cho phiên bn Android 4.1 và sau đó. Để làm điu này, hãy thêm thuc tính
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#parent">android:parentActivityName</a></code>
vào phn t
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
ca {@link android.app.Activity} mà bn đang bt đầu.
</li>
</ol>
<p>
XML cui cùng s trông như sau:
</p>
<pre>
&lt;activity
android:name=".MainActivity"
android:label="&#64;string/app_name" &gt;
&lt;intent-filter&gt;
&lt;action android:name="android.intent.action.MAIN" /&gt;
&lt;category android:name="android.intent.category.LAUNCHER" /&gt;
&lt;/intent-filter&gt;
&lt;/activity&gt;
&lt;activity
android:name=".ResultActivity"
android:parentActivityName=".MainActivity"&gt;
&lt;meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".MainActivity"/&gt;
&lt;/activity&gt;
</pre>
</li>
<li>
To mt ngăn xếp da trên {@link android.content.Intent} mà bt đầu
{@link android.app.Activity}:
<ol style="list-style-type: lower-alpha;">
<li>
To {@link android.content.Intent} để bt đầu {@link android.app.Activity}.
</li>
<li>
To mt b dng chng bng cách gi {@link android.app.TaskStackBuilder#create
TaskStackBuilder.create()}.
</li>
<li>
Thêm ngăn xếp vào b dng ngăn xếp bng cách gi
{@link android.support.v4.app.TaskStackBuilder#addParentStack addParentStack()}.
Đối vi mi {@link android.app.Activity} trong phân cp mà bn đã định nghĩa trong
bn kê khai, ngăn xếp cha mt đối tượng {@link android.content.Intent} mà
s khi động {@link android.app.Activity}. Phương pháp này cũng thêm c có chc năng bt đầu
chng trong mt tác v mi.
<p class="note">
<strong>Lưu ý:</strong> Mc dù tham đối đến
{@link android.support.v4.app.TaskStackBuilder#addParentStack addParentStack()}
là mt tham chiếu ti {@link android.app.Activity} được bt đầu, phương pháp gi
không thêm {@link android.content.Intent} có chc năng bt đầu
{@link android.app.Activity}. Thay vào đó, nó được x lý bước tiếp theo.
</p>
</li>
<li>
Thêm {@link android.content.Intent} có chc năng bt đầu {@link android.app.Activity}
t thông báo bng cách gi
{@link android.support.v4.app.TaskStackBuilder#addNextIntent addNextIntent()}.
Chuyn {@link android.content.Intent} mà bn đã to bước đầu tiên làm
tham đối ti
{@link android.support.v4.app.TaskStackBuilder#addNextIntent addNextIntent()}.
</li>
<li>
Nếu bn cn, hãy thêm các tham đối ti các đối tượng {@link android.content.Intent} trên chng
bng cách gi {@link android.support.v4.app.TaskStackBuilder#editIntentAt
TaskStackBuilder.editIntentAt()}. Đôi khi cn phi đảm bo rng
{@link android.app.Activity} mc tiêu s hin th d liu có ý nghĩa khi người dùng điu hướng
ti nó bng cách s dng <i>Quay li</i>.
</li>
<li>
Nhn mt {@link android.app.PendingIntent} cho ngăn xếp này bng cách gi
{@link android.support.v4.app.TaskStackBuilder#getPendingIntent getPendingIntent()}.
Sau đó, bn có th s dng {@link android.app.PendingIntent} này làm tham đối ti
{@link android.support.v4.app.NotificationCompat.Builder#setContentIntent
setContentIntent()}.
</li>
</ol>
</li>
</ol>
<p>
Đon mã HTML sau minh ha tiến trình:
</p>
<pre>
...
Intent resultIntent = new Intent(this, ResultActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
// Adds the back stack
stackBuilder.addParentStack(ResultActivity.class);
// Adds the Intent to the top of the stack
stackBuilder.addNextIntent(resultIntent);
// Gets a PendingIntent containing the entire back stack
PendingIntent resultPendingIntent =
stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
...
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(resultPendingIntent);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.notify(id, builder.build());
</pre>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="ExtendedNotification">Thiết đặt mt PendingIntent cho hot động đặc bit</h3>
<p>
Phn sau mô t cách thiết lp mt
{@link android.app.PendingIntent} cho hot động đặc bit.
</p>
<p>
Mt {@link android.app.Activity} đặc bit không cn ngăn xếp, vì thế bn không phi
định nghĩa phân cp {@link android.app.Activity} ca nó trong bn kê khai, và bn không phi
gi
{@link android.support.v4.app.TaskStackBuilder#addParentStack addParentStack()} để xây dựng một
ngăn xếp. Thay vào đó, hãy s dng bn kê khai để thiết lp các tùy chn tác v {@link android.app.Activity},
và to {@link android.app.PendingIntent} bng cách gi
{@link android.app.PendingIntent#getActivity getActivity()}:
</p>
<ol>
<li>
Trong bn kê khai ca mình, hãy thêm các thuc tính sau vào phn t
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html">&lt;activity&gt;</a></code>
cho {@link android.app.Activity}
<dl>
<dt>
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#nm">android:name</a>="<i>activityclass</i>"</code>
</dt>
<dd>
Tên lớp được xác định đầy đủ của hoạt động.
</dd>
<dt>
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#aff">android:taskAffinity</a>=""</code>
</dt>
<dd>
Kết hp vi c
{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_NEW_TASK}
mà bn đặt trong mã, điu này đảm bo rng {@link android.app.Activity} này không
đi đến tác v mc định ca ng dng. Bt k tác v hin ti nào mà có
b trí mc định ca ng dng đều không b nh hưởng.
</dd>
<dt>
<code><a href="{@docRoot}guide/topics/manifest/activity-element.html#exclude">android:excludeFromRecents</a>="true"</code>
</dt>
<dd>
Loi b tác v mi khi <i>Gn đây</i>, sao cho người dùng không th vô tình
điu hướng quay li nó.
</dd>
</dl>
<p>
Đon mã HTML này th hin phn tử:
</p>
<pre>
&lt;activity
android:name=".ResultActivity"
...
android:launchMode="singleTask"
android:taskAffinity=""
android:excludeFromRecents="true"&gt;
&lt;/activity&gt;
...
</pre>
</li>
<li>
Xây dng và phát hành thông báo:
<ol style="list-style-type: lower-alpha;">
<li>
To mt {@link android.content.Intent} có chc năng bt đầu
{@link android.app.Activity}.
</li>
<li>
Đặt {@link android.app.Activity} để bt đầu trong mt tác v mi, trng bng cách gi
{@link android.content.Intent#setFlags setFlags()} với các cờ
{@link android.content.Intent#FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_NEW_TASK}
và
{@link android.content.Intent#FLAG_ACTIVITY_CLEAR_TASK FLAG_ACTIVITY_CLEAR_TASK}.
</li>
<li>
Đặt bt k tùy chn nào khác mà bn cn cho {@link android.content.Intent}.
</li>
<li>
To mt {@link android.app.PendingIntent} t {@link android.content.Intent}
bng cách gi {@link android.app.PendingIntent#getActivity getActivity()}.
Sau đó, bn có th s dng {@link android.app.PendingIntent} này làm tham đối ti
{@link android.support.v4.app.NotificationCompat.Builder#setContentIntent
setContentIntent()}.
</li>
</ol>
<p>
Đon mã HTML sau minh ha tiến trình:
</p>
<pre>
// Instantiate a Builder object.
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
// Creates an Intent for the Activity
Intent notifyIntent =
new Intent(this, ResultActivity.class);
// Sets the Activity to start in a new, empty task
notifyIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK
| Intent.FLAG_ACTIVITY_CLEAR_TASK);
// Creates the PendingIntent
PendingIntent notifyPendingIntent =
PendingIntent.getActivity(
this,
0,
notifyIntent,
PendingIntent.FLAG_UPDATE_CURRENT
);
// Puts the PendingIntent into the notification builder
builder.setContentIntent(notifyPendingIntent);
// Notifications are issued by sending them to the
// NotificationManager system service.
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// Builds an anonymous Notification object from the builder, and
// passes it to the NotificationManager
mNotificationManager.notify(id, builder.build());
</pre>
</li>
</ol>
<!-- ------------------------------------------------------------------------------------------ -->
<!-- ------------------------------------------------------------------------------------------ -->
<h2 id="Progress">Hin th Tiến độ trong mt Thông báo</h2>
<p>
Thông báo có th bao gm mt ch báo tiến độ dng hot nh để cho người dùng thy trng thái
ca mt thao tác đang din ra. Nếu bn có th ước lượng thao tác mt bao lâu và nó được
được hoàn thành bao nhiêu vào bt c lúc nào, hãy s dng hình thc "xác định" ca ch báo
(thanh tiến độ). Nếu bn không th ước lượng thi lượng ca thao tác, hãy s dng hình thc
"không xác định" ca ch báo (ch báo hot động).
</p>
<p>
Ch báo tiến độ được hin th bng trin khai lp
{@link android.widget.ProgressBar} ca nn tng.
</p>
<p>
Để s dng ch báo tiến độ trên các nn tng bt đầu t Android 4.0, hãy gi
{@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress()}. Đối
vi các phiên bn trước đây, bn phi to b trí thông báo tùy chnh ca chính mình
trong đó cha mt dng xem {@link android.widget.ProgressBar}.
</p>
<p>
Phn sau đây mô t cách hin th tiến độ trong mt thông báo bng cách s dng
{@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress()}.
</p>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="FixedProgress">Hin th mt ch báo tiến độ thi lượng c định</h3>
<p>
Để hin th mt thanh tiến độ xác định, hãy thêm thanh vào thông báo ca bn bng cách gi
{@link android.support.v4.app.NotificationCompat.Builder#setProgress
setProgress(max, progress, false)} ri phát hành thông báo. Khi thông báo ca bn tiến hành,
tăng dn<code>progress</code>, và cp nht thông báo. Khi kết thúc thao tác,
<code>progress</code> sẽ bằng <code>max</code>. Mt cách thông thường để gi
{@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress()}
đó là đặt <code>max</code> thành 100 rồi tăng dần <code>progress</code> dưới dng giá tr
"phần trăm hoàn thành" cho thao tác.
</p>
<p>
Bn có th hoc để thanh tiến độ hin th khi nào thì thao tác hoàn thành, hoc loi b nó. Dù
trong trường hp nào hãy nh cp nht văn bn thông báo để hin th thao tác hoàn tt.
Để loi b thanh tiến độ, hãy gi
{@link android.support.v4.app.NotificationCompat.Builder#setProgress
setProgress(0, 0, false)}. Ví dụ:
</p>
<pre>
...
mNotifyManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mBuilder = new NotificationCompat.Builder(this);
mBuilder.setContentTitle("Picture Download")
.setContentText("Download in progress")
.setSmallIcon(R.drawable.ic_notification);
// Start a lengthy operation in a background thread
new Thread(
new Runnable() {
&#64;Override
public void run() {
int incr;
// Do the "lengthy" operation 20 times
for (incr = 0; incr &lt;= 100; incr+=5) {
// Sets the progress indicator to a max value, the
// current completion percentage, and "determinate"
// state
mBuilder.setProgress(100, incr, false);
// Displays the progress bar for the first time.
mNotifyManager.notify(0, mBuilder.build());
// Sleeps the thread, simulating an operation
// that takes time
try {
// Sleep for 5 seconds
Thread.sleep(5*1000);
} catch (InterruptedException e) {
Log.d(TAG, "sleep failure");
}
}
// When the loop is finished, updates the notification
mBuilder.setContentText("Download complete")
// Removes the progress bar
.setProgress(0,0,false);
mNotifyManager.notify(ID, mBuilder.build());
}
}
// Starts the thread by calling the run() method in its Runnable
).start();
</pre>
<!-- ------------------------------------------------------------------------------------------ -->
<h3 id="ActivityIndicator">Hin th mt ch báo hot động liên tc</h3>
<p>
Để hin th mt ch báo hot động không xác định, hãy thêm nó vào thông báo ca bn bng
{@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress(0, 0, true)}
(hai tham đối đầu tiên b b qua), và phát hành thông báo. Kết qu là mt ch báo
mà có cùng kiu như mt thanh tiến độ, khác ch hot nh ca nó đang din ra.
</p>
<p>
Phát hành thông báo khi bt đầu thao tác. Hot nh s chy ti khi bn
sa đổi thông báo ca mình. Khi thao tác hoàn thành, hãy gi
{@link android.support.v4.app.NotificationCompat.Builder#setProgress setProgress(0, 0, false)}
và ri cp nht thông báo để loi b ch báo hot động.
Luôn làm điu này; nếu không, hot nh s chy ngay c khi thao tác đã hoàn thành. Đồng thi
hãy nh thay đổi văn bn thông báo để biu th thao tác hoàn tt.
</p>
<p>
Để xem ch báo hot động vn hành như thế nào, hãy tham kho đon mã HTML trước. Định v các dòng sau:
</p>
<pre>
// Sets the progress indicator to a max value, the current completion
// percentage, and "determinate" state
mBuilder.setProgress(100, incr, false);
// Issues the notification
mNotifyManager.notify(0, mBuilder.build());
</pre>
<p>
Thay thế các dòng bn đã tìm thy bng các dòng sau:
</p>
<pre>
// Sets an activity indicator for an operation of indeterminate length
mBuilder.setProgress(0, 0, true);
// Issues the notification
mNotifyManager.notify(0, mBuilder.build());
</pre>
<h2 id="metadata">Siêu d liu Thông báo</h2>
<p>Thông báo có th được sp xếp theo siêu d liu mà bn gán cho bng các
phương pháp {@link android.support.v4.app.NotificationCompat.Builder} sau:</p>
<ul>
<li>{@link android.support.v4.app.NotificationCompat.Builder#setCategory(java.lang.String) setCategory()}
thông báo h thng cách x lý thông báo ng dng ca bn khi thiết b đang trong chế độ Ưu tiên
(ví dụ, nếu thông báo ca bn biu din mt cuc gi đến, tin nhn tc thi hoc báo thc).</li>
<li>{@link android.support.v4.app.NotificationCompat.Builder#setPriority(int) setPriority()} khiến
thông báo vi trường mc ưu tiên được đặt thành {@code PRIORITY_MAX} hoc {@code PRIORITY_HIGH} xut hin
trong mt ca s ni nh nếu thông báo cũng có âm thanh hoc rung.</li>
<li>{@link android.support.v4.app.NotificationCompat.Builder#addPerson(java.lang.String) addPerson()}
cho phép bn thêm mt danh sách người vào thông báo. ng dng ca bn có th s dng tín hiu này cho
h thng mà nó s nhóm cùng vi thông báo t nhng người được quy định, hoc xếp hng thông báo
t nhng người này là quan trng hơn.</li>
</ul>
<div class="figure" style="width:230px">
<img src="{@docRoot}images/ui/notifications/heads-up.png" alt="" width="" height="" id="figure3" />
<p class="img-caption">
<strong>Hình 3.</strong> Hot động toàn màn hình th hin mt thông báo cnh báo
</p>
</div>
<h2 id="Heads-up">Thông báo Cnh báo</h2>
<p>Vi Android 5.0 (API mc 21), thông báo có th xut hin trong mt ca s ni nh
(còn gi là <em>thông báo cnh báo</em>) khi thiết b hin hot
(tc là thiết b được mở khóa và màn hình ca nó đang bt). Nhng thông báo
này có v tương t như dng rút gn thông báo ca bn, ch khác là
thông báo cnh báo cũng hin th các nút hành động. Người dùng có th hành động trên đó, hoc bỏ,
mt thông báo cnh báo mà không phi ri khi ng dng hin ti.</p>
<p>Các ví d v điu kin có th kích khi thông báo cnh báo bao gm:</p>
<ul>
<li>Hot động ca người dùng đang trong chế độ toàn màn hình (ứng dng s dng
{@link android.app.Notification#fullScreenIntent}), hoặc</li>
<li>Thông báo có mc ưu tiên cao và s dng nhc chuông hoc
rung</li>
</ul>
<h2 id="lockscreenNotification">Thông báo Màn hình Khóa</h2>
<p>Vi vic phát hành Android 5.0 (API mc 21), gi đây thông báo có th xut hin trên màn hình
khóa. ng dng ca bn có th s dng tính năng này để cung cp các chc năng điu khin phát li phương tin và các hành động
thông dng khác. Người dùng có th chn thông qua Cài đặt để xem có hin th thông báo trên màn hình khóa không, và
bn có th ch định xem thông báo t ng dng ca mình có hin th trên màn hình khóa không.</p>
<h3 id="visibility">Thiết đặt Kh năng Hin thị</h3>
<p>ng dng ca bn có th điu khin mc chi tiết có th nhìn thy được trong thông báo được hin th trên mt
màn hình khóa bo mt. Bn gi {@link android.support.v4.app.NotificationCompat.Builder#setVisibility(int) setVisibility()}
và quy định mt trong nhng giá tr sau:</p>
<ul>
<li>{@link android.support.v4.app.NotificationCompat#VISIBILITY_PUBLIC} hiển thị đầy đủ nội dung của
thông báo.</li>
<li>{@link android.support.v4.app.NotificationCompat#VISIBILITY_SECRET} không hiển thị bất kỳ phần nào của
thông báo này trên màn hình khóa.</li>
<li>{@link android.support.v4.app.NotificationCompat#VISIBILITY_PRIVATE} hiển thị thông tin cơ bản,
chng hn như biu tượng và tiêu đề ni dung ca thông báo, nhưng n ni dung đầy đủ ca thông báo.</li>
</ul>
<p>Khi {@link android.support.v4.app.NotificationCompat#VISIBILITY_PRIVATE} được đặt, bạn cũng có thể
cung cp mt phiên bn thay thế cho ni dung thông báo, trong đó n mt s chi tiết nht định. Ví dụ,
mt ng dng SMS có th hin th mt thông báo hin th <em>Bn có 3 tin nhn văn bn mi</em>, nhưng n
ni dung ca tin nhn và người gửi. Để cung cp thông báo thay thế này, trước tiên hãy to thông báo
thay thế bng cách s dng {@link android.support.v4.app.NotificationCompat.Builder}. Khi bn to
đối tượng thông báo riêng tư, hãy đính kèm thông báo thay thế cho nó thông qua phương pháp
{@link android.support.v4.app.NotificationCompat.Builder#setPublicVersion(android.app.Notification) setPublicVersion()}
.</p>
<h3 id="controllingMedia"iu khin Phát li Phương tin trên Màn hình Khóa</h3>
<p>Trong Android 5.0 (API mc 21) màn hình khóa không còn hin th điu khin phương tin
da trên {@link android.media.RemoteControlClient}, điu mà nay đã b b đi. Thay vào đó, hãy s dng mu
{@link android.app.Notification.MediaStyle} vi phương pháp
{@link android.app.Notification.Builder#addAction(android.app.Notification.Action) addAction()}
, có chc năng chuyn hành động thành các biu tượng có th nhp.</p>
<p class="note"><strong>Lưu ý:</strong> Mu và phương pháp {@link android.app.Notification.Builder#addAction(android.app.Notification.Action) addAction()}
không nm trong thư vin h trợ, vì thế nhng tính năng này ch chy trong phiên bn Android 5.0 tr lên
.</p>
<p>Để hin th điu khin phát li phương tin trên màn hình khóa trong Android 5.0, hãy đặt mc độ nhìn thy
thành {@link android.support.v4.app.NotificationCompat#VISIBILITY_PUBLIC}, như mô tả bên trên. Sau đó thêm
các hành động và đặt mu {@link android.app.Notification.MediaStyle}, như được mô t trong
đon mã mu sau:</p>
<pre>
Notification notification = new Notification.Builder(context)
// Show controls on lock screen even when user hides sensitive content.
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setSmallIcon(R.drawable.ic_stat_player)
// Add media control buttons that invoke intents in your media service
.addAction(R.drawable.ic_prev, "Previous", prevPendingIntent) // #0
.addAction(R.drawable.ic_pause, "Pause", pausePendingIntent) // #1
.addAction(R.drawable.ic_next, "Next", nextPendingIntent) // #2
// Apply the media style template
.setStyle(new Notification.MediaStyle()
.setShowActionsInCompactView(1 /* #1: pause button */)
.setMediaSession(mMediaSession.getSessionToken())
.setContentTitle("Wonderful music")
.setContentText("My Awesome Band")
.setLargeIcon(albumArtBitmap)
.build();
</pre>
<p class="note"><strong>Lưu ý:</strong> Vic rút b {@link android.media.RemoteControlClient}
còn có nhiu ý nghĩa khác đối vi vic điu khin phương tin. Xem phn
<a href="{@docRoot}about/versions/android-5.0.html#MediaPlaybackControl"iu khin Phát li Phương tin</a>
để biết thêm thông tin v các API mi đối vi qun lý phiên phương tin và điu khin phát li này.</p>
<!-- ------------------------------------------------------------------------------------------ -->
<h2 id="CustomNotification">B trí Thông báo Tùy chnh</h2>
<p>
Khuôn kh thông báo cho phép bn định nghĩa mt b trí thông báo tùy chnh, nó
định nghĩa hình thc ca thông báo trong mt đối tượng {@link android.widget.RemoteViews}.
Thông báo có b trí tùy chnh tương t như thông báo thường, nhưng chúng được da trên
{@link android.widget.RemoteViews} được định nghĩa trong mt tp b trí XML.
</p>
<p>
Chiu cao sn có cho b trí thông báo tùy chnh ph thuc vào dng xem thông báo. B trí dng xem bình thường
được gii hn 64 dp, và b trí dng xem m rng được gii hn 256 dp.
</p>
<p>
Để định nghĩa mt b trí thông báo tùy chnh, hãy bt đầu bng vic khi to đối tượng
{@link android.widget.RemoteViews} để bung mt tp b trí XML. Sau đó,
thay vì gi các phương pháp như
{@link android.support.v4.app.NotificationCompat.Builder#setContentTitle setContentTitle()},
hãy gi {@link android.support.v4.app.NotificationCompat.Builder#setContent setContent()}. Để đặt
chi tiết ni dung trong thông báo tùy chnh, hãy s dng các phương pháp
{@link android.widget.RemoteViews} để đặt giá tr ca các tp con ca dng xem:
</p>
<ol>
<li>
To mt b trí XML cho thông báo trong mt tp riêng. Bn có th s dng bt k tên tp nào
mà bn mun, nhưng phi s dng phn m rng <code>.xml</code>
</li>
<li>
Trong ng dng ca bn, hãy s dng các phương pháp {@link android.widget.RemoteViews} để định nghĩa các biu tượng và văn bn
ca thông báo ca bn. Đặt đối tượng {@link android.widget.RemoteViews} này vào
{@link android.support.v4.app.NotificationCompat.Builder} ca bn bng cách gi
{@link android.support.v4.app.NotificationCompat.Builder#setContent setContent()}. Tránh
đặt mt {@link android.graphics.drawable.Drawable} nn trên đối tượng
{@link android.widget.RemoteViews} ca bn, vì màu văn bn ca bn có th không đọc được.
</li>
</ol>
<p>
Lp {@link android.widget.RemoteViews} cũng bao gm các phương pháp mà bn có th s dng để d dng
thêm mt {@link android.widget.Chronometer} hoc {@link android.widget.ProgressBar}
vào b trí thông báo ca bn. Để biết thêm thông tin v vic to b trí tùy chnh cho thông báo
ca mình, hãy tham kho tài liu tham kho {@link android.widget.RemoteViews}.
</p>
<p class="caution">
<strong>Chú ý:</strong> Khi bn s dng mt b trí thông báo tùy chnh, hãy đặc bit cn thn
để đảm bo rng b trí tùy chnh ca bn có tác dng vi các hướng và độ phân gii thiết b khác nhau. Trong khi
li khuyên này áp dng cho tt c b trí Dng xem, nó đặc bit quan trng đối vi thông báo
vì khong trng trong ngăn kéo thông báo rt hn chế. Không được to b trí tùy chnh ca bn quá
phc tp và đảm bo kim tra nó trong các cu hình khác nhau.
</p>
<!-- ------------------------------------------------------------------------------------------ -->
<h4>S dng các tài nguyên kiu cho văn bn thông báo tùy chnh</h4>
<p>
Luôn s dng tài nguyên kiu cho văn bn ca mt thông báo tùy chnh. Màu nn ca thông báo
có th thay đổi gia các thiết b và phiên bn khác nhau, và vic s dng tài nguyên kiu
s giúp bn khc phc điu này. Bt đầu t Android 2.3, h thng đã định nghĩa kiu cho
văn bn b trí thông báo chun. Nếu bn s dng cùng kiu trong các ng dng nhm đến phiên bn Android
2.3 hoc cao hơn, bn s phi đảm bo rng văn bn ca bn nhìn thy được trên nn hin thị.
</p>