[TOC]
一、什么是通知Notification?
Notification翻譯過來就是:Android系統(tǒng)中的Notification
在Android系統(tǒng)中指 Android 在應(yīng)用界面之外顯示的消息,旨在向用戶提供提醒、來自他人的通信或您的應(yīng)用中的其他實時信息。用戶可以點按通知以打開您的應(yīng)用,也可以直接從通知中執(zhí)行操作。
樣式如下:
Android中通知Notification的組成
- 主要內(nèi)容:這是通知中最突出的元素。次要信息(例如時間戳)較小并合并在主要內(nèi)容之上。
- 人物:如果通知涉及人物,則頭像會從其余內(nèi)容中脫穎而出。
-
操作:用戶可以通過點擊指示器圖標(biāo)來展開通知。操作以單獨的背景顏色和位置上的文本標(biāo)簽顯示。
折疊通知
通知的標(biāo)題和內(nèi)容
折疊時,通知會顯示應(yīng)用程序圖標(biāo)、標(biāo)題文本、時間戳、展開指示器和內(nèi)容文本。它還可以選擇顯示一個大圖標(biāo)。
1 應(yīng)用程序圖標(biāo):應(yīng)用程序圖標(biāo)是應(yīng)用程序身份的二維表示。它以單色顯示在狀態(tài)欄中。如果您的應(yīng)用程序發(fā)送多種通知,請考慮將應(yīng)用程序圖標(biāo)替換為符號以區(qū)分不同類型的通知。有關(guān)詳細(xì)信息,請參閱應(yīng)用圖標(biāo)顏色。此為必要圖標(biāo),通過 setSmallIcon() 設(shè)置。
2 標(biāo)題文本:通知或來源的簡短標(biāo)題,例如用戶的帳戶名稱。內(nèi)容是通知中最突出的元素。由系統(tǒng)提供。
3 時間戳:指示發(fā)送通知的時間,例如未接來電的時間。由系統(tǒng)提供。
4 展開指示器:指示通知處于折疊狀態(tài)還是展開狀態(tài)。
5 內(nèi)容文本:支持信息。此為可選內(nèi)容,通過 setContentText() 設(shè)置。
6 大圖標(biāo)(可選):可以添加圖像以有意義的方式強(qiáng)化通知,例如包含發(fā)件人頭像的消息。通過 setLargeIcon() 設(shè)置
1文本按鈕操作
2填充操作按鈕
3建議回復(fù)
4回復(fù)文本字段
從 Android 7.0(API 級別 24)開始,系統(tǒng)顯示不帶圖標(biāo)的操作以容納更多文本。為了適應(yīng) Android Wear 設(shè)備以及運(yùn)行 Android 6.0(API 級別 23)及更低版本的設(shè)備,您的應(yīng)用程序仍必須提供應(yīng)用圖標(biāo)。
擴(kuò)展視圖
可以使用擴(kuò)展視圖向用戶顯示更多信息,而無需離開通知。
展開后,通知最多可以提供以下任意操作中的三種:
- 建議回復(fù)
- 強(qiáng)調(diào)動作(藥丸狀按鈕)
-
標(biāo)準(zhǔn)文本操作
錯誤示例:包括復(fù)制點擊通知正文行為的文本操作。
可輸入回復(fù)的通知
可以通過包含回復(fù)操作來讓用戶直接在通知中鍵入內(nèi)容。這是專為輸入少量文本而設(shè)計的,例如回復(fù)短信或記下簡短的筆記。
對于較長格式的輸入,請將用戶導(dǎo)航到您的應(yīng)用程序,為他們提供更多空間來查看和編輯文本。
對于消息傳遞應(yīng)用程序,我們建議在用戶發(fā)送回復(fù)后保留通知,并等到對話暫停后再自動關(guān)閉通知。
二、通知Notification的作用
- 考慮通知的目的:為什么要提醒用戶?提高用戶粘性?還是為了有重要的消息通知到用戶?促銷?。。。why?
- 確定通知權(quán)限模式,考慮通知對您的應(yīng)用程序的重要性以及在用戶使用過程中的何處詢問。
- 選擇合適的通知模板樣式。
- 創(chuàng)建通知:
1.標(biāo)題文本應(yīng)簡潔地總結(jié)通知。
2.內(nèi)容文本應(yīng)預(yù)覽通知。
3.圖片(可選內(nèi)容)。
4.媒體模板的媒體關(guān)鍵藝術(shù)和元數(shù)據(jù)。(例如音樂播放)
- 通過使用文本按鈕、打字或媒體控件根據(jù)用戶的內(nèi)容提供操作,讓用戶清楚地了解用戶可以使用通知執(zhí)行哪些操作。
- 包含您的應(yīng)用程序圖標(biāo)并設(shè)置應(yīng)用程序圖標(biāo)背景顏色。
- 設(shè)置通知的渠道和類別。這允許系統(tǒng)和您的用戶自定義他們接收的通知并提供優(yōu)先級。
- 如果您的應(yīng)用程序可能會同時發(fā)送多個通知,請對通知進(jìn)行分組。
- 查看Figma 上的 Android UI Kit以獲取通知模板。
三、通知Notification的類型和樣式
標(biāo)準(zhǔn)模板
標(biāo)準(zhǔn)模板適用于大多數(shù)通知,允許簡潔的文本、大圖標(biāo)(如果適用)和操作。
大文本模板
大文本模板非常適合顯示較長的文本塊。它允許用戶在展開通知后預(yù)覽更多文本。
大圖片模板
大圖片模板專為包含圖像的通知而設(shè)計。折疊時,通知會顯示圖片的大圖標(biāo)縮略圖。展開后,通知會顯示更大的預(yù)覽。
進(jìn)度模板
進(jìn)度模板專為用戶發(fā)起的需要時間才能完成的活動而設(shè)計。展開時,使用此模板的通知會顯示進(jìn)度條,并且還包括允許用戶終止此活動的“取消”操作。(不可取消的活動不需要通知。)
媒體模板
媒體模板旨在讓用戶控制當(dāng)前從應(yīng)用程序播放的媒體。
折疊時,通知最多可以顯示三個操作。大圖標(biāo)可以顯示相關(guān)圖像,例如專輯封面。
展開后,通知將顯示最多五個帶有較大圖像的操作,或六個沒有圖像的操作。通知的背景和其他元素自動繼承圖像的顏色。
注意:要使您的播放器應(yīng)用程序出現(xiàn)在快速設(shè)置區(qū)域中,請使用有效的 MediaSession 令牌創(chuàng)建 MediaStyle 通知。有關(guān)詳細(xì)信息,請參閱媒體控件 。
消息模板
MessagingStyle模板專為實時通信而設(shè)計。展開后,使用此模板的通知允許用戶從通知內(nèi)回復(fù)消息。
調(diào)用模板
使用CallStyle模板生成大格式通知,其中包括大圖像附件并指示傳入或傳出呼叫。
四、通知Notification的行為和處理
通知到達(dá)
當(dāng)通知到達(dá)時,Android 將其添加到通知抽屜中。根據(jù)您設(shè)置的參數(shù)和設(shè)備的當(dāng)前狀態(tài),通知可能會執(zhí)行以下任一操作:
發(fā)出聲音或引起手機(jī)振動。
在狀態(tài)欄中以圖標(biāo)顯示;這通常是您的應(yīng)用程序圖標(biāo),但如果您有多種類型的通知,請使用能夠捕獲通知用途的符號。
-
顯示為平視通知,查看當(dāng)前屏幕以吸引用戶的注意力。
與往常一樣,用戶可以選擇更改您設(shè)置的通知行為。
通知到達(dá) 1狀態(tài)欄中的通知指示器,指示通知抽屜中有通知。
2通知“窺視”當(dāng)前屏幕以在任務(wù)過程中吸引用戶的注意力。
通知抽屜
Android 中的通知抽屜通常按時間倒序顯示通知,并受以下條件影響進(jìn)行調(diào)整:
- 應(yīng)用程序聲明的通知優(yōu)先級或重要性
通知最近是否通過聲音或振動提醒用戶
通知中附加的任何人員以及他們是否是已加星標(biāo)的聯(lián)系人
通知是否代表正在進(jìn)行的重要活動,例如正在進(jìn)行的通話或音樂播放
通過添加強(qiáng)調(diào)或取消強(qiáng)調(diào),Android 操作系統(tǒng)更改了列表頂部和底部的某些通知的外觀,這有助于用戶掃描內(nèi)容
處理過時的通知
通知抽屜旨在向用戶顯示與當(dāng)前時刻相關(guān)的信息。如果較早的通知已過時(即不再相關(guān)),請將其忽略,以便用戶看不到它。
在運(yùn)行 Android 8.0(API 級別 26)及更高版本的設(shè)備上受支持的啟動器中,應(yīng)用程序圖標(biāo)會顯示一個通知點,以指示該應(yīng)用程序有與之關(guān)聯(lián)的新通知。這些點默認(rèn)出現(xiàn)在支持它們的啟動器應(yīng)用程序中,并且您的應(yīng)用程序不需要執(zhí)行任何操作。啟動圖標(biāo)上的小紅點也可以被禁用和限制。
由應(yīng)用程序啟動圖標(biāo)顯示的新通知
通知可以使用戶執(zhí)行以下任意操作:
導(dǎo)航到目的地:要進(jìn)行導(dǎo)航,用戶可以點擊通知。如果通知顯示在鎖定屏幕上,用戶需要雙擊它,然后輸入 PIN、圖案或密碼。當(dāng)用戶點擊通知時,您的應(yīng)用程序必須顯示與該通知直接相關(guān)的 UI,并讓用戶立即采取操作。例如,如果通知顯示輪到他們參加兩人游戲,則點擊通知應(yīng)將他們直接帶到該游戲。
-
查看通知的展開視圖:標(biāo)題中出現(xiàn)展開指示符。用戶可以點擊指示器或向下滑動通知正文以將其展開。
擴(kuò)展通知
- 關(guān)閉通知(如果允許):用戶可以通過向左或向右滑動來關(guān)閉它。
指示后臺持續(xù)進(jìn)程(例如音樂播放)的持續(xù)通知可能無法通過滑動來消除。
暫停平視通知:用戶可以向上滑動平視通知,并且不允許該事件的進(jìn)一步通知在一分鐘內(nèi)閃爍。
-
控制將來的類似通知:用戶可以通過以下方式訪問通知控件:
- 觸摸并按住單個通知
- 向左或向右滑動通知,然后點擊設(shè)置圖標(biāo)
將多個通知分組
對于生成多個相同類型通知的應(yīng)用程序,Android 提供通知分組以避免用戶不知所措。
您的應(yīng)用程序可以根據(jù)以下層次結(jié)構(gòu)呈現(xiàn)多個通知。
- 父通知顯示其子通知的摘要。
- 如果用戶展開父通知,Android 將顯示所有子通知。
- 用戶可以展開子通知以顯示其全部內(nèi)容。
Android 呈現(xiàn)沒有重復(fù)標(biāo)頭信息的子通知。例如,如果子通知與其父通知具有相同的應(yīng)用程序圖標(biāo),則子通知的標(biāo)題不包含圖標(biāo)。
如果子通知單獨出現(xiàn),則必須易于理解,因為當(dāng)它們到達(dá)時,系統(tǒng)可能會將它們顯示在組之外。
五、通知的設(shè)置
渠道
從 Android 8.0(API 級別 26)開始,所有通知都必須分配給一個通道。對于每個通道,您可以設(shè)置應(yīng)用于該通道中所有通知的視覺和聽覺行為。用戶可以更改這些設(shè)置并決定應(yīng)用程序中的哪些通知渠道可以是侵入性的或可見的。
注意:用戶界面將通知渠道稱為“類別”。
創(chuàng)建通知通道后,您將無法更改通知行為。此時用戶擁有完全控制權(quán)。但是,您仍然可以更改頻道的名稱和描述。
為您需要發(fā)送的每種類型的通知創(chuàng)建一個通道。您還可以創(chuàng)建通知渠道來反映用戶所做的選擇。例如,您可以為用戶在消息應(yīng)用程序中創(chuàng)建的每個對話組設(shè)置單獨的通知渠道。
注意:如果您以 Android 8.0(API 級別 26)或更高版本為目標(biāo)并在未指定通知渠道的情況下發(fā)布通知,則不會顯示通知,并且系統(tǒng)會記錄錯誤。
當(dāng)您以 Android 8.0(API 級別 26)或更高版本為目標(biāo)時,您必須實現(xiàn)一個或多個通知渠道。如果targetSdkVersion設(shè)置為 25 或更低,則當(dāng)您的應(yīng)用在 Android 8.0(API 級別 26)或更高版本上運(yùn)行時,其行為與運(yùn)行 Android 7.1(API 級別 25)或更低版本的設(shè)備上的行為相同。
注意:從 Android 8.0(API 級別 26)開始,您可以在開發(fā)設(shè)備上打開一項設(shè)置,以在針對 Android 8.0(API 級別 26)或更高版本的應(yīng)用嘗試發(fā)布消息時顯示屏幕警告,該警告顯示為 Toast沒有通知渠道。要打開運(yùn)行 Android 8.0(API 級別 26)或更高版本的開發(fā)設(shè)備的設(shè)置,請導(dǎo)航至設(shè)置>開發(fā)人員選項并啟用 顯示通知通道警告。
創(chuàng)建通知通道
- 構(gòu)造一個
NotificationChannel
具有唯一通道 ID、用戶可見名稱和重要性級別的對象。
選擇重要性時應(yīng)考慮用戶的時間和注意力。當(dāng)不重要的通知被偽裝成緊急時,可能會產(chǎn)生不必要的警報。
(可選)指定用戶在系統(tǒng)設(shè)置中看到的描述
setDescription()
。通過將通知通道傳遞給 來注冊通知通道
createNotificationChannel()
。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
// Create the NotificationChannel.
val name = getString(R.string.channel_name)
val descriptionText = getString(R.string.channel_description)
val importance = NotificationManager.IMPORTANCE_DEFAULT
val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
mChannel.description = descriptionText
// Register the channel with the system. You can't change the importance
// or other notification behaviors after this.
val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(mChannel)
}
使用原始值重新創(chuàng)建現(xiàn)有通知通道不會執(zhí)行任何操作,因此在啟動應(yīng)用程序時調(diào)用此代碼是安全的。
默認(rèn)情況下,發(fā)布到給定通道的所有通知都使用由類的重要性級別定義的視覺和聽覺行為 NotificationManagerCompat
,例如 IMPORTANCE_DEFAULT
或 IMPORTANCE_HIGH
。有關(guān)重要性級別的詳細(xì)信息,請參閱下一節(jié) 。
如果您想進(jìn)一步自定義頻道的默認(rèn)通知行為,您可以 在 上調(diào)用enableLights()
、 setLightColor()
、 和 等 方法。請記住,一旦創(chuàng)建了頻道,就無法更改這些設(shè)置,并且用戶對這些行為是否處于活動狀態(tài)擁有最終控制權(quán)。setVibrationPattern()
NotificationChannel
您還可以通過調(diào)用在單個操作中創(chuàng)建多個通知通道 createNotificationChannels()
。
注意:除了將每個通知添加到特定于應(yīng)用程序的渠道之外,還可以考慮將每個通知添加到 系統(tǒng)范圍的類別之一,例如
CATEGORY_ALARM
或CATEGORY_REMINDER
。
設(shè)置重要性級別
用戶可見的重要性級別 | 重要性(Android 8.0 及更高版本) | 優(yōu)先級(Android 7.1 及更低版本) |
---|---|---|
緊急發(fā)出聲音并顯示為平視通知。 | IMPORTANCE_HIGH |
PRIORITY_HIGH 或者PRIORITY_MAX
|
高發(fā)出聲音。 | IMPORTANCE_DEFAULT |
PRIORITY_DEFAULT |
中不發(fā)出聲音。 | IMPORTANCE_LOW |
PRIORITY_LOW |
低不發(fā)出聲音并且不會出現(xiàn)在狀態(tài)欄中。 | IMPORTANCE_MIN |
PRIORITY_MIN |
無不發(fā)出聲音,并且不會出現(xiàn)在狀態(tài)欄或陰影中。 | IMPORTANCE_NONE |
N/A |
所有通知,無論重要性如何,都會顯示在不間斷的系統(tǒng) UI 位置,例如通知抽屜中以及作為 啟動器圖標(biāo)上的徽章,盡管您可以 修改通知徽章的外觀。
一旦您將頻道提交到 NotificationManager
,您就無法更改重要性級別。但是,用戶可以隨時更改他們對應(yīng)用頻道的偏好。
有關(guān)選擇適當(dāng)優(yōu)先級的信息,請參閱 通知設(shè)計指南中的“優(yōu)先級” 。
讀取通知通道設(shè)置
用戶可以修改通知渠道的設(shè)置,包括振動和警報聲音等行為。如果您想了解用戶應(yīng)用于您的通知渠道的設(shè)置,請按照以下步驟操作:
NotificationChannel
通過調(diào)用getNotificationChannel()
或 獲取對象getNotificationChannels()
。查詢具體通道設(shè)置,如
getVibrationPattern()
、getSound()
、 、getImportance()
。
如果您檢測到您認(rèn)為某個頻道設(shè)置會抑制應(yīng)用程序的預(yù)期行為,您可以建議用戶更改它并提供打開頻道設(shè)置的操作,如下一節(jié)所示。
打開通知通道設(shè)置
創(chuàng)建通知通道后,您無法以編程方式更改通知通道的視覺和聽覺行為。只有用戶可以從系統(tǒng)設(shè)置更改通道行為。為了讓您的用戶能夠輕松訪問這些通知設(shè)置,請在應(yīng)用程序的 設(shè)置 UI中添加一個可打開這些系統(tǒng)設(shè)置的項目。
Intent
您可以使用使用該 操作的 來打開通知渠道的系統(tǒng)設(shè)置 ACTION_CHANNEL_NOTIFICATION_SETTINGS
。
例如,以下示例代碼顯示如何將用戶重定向到通知通道的設(shè)置:
val intent = Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
putExtra(Settings.EXTRA_CHANNEL_ID, myNotificationChannel.getId())
}
startActivity(intent)
請注意,意圖需要兩個額外的內(nèi)容來指定應(yīng)用程序的包名稱(也稱為應(yīng)用程序 ID)和要編輯的通道。
刪除通知渠道
您可以通過調(diào)用 來刪除通知渠道 deleteNotificationChannel()
。以下示例代碼演示了如何完成此過程:
// The id of the channel.
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val id: String = "my_channel_01"
notificationManager.deleteNotificationChannel(id)
注意:通知設(shè)置屏幕顯示已刪除頻道的數(shù)量,作為垃圾郵件預(yù)防機(jī)制。您可以通過重新安裝應(yīng)用程序或清除與應(yīng)用程序副本關(guān)聯(lián)的數(shù)據(jù)來清除開發(fā)設(shè)備上的測試通道。
創(chuàng)建通知通道組
如果想要在設(shè)置 UI 中進(jìn)一步組織頻道的外觀,您可以創(chuàng)建頻道組。當(dāng)您的應(yīng)用程序支持多個用戶帳戶(例如 工作配置文件)時,這是一個好主意,因為它允許您為每個帳戶創(chuàng)建一個通知渠道組。這樣,用戶可以輕松識別和控制具有相同名稱的多個通知通道。
例如,社交網(wǎng)絡(luò)應(yīng)用程序可能包括對個人和工作帳戶的支持。在這種情況下,每個帳戶可能需要多個具有相同功能和名稱的通知通道,如下所示:
一個個人賬戶有兩個渠道:
新評論
帖子推薦
具有兩個渠道的企業(yè)帳戶:
新評論
帖子推薦
將每個帳戶的通知渠道分組可以讓用戶區(qū)分它們。
每個通知通道組都需要一個 ID(該 ID 在您的包中必須是唯一的)以及用戶可見的名稱。以下代碼片段演示了如何創(chuàng)建通知通道組。
// The id of the group.
val groupId = "my_group_01"
// The user-visible name of the group.
val groupName = getString(R.string.group_name)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannelGroup(NotificationChannelGroup(groupId, groupName))
創(chuàng)建新組后,您可以調(diào)用 setGroup()
將新NotificationChannel
對象與該組關(guān)聯(lián)。
將通道提交給通知管理器后,您將無法更改通知通道和組之間的關(guān)聯(lián)。
預(yù)定義渠道類型
無論您是否使用渠道,都可以將每個單獨的通知分配到最合適的預(yù)定義類別。Android 可能會使用此信息來做出排名和過濾決策。
類別 | 描述 |
---|---|
CATEGORY_CALL | 來電(語音或視頻)或類似的同步通信請求 |
CATEGORY_MESSAGE | 傳入的直接消息(短信、即時消息等) |
CATEGORY_EMAIL | 異步批量消息(電子郵件) |
CATEGORY_EVENT | 日歷事件 |
CATEGORY_PROMO | 促銷或廣告 |
CATEGORY_ALARM | 鬧鐘或定時器 |
CATEGORY_PROGRESS | 長時間運(yùn)行的后臺操作的進(jìn)度 |
CATEGORY_SOCIAL | 社交網(wǎng)絡(luò)或分享更新 |
CATEGORY_ERROR | 后臺操作或認(rèn)證狀態(tài)錯誤 |
CATEGORY_TRANSPORT | 用于播放的媒體傳輸控制 |
CATEGORY_SYSTEM | 系統(tǒng)或設(shè)備狀態(tài)更新。保留供系統(tǒng)使用。 |
CATEGORY_SERVICE | 后臺服務(wù)運(yùn)行指示 |
CATEGORY_RECOMMENDATION | 對單一事物的具體、及時的建議。例如,新聞應(yīng)用程序可能會推薦用戶接下來可能想閱讀的新聞報道。 |
CATEGORY_STATUS | 有關(guān)設(shè)備或上下文狀態(tài)的持續(xù)信息 |
六、鎖屏通知
如果用戶選擇在屏幕鎖定時顯示通知,這些通知可以隱藏您的應(yīng)用標(biāo)記為敏感的任何內(nèi)容。Android 會評估每個通知的可見性級別,以確定可以安全顯示的內(nèi)容。
設(shè)置鎖定屏幕上內(nèi)容的敏感度級別
用戶隱私至關(guān)重要,因此請注意,鎖定屏幕上可以看到不同級別的通知。對于您創(chuàng)建的每個通知,您必須將可見性級別設(shè)置為public
、private
或Secret
。
Level | 場景 |
---|---|
public |
公共通知在安全鎖定屏幕上完全可見。 |
private |
秘密通知被隱藏敏感內(nèi)容。 |
Secret |
不會展示 |
私人通知位于中間:它們僅顯示基本信息,包括發(fā)布它的應(yīng)用程序的名稱及其圖標(biāo)。您可以選擇顯示不泄露個人信息的文本,例如 ,而不是隱藏的常規(guī)內(nèi)容2 new messages。
在以下示例中,Gmail 和照片應(yīng)用程序的鎖定屏幕通知會在用戶選擇在鎖定屏幕上顯示此信息后顯示所有內(nèi)容。
1鎖屏顯示所有通知內(nèi)容
2鎖屏隱藏敏感通知內(nèi)容
七、通知的樣式建議
文字清晰簡潔
Android 將內(nèi)容標(biāo)題截斷為一行(即使在展開時)。
一個好的內(nèi)容標(biāo)題遵循以下準(zhǔn)則:
- 不超過30個字符
- 包含最重要的信息
- 避免變量(除非它們包含數(shù)字或短文本字符串,或者前面有文本)
- 排除已經(jīng)出現(xiàn)在標(biāo)題中的應(yīng)用程序名稱
好的內(nèi)容文本遵循以下準(zhǔn)則:
- 避免超過 40 個字符的限制
- 避免重復(fù)內(nèi)容標(biāo)題中的內(nèi)容
大圖標(biāo)
對于圖像能夠有效強(qiáng)化通知內(nèi)容的用例,請使用大圖標(biāo)。一些例子是:
- 來自另一個人的通信,例如某人發(fā)送消息的圖像
- 內(nèi)容來源(如果與發(fā)送通知的應(yīng)用程序不同),例如用戶訂閱的 YouTube 頻道的徽標(biāo)
-
有關(guān)通知的有意義的符號,例如表示行車路線的箭頭符號
大圖標(biāo)在顯示人物時必須是圓形的,但在所有其他情況下必須是方形的。
使用大圖標(biāo)進(jìn)行品牌推廣。
八、通知運(yùn)行時權(quán)限
Android 13(API 級別 33)及更高 版本支持從應(yīng)用 發(fā)送 非豁免POST_NOTIFICATIONS
(包括前臺服務(wù) (FGS))通知的運(yùn)行時權(quán)限: 。此更改可幫助用戶專注于對他們來說最重要的通知。
如果繼續(xù)以 12L(API 級別 32)或更低為目標(biāo),則在應(yīng)用程序功能的上下文中請求權(quán)限時會失去一些靈活性。
注意:應(yīng)用程序不需要請求POST_NOTIFICATIONS權(quán)限即可啟動前臺服務(wù)。但是,應(yīng)用程序在啟動前臺服務(wù)時必須包含通知,就像在以前版本的 Android 上一樣。
權(quán)限聲明
<manifest ...>
<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>
<application ...>
...
</application>
</manifest>
應(yīng)用程序功能取決于用戶在權(quán)限對話框中的選擇
在此對話框中,用戶可以執(zhí)行以下操作:
以下部分根據(jù)用戶執(zhí)行的操作描述您的應(yīng)用程序的行為方式。
用戶選擇“允許”
如果用戶選擇允許選項,您的應(yīng)用程序可以執(zhí)行以下操作:
- 發(fā)送通知。 允許所有 通知渠道。
- 發(fā)布與前臺服務(wù)相關(guān)的通知。這些通知出現(xiàn)在 通知抽屜中。
用戶選擇“不允許”
如果用戶選擇不允許選項,您的應(yīng)用將無法發(fā)送通知,除非它符合豁免條件。除少數(shù)特定角色外,所有通知渠道均被阻止。這類似于用戶在系統(tǒng)設(shè)置中手動關(guān)閉應(yīng)用程序的所有通知時發(fā)生的行為。
注意:如果您的應(yīng)用程序以 12L 或更低版本為目標(biāo),并且用戶點擊“不允許”,即使只點擊一次,也不會再次提示他們,直到發(fā)生以下情況之一:
- 用戶卸載并重新安裝您的應(yīng)用程序。
- 您將應(yīng)用更新為面向 Android 13 或更高版本。
用戶滑離對話框
如果用戶從對話框上滑開(即,他們沒有選擇 允許或不允許),則通知權(quán)限的狀態(tài)不會更改。
對新安裝的應(yīng)用的影響
如果用戶在搭載 Android 13 或更高版本的設(shè)備上安裝您的應(yīng)用,應(yīng)用的通知默認(rèn)處于關(guān)閉狀態(tài)
。在您請求新權(quán)限且用戶向您的應(yīng)用授予該權(quán)限之前,您的應(yīng)用必須等待系統(tǒng)發(fā)送通知。
權(quán)限對話框的顯示時間取決于應(yīng)用的目標(biāo) SDK 版本:
- 如果您的應(yīng)用以 Android 13 或更高版本為目標(biāo)平臺,應(yīng)用將可以完全自行控制權(quán)限對話框的顯示時間。您可以借此機(jī)會向用戶說明應(yīng)用需要此權(quán)限的原因,進(jìn)而鼓勵他們授予該權(quán)限。
- 如果您的應(yīng)用以 12L(API 級別 32)或更低版本為目標(biāo)平臺,在您創(chuàng)建通知渠道后您的應(yīng)用首次啟動 activity 時,或在您的應(yīng)用啟動一個 activity,然后創(chuàng)建它的第一個通知渠道時,系統(tǒng)會顯示該權(quán)限對話框。這通常是在應(yīng)用啟動時。
對現(xiàn)有應(yīng)用更新的影響
為了最大限度地減少與通知權(quán)限相關(guān)的中斷,當(dāng)用戶將其設(shè)備升級到 Android 13 或更高版本后,系統(tǒng)會自動向所有符合條件的應(yīng)用預(yù)先授予相應(yīng)權(quán)限。換言之,這些應(yīng)用可以繼續(xù)向用戶發(fā)送通知,而用戶不會看到運(yùn)行時權(quán)限提示。
注意:請考慮下面這種情形,即符合條件的應(yīng)用安裝在搭載 12L 或更低版本的舊設(shè)備上,用戶在該設(shè)備上允許接收通知,但想淘汰該設(shè)備。用戶現(xiàn)在有了搭載 Android 13 或更高版本的新設(shè)備,并通過備份和恢復(fù)功能恢復(fù)了應(yīng)用。
在這種情況下,系統(tǒng)會將您的應(yīng)用視為“現(xiàn)有應(yīng)用”,因此系統(tǒng)會自動向您的應(yīng)用授予相應(yīng)權(quán)限,以便您的應(yīng)用可以繼續(xù)發(fā)送通知。
預(yù)先授予權(quán)限的資格條件
您的應(yīng)用要獲得自動預(yù)先授權(quán)必須滿足以下條件:應(yīng)用必須已具有通知渠道,并且用戶未在搭載 12L 或更低版本的設(shè)備上明確停用應(yīng)用的通知。
如果用戶在搭載 12L 或更低版本的設(shè)備上停用了應(yīng)用的通知,當(dāng)設(shè)備升級到 Android 13 或更高版本后,該停用會繼續(xù)有效。
豁免
此部分列出了一些不受通知權(quán)限行為變更影響的通知和應(yīng)用。在 Android 13(API 級別 33)或更高版本中,如果用戶拒絕授予通知權(quán)限,他們?nèi)詴?a target="_blank">任務(wù)管理器中看到與前臺服務(wù)相關(guān)的通知,但在抽屜式通知欄中看不到這些通知。
媒體會話
與媒體會話有關(guān)的通知不受此行為變更的影響。
配置為自行管理通話的應(yīng)用
如果您將應(yīng)用配置為自行管理通話,那么您無需 POST_NOTIFICATIONS
權(quán)限即可讓應(yīng)用發(fā)送使用 Notification.CallStyle
通知樣式的通知。
如果您的應(yīng)用執(zhí)行以下每項操作,系統(tǒng)就會認(rèn)為您的應(yīng)用已將自己配置為自行管理通話:
- 聲明
MANAGE_OWN_CALLS
權(quán)限。 - 實現(xiàn)
ConnectionService
接口。 - 通過調(diào)用
registerPhoneAccount()
向設(shè)備的電信服務(wù)提供商注冊。
測試應(yīng)用
可以評估以下因素:當(dāng)您的應(yīng)用在搭載 Android 13 或更高版本的設(shè)備上首次使用時,通知權(quán)限對此應(yīng)用有何影響。利用下面這組 Android 調(diào)試橋 (ADB) 命令,您可以模擬最常見的用戶選擇和設(shè)備升級順序,而無需重置測試設(shè)備:
- 應(yīng)用新安裝在搭載 Android 13 或更高版本的設(shè)備上:
adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS
adb shell pm clear-permission-flags PACKAGE_NAME \
android.permission.POST_NOTIFICATIONS user-set
adb shell pm clear-permission-flags PACKAGE_NAME \
android.permission.POST_NOTIFICATIONS user-fixed
- 當(dāng)應(yīng)用安裝在搭載 Android 12L 或更低版本的設(shè)備上時,用戶讓通知保持啟用狀態(tài),然后設(shè)備升級到 Android 13 或更高版本:
adb shell pm grant PACKAGE_NAME android.permission.POST_NOTIFICATIONS
adb shell pm set-permission-flags PACKAGE_NAME \
android.permission.POST_NOTIFICATIONS user-set
adb shell pm clear-permission-flags PACKAGE_NAME \
android.permission.POST_NOTIFICATIONS user-fixed
- 當(dāng)應(yīng)用安裝在搭載 Android 12L 或更低版本的設(shè)備上時,用戶手動停用通知,然后設(shè)備升級到 Android 13 或更高版本:
adb shell pm revoke PACKAGE_NAME android.permission.POST_NOTIFICATIONS
adb shell pm set-permission-flags PACKAGE_NAME \
android.permission.POST_NOTIFICATIONS user-set
adb shell pm clear-permission-flags PACKAGE_NAME \
android.permission.POST_NOTIFICATIONS user-fixed
最佳實踐
更新應(yīng)用的目標(biāo) SDK 版本
為了讓應(yīng)用更靈活地顯示權(quán)限對話框,請將應(yīng)用更新為以 Android 13 或更高版本為目標(biāo)平臺。
等待一段時間再顯示通知權(quán)限提示
等到用戶熟悉您的應(yīng)用之后,再請求他們授予任何權(quán)限。
新用戶可能想要探索您的應(yīng)用,并切身體會每項通知請求可以帶來的好處。您可以通過用戶操作觸發(fā)權(quán)限提示。下面列舉了幾個適合顯示通知權(quán)限提示的時機(jī):
- 用戶點按“提醒鈴鐺”按鈕時。
- 用戶選擇關(guān)注他人的社交媒體賬號時。
- 用戶提交外賣訂單時。
顯示了請求通知權(quán)限的建議工作流程。除非 shouldShowRequestPermissionRationale()
返回 true
,否則您的應(yīng)用無需顯示中間屏幕,即標(biāo)題為“接收通知!”的屏幕。
或者,您可以設(shè)置一個請求,在用戶有機(jī)會熟悉您的應(yīng)用后顯示該屏幕。例如,您可以等到用戶第三次或第四次啟動應(yīng)用時再顯示。
在上下文中請求權(quán)限
在應(yīng)用內(nèi)請求通知權(quán)限時,請在正確的上下文中請求,以便用戶明確了解通知的用途以及應(yīng)該選擇接收通知的原因。例如,電子郵件應(yīng)用可能包含為每封新郵件發(fā)送通知的選項,或僅為用戶是唯一收件人的郵件發(fā)送通知的選項。
借此機(jī)會明確向用戶表明您的意圖,有助于鼓勵用戶向您的應(yīng)用授予通知權(quán)限。
檢查您的應(yīng)用能否發(fā)送通知
用戶必須為您的應(yīng)用啟用通知,您的應(yīng)用才能發(fā)送通知。要確認(rèn)用戶是否已啟用通知,請調(diào)用 areNotificationsEnabled()
。
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
val isEnable = notificationManager.areNotificationsEnabled()
以負(fù)責(zé)任的方式使用權(quán)限
獲得發(fā)送通知的許可后,請以負(fù)責(zé)任的方式使用該權(quán)限。用戶可以查看您的應(yīng)用每天發(fā)送的通知數(shù)量,并且可以隨時撤消該權(quán)限。