Notification

一规惰、什么是Notification?

Notification是一種有全局效果的通知空厌,可以顯示在系統(tǒng)通知欄。以下內容來自官方文檔颖御。
根據google官方文檔介紹榄棵,通知是您可以在應用的常規(guī) UI 外部向用戶顯示的消息。當您告知系統(tǒng)發(fā)出通知時潘拱,它將先以圖標的形式顯示在通知區(qū)域中疹鳄。用戶可以打開抽屜式通知欄查看通知的詳細信息。 通知區(qū)域和抽屜式通知欄均是由系統(tǒng)控制的區(qū)域芦岂,用戶可以隨時查看瘪弓。

圖 1. 通知區(qū)域中的通知。
圖 2. 抽屜式通知欄中的通知禽最。

二杠茬、創(chuàng)建通知

您可以在 NotificationCompat.Builder對象中為通知指定 UI 信息和操作月褥。要創(chuàng)建通知,請調用 NotificationCompat.Builder.build()瓢喉,它將返回包含您的具體規(guī)范的 Notification
對象宁赤。要發(fā)出通知,請通過調用 NotificationManager.notify()Notification對象傳遞給系統(tǒng)栓票。

必需的通知內容

Notification對象必須包含以下內容:

可選通知內容和設置

所有其他通知設置和內容都是可選的佛猛。如需了解有關它們的更多詳情,請參閱 NotificationCompat.Builder參考文檔坠狡。

通知操作

盡管通知操作都是可選的继找,但是您至少應向通知添加一個操作。 操作允許用戶直接從通知轉到應用中的 Activity逃沿,他們可在其中查看一個或多個事件或執(zhí)行進一步的操作婴渡。
一個通知可以提供多個操作。您應該始終定義一個當用戶點擊通知時會觸發(fā)的操作凯亮;通常边臼,此操作會在應用中打開 Activity。 您也可以向通知添加按鈕來執(zhí)行其他操作假消,例如柠并,暫停鬧鈴或立即答復短信;此功能自 Android 4.1 起可用富拗。如果使用其他操作按鈕臼予,則您還必須使這些按鈕的功能在應用的Activity
中可用;請參閱處理兼容性部分啃沪,以了解更多詳情粘拾。
Notification內部,操作本身由 PendingIntent定義谅阿,后者包含在應用中啟動 ActivityIntent半哟。要將 PendingIntent與手勢相關聯(lián),請調用NotificationCompat.Builder的適當方法签餐。例如寓涨,如果您要在用戶點擊抽屜式通知欄中的通知文本時啟動 Activity,則可通過調用setContentIntent()來添加 PendingIntent氯檐。
在用戶點擊通知時啟動 Activity是最常見的操作場景戒良。此外,您還可以在用戶清除通知時啟動 Activity冠摄。在 Android 4.1 及更高版本中糯崎,您可以通過操作按鈕啟動 Activity几缭。如需了解更多信息,請閱讀參考指南的 NotificationCompat.Builder部分沃呢。

通知優(yōu)先級

您可以根據需要設置通知的優(yōu)先級年栓。優(yōu)先級充當一個提示,提醒設備 UI 應該如何顯示通知薄霜。 要設置通知的優(yōu)先級某抓,請調用 NotificationCompat.Builder.setPriority()并傳入一個 NotificationCompat
優(yōu)先級常量。有五個優(yōu)先級別惰瓜,范圍從 PRIORITY_MIN(-2) 到 PRIORITY_MAX(2)否副;如果未設置,則優(yōu)先級默認為 PRIORITY_DEFAULT(0)崎坊。
有關設置適當優(yōu)先級別的信息备禀,請參閱通知設計指南中的“正確設置和管理通知優(yōu)先級”。

創(chuàng)建簡單通知

以下代碼段說明了一個指定某項 Activity 在用戶點擊通知時打開的簡單通知奈揍。 請注意曲尸,該代碼將創(chuàng)建 TaskStackBuilder對象并使用它來為操作創(chuàng)建PendingIntent啟動 Activity 時保留導航部分對此模式做了更詳盡的闡述:

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());

就這么簡單打月。您的用戶現已收到通知队腐。

將擴展布局應用于通知

要使通知出現在展開視圖中蚕捉,請先創(chuàng)建一個帶有所需普通視圖選項的 NotificationCompat.Builder
對象奏篙。接下來,調用以擴展布局對象作為其參數的 Builder.setStyle()迫淹。
請記住秘通,擴展通知在 Android 4.1 之前的平臺上不可用。要了解如何處理針對 Android 4.1 及更早版本平臺的通知敛熬,請閱讀處理兼容性部分肺稀。
例如,以下代碼段演示了如何更改在前面的代碼段中創(chuàng)建的通知应民,以便使用擴展布局:

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 < events.length; i++) {

    inboxStyle.addLine(events[i]);
}
// Moves the expanded layout object into the notification object.
mBuilder.setStyle(inBoxStyle);
...
// Issue the notification here.

處理兼容性

并非所有通知功能都可用于某特定版本,即便用于設置這些功能的方法位于支持庫類 NotificationCompat.Builder中也是如此。 例如啡氢,依賴于擴展通知的操作按鈕僅會顯示在 Android 4.1 及更高版本的系統(tǒng)中惑折,這是因為擴展通知本身僅在 Android 4.1 及更高版本的系統(tǒng)中可用。
為了確保最佳兼容性归园,請使用 NotificationCompat及其子類(特別是 NotificationCompat.Builder)創(chuàng)建通知黄虱。此外,在實現通知時庸诱,請遵循以下流程:

  1. 為所有用戶提供通知的全部功能捻浦,無論他們使用何種版本的 Android 系統(tǒng)晤揣。 為此,請驗證是否可從應用的 Activity中獲得所有功能朱灿。要執(zhí)行此操作昧识,您可能需要添加新的 Activity
    例如盗扒,若要使用 addAction()提供停止和啟動媒體播放的控件滞诺,請先在應用的 Activity中實現此控件。

  2. 確保所有用戶均可通過點擊通知啟動 Activity來獲得該Activity中的功能环疼。 為此习霹,請為 Activity創(chuàng)建 PendingIntent。調用 setContentIntent()以將 PendingIntent添加到通知炫隶。

  3. 現在淋叶,將要使用的擴展通知功能添加到通知。請記住伪阶,您添加的任何功能還必須在用戶點擊通知時啟動的 Activity中可用煞檩。

三、管理通知

當您需要為同一類型的事件多次發(fā)出同一通知時栅贴,應避免創(chuàng)建全新的通知斟湃, 而是應考慮通過更改之前通知的某些值和/或為其添加某些值來更新通知。
例如檐薯,Gmail 通過增加未讀消息計數并將每封電子郵件的摘要添加到通知凝赛,通知用戶收到了新的電子郵件。 這稱為“堆疊”通知坛缕;通知設計指南對此進行了更詳盡的描述墓猎。

注:**此 Gmail 功能需要“收件箱”擴展布局,該布局是自 Android 4.1 版本起可用的擴展通知功能的一部分赚楚。

下文介紹如何更新和刪除通知毙沾。

更新通知

要將通知設置為能夠更新,請通過調用 [NotificationManager.notify()](https://developer.android.com/reference/android/app/NotificationManager.html#notify(int, android.app.Notification))發(fā)出帶有通知 ID 的通知宠页。 要在發(fā)出之后更新此通知左胞,請更新或創(chuàng)建NotificationCompat.Builder對象,從該對象構建 Notification對象举户,并發(fā)出與之前所用 ID 相同的 Notification烤宙。如果之前的通知仍然可見,則系統(tǒng)會根據 Notification對象的內容更新該通知敛摘。相反门烂,如果之前的通知已被清除,系統(tǒng)則會創(chuàng)建一個新通知。
以下代碼段演示了經過更新以反映所發(fā)生事件數量的通知屯远。 它將通知堆疊并顯示摘要:

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());
...

刪除通知

除非發(fā)生以下情況之一蔓姚,否則通知仍然可見:

  • 用戶單獨或通過使用“全部清除”清除了該通知(如果通知可以清除)。
  • 用戶點擊通知慨丐,且您在創(chuàng)建通知時調用了 setAutoCancel()坡脐。
  • 您針對特定的通知 ID 調用了 cancel()。此方法還會刪除當前通知房揭。
  • 您調用了 cancelAll()方法备闲,該方法將刪除之前發(fā)出的所有通知。

四捅暴、啟動 Activity 時保留導航

從通知中啟動 Activity時恬砂,您必須保留用戶的預期導航體驗。 點擊“返回”應該使用戶將應用的正常工作流回退到主屏幕蓬痒,而點擊“最新動態(tài)”則應將Activity顯示為單獨的任務泻骤。 要保留導航體驗,您應該在全新任務中啟動 Activity梧奢。如何設置 PendingIntent以獲得全新任務取決于正在啟動的Activity的性質狱掂。一般有兩種情況:

常規(guī) Activity
您要啟動的 Activity是應用的正常工作流的一部分。在這種情況下亲轨,請設置 PendingIntent以啟動全新任務并為 PendingIntent提供返回棧趋惨,這將重現應用的正常“返回”行為惦蚊。
Gmail 應用中的通知演示了這一點器虾。點擊一封電子郵件消息的通知時,您將看到消息具體內容养筒。 觸摸返回將使您從 Gmail 回退到主屏幕曾撤,就好像您是從主屏幕(而不是通知)進入 Gmail 一樣端姚。
無論您觸摸通知時處于哪個應用晕粪,都會發(fā)生這種情況。 例如渐裸,如果您在 Gmail 中撰寫消息時點擊了一封電子郵件的通知巫湘,則會立即轉到該電子郵件。 **觸摸“返回”會依次轉到收件箱和主屏幕昏鹃,而不是轉到您在撰寫的郵件尚氛。

特殊 Activity
僅當從通知中啟動時,用戶才會看到此 Activity洞渤。 從某種意義上說阅嘶,Activity是通過提供很難顯示在通知本身中的信息來擴展通知。對于這種情況,請將 PendingIntent設置為在全新任務中啟動讯柔。但是抡蛙,由于啟動的 Activity不是應用 Activity 流程的一部分,因此無需創(chuàng)建返回棧魂迄。點擊“返回”仍會將用戶帶到主屏幕粗截。

設置常規(guī) Activity PendingIntent

要設置可啟動直接進入 ActivityPendingIntent,請執(zhí)行以下步驟:

  1. 在清單文件中定義應用的 Activity層次結構捣炬。
    a.添加對 Android 4.0.3 及更低版本的支持熊昌。為此,請通過添加 <meta-data>元素作為 <activity>
    的子項來指定正在啟動的 Activity的父項湿酸。對于此元素婿屹,請設置 android:name="android.support.PARENT_ACTIVITY"。 設置 android:value="<parent_activity_name>"推溃,其中选泻,<parent_activity_name>是父 <activity>元素的 android:name值。請參閱下面的 XML 示例美莫。
    b.同樣添加對 Android 4.1 及更高版本的支持页眯。為此,請將 android:parentActivityName屬性添加到正在啟動的 Activity<activity>元素中厢呵。

最終的 XML 應如下所示:

<activity
    android:name=".MainActivity"
    android:label="@string/app_name" >
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>
<activity
    android:name=".ResultActivity"
    android:parentActivityName=".MainActivity">
    <meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value=".MainActivity"/>
</activity>
  1. 根據可啟動 ActivityIntent創(chuàng)建返回棧:
    a.創(chuàng)建 Intent以啟動 Activity窝撵。
    b.通過調用 TaskStackBuilder.create()創(chuàng)建堆棧生成器。
    c.通過調用 addParentStack()將返回棧添加到堆棧生成器襟铭。 對于在清單文件中所定義層次結構內的每個 Activity碌奉,返回棧均包含可啟動 ActivityIntent對象。此方法還會添加一些可在全新任務中啟動堆棧的標志寒砖。
    注:盡管 addParentStack()的參數是對已啟動 Activity的引用赐劣,但是方法調用不會添加可啟動 ActivityIntent,而是留待下一步進行處理哩都。
    d.通過調用 addNextIntent()魁兼,添加可從通知中啟動 ActivityIntent。 將在第一步中創(chuàng)建的 Intent作為 addNextIntent()的參數傳遞漠嵌。
    e.如需咐汞,請通過調用 TaskStackBuilder.editIntentAt()向堆棧中的 Intent對象添加參數。有時儒鹿,需要確保目標 Activity在用戶使用“返回”導航回它時會顯示有意義的數據化撕。
    f.通過調用 getPendingIntent() 獲得此返回棧的 PendingIntent。 然后约炎,您可以使用此 PendingIntent作為 setContentIntent() 的參數植阴。
    以下代碼段演示了該流程:
...
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());

設置特殊 Activity PendingIntent

下文介紹如何設置特殊 Activity PendingIntent蟹瘾。
特殊 Activity無需返回棧,因此您不必在清單文件中定義其 Activity層次結構掠手,也不必調用 addParentStack()來構建返回棧热芹。取而代之的是,您可使用清單文件設置 Activity任務選項惨撇,并通過調用 getActivity()創(chuàng)建 PendingIntent

  1. 在清單文件中伊脓,將以下屬性添加到 Activity<activity>元素
    android:name="activityclass"
    Activity 的完全限定類名。
    android:taskAffinity=""
    與您在代碼中設置的 FLAG_ACTIVITY_NEW_TASK標志相結合魁衙,這可確保此 Activity不會進入應用的默認任務报腔。任何具有應用默認關聯(lián)的現有任務均不受影響。
    android:excludeFromRecents="true"
    將新任務從“最新動態(tài)”中排除剖淀,這樣用戶就不會在無意中導航回它纯蛾。
    以下代碼段顯示了該元素:
<activity
    android:name=".ResultActivity"
...
    android:launchMode="singleTask"
    android:taskAffinity=""
    android:excludeFromRecents="true">
</activity>
...
  1. 構建并發(fā)出通知:
    a.創(chuàng)建可啟動 ActivityIntent
    b.通過使用 FLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_CLEAR_TASK標志調用 setFlags()纵隔,將 Activity設置為在新的空任務中啟動翻诉。
    c.為 Intent設置所需的任何其他選項。
    d.通過調用 getActivity()從 Intent中創(chuàng)建 PendingIntent捌刮。 然后碰煌,您可以使用此 PendingIntent作為 setContentIntent()的參數。
    以下代碼段演示了該流程:
// 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());

五绅作、在通知中顯示進度

通知可能包括動畫形式的進度指示器芦圾,向用戶顯示正在進行的操作狀態(tài)。 如果您可以估計操作所需的時間以及任意時刻的完成進度俄认,則使用“限定”形式的指示器(進度欄)个少。 如果無法估計操作的時長,則使用“非限定”形式的指示器(Activity 指示器)眯杏。
平臺的 ProgressBar類實現中顯示有進度指示器夜焦。
要在 Android 4.0 及更高版本的平臺上使用進度指示器,需調用 setProgress()岂贩。對于早期版本茫经,您必須創(chuàng)建包括 ProgressBar視圖的自定義通知布局。
下文介紹如何使用 setProgress()在通知中顯示進度河闰。

顯示持續(xù)時間固定的進度指示器

要顯示限定形式的進度欄科平,請通過調用 setProgress(max, progress, false)將進度欄添加到通知,然后發(fā)出通知姜性。隨著操作繼續(xù)進行,遞增 progress并更新通知髓考。操作結束時部念, progress應該等于 max。調用 setProgress()的常見方法是將 max設置為 100,然后將 progress作為操作的“完成百分比”值遞增儡炼。
您可以在操作完成后仍保留顯示進度欄妓湘,也可以將其刪除。無論哪種情況乌询,都請記住更新通知文本以顯示操作已完成榜贴。 要刪除進度欄,請調用setProgress(0, 0, false)妹田。例如:

...
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() {
        @Override
        public void run() {
            int incr;
            // Do the "lengthy" operation 20 times
            for (incr = 0; incr <= 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();

顯示持續(xù) Activity 指示器

要顯示非限定形式的 Activity 指示器唬党,請使用 setProgress(0, 0, true)將其添加到通知(忽略前兩個參數),然后發(fā)出通知鬼佣。這樣一來驶拱,指示器的樣式就與進度欄相同,只是其動畫還在繼續(xù)晶衷。
在操作開始之際發(fā)出通知蓝纲。除非您修改通知,否則動畫將一直運行晌纫。 操作完成后税迷,調用 setProgress(0, 0, false),然后更新通知以刪除 Activity 指示器锹漱。 請務必這樣做翁狐;否則,即使操作完成凌蔬,動畫仍將運行露懒。同時,請記得更改通知文本砂心,以表明操作已完成懈词。
要了解 Activity 指示器的工作方式,請參閱上述代碼段辩诞。找到以下幾行:

// 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());

將找到的這幾行替換為以下幾行:

 // Sets an activity indicator for an operation of indeterminate length
mBuilder.setProgress(0, 0, true);
// Issues the notification
mNotifyManager.notify(0, mBuilder.build());

六坎弯、通知元數據

通知可根據您使用以下 NotificationCompat.Builder方法分配的元數據進行排序:

  • 當設備處于“優(yōu)先”模式時,setCategory()會告知系統(tǒng)如何處理應用通知(例如译暂,通知代表傳入呼叫抠忘、即時消息還是鬧鈴)。
  • 如果優(yōu)先級字段設置為 PRIORITY_MAX 或 PRIORITY_HIGH的通知還有聲音或振動外永,則 setPriority()會將其顯示在小型浮動窗口中崎脉。
  • addPerson()允許您向通知添加人員名單。您的應用可以使用此名單指示系統(tǒng)將指定人員發(fā)出的通知歸成一組伯顶,或者將這些人員發(fā)出的通知視為更重要的通知囚灼。

七骆膝、浮動通知

對于 Android 5.0(API 級別 21),當設備處于活動狀態(tài)時(即灶体,設備未鎖定且其屏幕已打開)阅签,通知可以顯示在小型浮動窗口中(也稱為“浮動通知”)。 這些通知看上去類似于精簡版的通知??蝎抽,只是浮動通知還顯示操作按鈕政钟。 用戶可以在不離開當前應用的情況下處理或清除浮動通知。

可能觸發(fā)浮動通知的條件示例包括:

  • 用戶的 Activity 處于全屏模式中(應用使用 fullScreenIntent)樟结,或者
  • 通知具有較高的優(yōu)先級并使用鈴聲或振動

八养交、鎖定屏幕通知

隨著 Android 5.0(API 級別 21)的發(fā)布,通知現在還可顯示在鎖定屏幕上狭吼。您的應用可以使用此功能提供媒體播放控件以及其他常用操作层坠。 用戶可以通過“設置”選擇是否將通知顯示在鎖定屏幕上,并且您可以指定您應用中的通知在鎖定屏幕上是否可見刁笙。

設置可見性

您的應用可以控制在安全鎖定屏幕上顯示的通知中可見的詳細級別破花。 調用 setVisibility()并指定以下值之一:

設置 VISIBILITY_PRIVATE后摘悴,您還可以提供其中隱藏了某些詳細信息的替換版本通知內容峭梳。例如,短信 應用可能會顯示一條通知蹂喻,指出“您有 3 條新短信”葱椭,但是隱藏了短信內容和發(fā)件人。**要提供此替換版本的通知口四,請先使用 NotificationCompat.Builder創(chuàng)建替換通知孵运。創(chuàng)建專用通知對象時,請通過setPublicVersion()方法為其附加替換通知蔓彩。

在鎖定屏幕上控制媒體播放

在 Android 5.0(API 級別 21)中治笨,鎖定屏幕不再基于 RemoteControlClient(現已棄用)顯示媒體控件。取而代之的是赤嚼,將 Notification.MediaStyle模板與 addAction() 方法結合使用旷赖,后者可將操作轉換為可點擊的圖標。

注:該模板和 addAction()方法未包含在支持庫中更卒,因此這些功能只能在 Android 5.0 及更高版本的系統(tǒng)上運行等孵。

要在 Android 5.0 系統(tǒng)的鎖定屏幕上顯示媒體播放控件,請將可見性設置為 VISIBILITY_PUBLIC
逞壁,如上文所述流济。然后锐锣,添加操作并設置Notification.MediaStyle模板腌闯,如以下示例代碼中所述:

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();

注:棄用 RemoteControlClient會對控制媒體產生進一步的影響绳瘟。如需了解有關用于管理媒體會話和控制播放的新 API 的詳細信息,請參閱媒體播放控件姿骏。

九糖声、自定義通知布局

您可以利用通知框架定義自定義通知布局,由該布局定義通知在 RemoteViews對象中的外觀分瘦。 自定義布局通知類似于常規(guī)通知蘸泻,但是它們是基于 XML 布局文件中所定義的 RemoteViews
自定義通知布局的可用高度取決于通知視圖嘲玫。普通視圖布局限制為 64 dp悦施,擴展視圖布局限制為 256 dp。
要定義自定義通知布局去团,請首先實例化 RemoteViews對象來擴充 XML 布局文件抡诞。然后,調用 setContent()土陪,而不是調用 setContentTitle()等方法昼汗。要在自定義通知中設置內容詳細信息,請使用 RemoteViews中的方法設置視圖子項的值:

  1. 在單獨的文件中為通知創(chuàng)建 XML 布局鬼雀。您可以根據需要使用任何文件名顷窒,但必須使用擴展名 .xml。
  2. 在您的應用中源哩,使用 RemoteViews方法定義通知的圖標和文本鞋吉。通過調用 setContent()將此 RemoteViews對象放入 NotificationCompat.Builder中。避免在 RemoteViews對象上設置背景 Drawable励烦,因為文本顏色可能使文本變得難以閱讀谓着。

此外,RemoteViews類中還有一些方法可供您輕松將 ChronometerProgressBar添加到通知布局崩侠。如需了解有關為通知創(chuàng)建自定義布局的詳細信息漆魔,請參閱 RemoteViews參考文檔。

注意:使用自定義通知布局時却音,要特別注意確保自定義布局適用于不同的設備方向和分辨率改抡。 盡管這條建議適用于所有“視圖”布局,但對通知尤為重要系瓢,因為抽屜式通知欄中的空間非常有限阿纤。 不要讓自定義布局過于復雜,同時確保在各種配置中對其進行測試夷陋。

對自定義通知文本使用樣式資源

始終對自定義通知的文本使用樣式資源欠拾。通知的背景顏色可能因設備和系統(tǒng)版本的不同而異胰锌,使用樣式資源有助于您充分考慮到這一點。 從 Android 2.3 開始藐窄,系統(tǒng)定義了標準通知布局文本的樣式资昧。若要在面向 Android 2.3 或更高版本系統(tǒng)的多個應用中使用相同樣式,則應確保文本在顯示背景上可見荆忍。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末格带,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子刹枉,更是在濱河造成了極大的恐慌叽唱,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件微宝,死亡現場離奇詭異棺亭,居然都是意外死亡,警方通過查閱死者的電腦和手機蟋软,發(fā)現死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門镶摘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钟鸵,你說我怎么就攤上這事钉稍。” “怎么了棺耍?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵贡未,是天一觀的道長。 經常有香客問我蒙袍,道長俊卤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任害幅,我火速辦了婚禮消恍,結果婚禮上,老公的妹妹穿的比我還像新娘以现。我一直安慰自己狠怨,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布邑遏。 她就那樣靜靜地躺著佣赖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪记盒。 梳的紋絲不亂的頭發(fā)上憎蛤,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音,去河邊找鬼俩檬。 笑死萎胰,一個胖子當著我的面吹牛,可吹牛的內容都是我干的棚辽。 我是一名探鬼主播技竟,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼晚胡!你這毒婦竟也來了灵奖?” 一聲冷哼從身側響起嚼沿,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤估盘,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后骡尽,有當地人在樹林里發(fā)現了一具尸體遣妥,經...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年攀细,在試婚紗的時候發(fā)現自己被綠了箫踩。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡谭贪,死狀恐怖境钟,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情俭识,我是刑警寧澤慨削,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站套媚,受9級特大地震影響缚态,放射性物質發(fā)生泄漏。R本人自食惡果不足惜堤瘤,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一玫芦、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧本辐,春花似錦桥帆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至宝冕,卻和暖如春张遭,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背地梨。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工菊卷, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留缔恳,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓洁闰,卻偏偏與公主長得像歉甚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扑眉,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內容

  • 原文出處: http://www.androidchina.net/6174.html Notification在...
    木木00閱讀 12,328評論 3 32
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,163評論 25 707
  • 轉載自:http://blog.csdn.net/vipzjyno1/article/details/252480...
    HEXG_閱讀 5,842評論 0 2
  • 第一次聽說這個朝代是從我奶奶嘴里纸泄,那時候覺得她知識淵博,隨口就能說出唐宋元明清這樣的朝代更替腰素。后來上了中學聘裁,老師告...
    瓦萊閱讀 335評論 1 1
  • 睡前回憶今天,那些事可以不做弓千,浪費了時間衡便。 你總是輕易的放過自己。真正的對手洋访,只有自己镣陕。
    cleddie閱讀 195評論 0 0