1
本文作者: 稀土 | 2016-07-07 17:49 |
雷鋒網(wǎng)按:本文由掘金翻譯計劃譯者DeadLion譯自Ian Lake《Notifications in Android N》,校對者:danke77, xcc3641。本文首發(fā)稀土掘金,未經(jīng)允許,禁止轉(zhuǎn)載。
Android通知往往是應(yīng)用和用戶之間至關(guān)重要的交互形式。為了提供更好的用戶體驗,Android N在通知上做出了諸多改進:收到消息后的視覺刷新,改進對自定義視圖的支持,擴展了更加實用的直接回復(fù)消息的形式,新的 MessagingStyle
,捆綁的通知。
首先,最明顯的變化是通知的默認外觀已經(jīng)顯著改變。除了應(yīng)用程序的圖標和名稱會固定在通知內(nèi),很多分散在通知周圍的字段也被折疊進新的標題行內(nèi)。這一改變是為了確保盡可能騰出更多空間給標題、文本和大圖標,這樣一來通知就比現(xiàn)在的稍大些,更加易讀。
給出單標題行,這就比以往的信息更加重要且更有用。當指定Android N時,默認情況下,時間會被隱藏——對時間敏感的通知(比如消息類應(yīng)用),可以setShowWhen(true)
設(shè)置重新啟用顯示時間。此外,現(xiàn)在subtext會取代內(nèi)容消息和數(shù)量的作用:數(shù)量是絕不會在Android N設(shè)備上出現(xiàn)的,除非指定之前的Android版本,而且不包含任何subtext,內(nèi)容消息將會顯示。在所有情況下,都要確保subtext是相關(guān)且有意義的。例如,如果用戶只有一個賬號,就不要再添加郵箱賬戶作為subtext了。
通知收到后的操作也重新設(shè)計了,現(xiàn)在視覺上是在通知下方單獨的一欄中。
你會注意到,圖標都沒有出現(xiàn)在新的通知中,取而代之的是,將通知內(nèi)有限的空間提供給了標簽本身。然而,在舊版本的 Android 和設(shè)備上,通知操作圖標仍然需要且被繼續(xù)使用,如Android Wear。
如果你使用NotificationCompat.Builder創(chuàng)建了自己的通知,那么可以使用標準樣式,無需修改任何代碼就能變成默認的新樣子。
如果要從自定義 RemoteViews
創(chuàng)建自己的通知,以適應(yīng)任何新的樣式一直以來都很具有挑戰(zhàn)性。隨著新的 header,擴展行為,操作,和大圖標位置都作為元素從通知的主要內(nèi)容標題中分離出來,我們已經(jīng)介紹一種新的 DecoratedCustomViewStyle
和 DecoratedMediaCustomViewStyle
提供所有這些元素使用, 這樣就能使用新的 setCustomContentView()
方法,專注于內(nèi)容部分。
這也確保未來外觀改變了,也能輕易的隨著平臺更新,適配這些樣式,還無需修改app端的代碼。
雖然通知是可以用來啟動一個Activity
,或以一個Service
、BroadcastReceiver
的方式在后臺工作,直接回復(fù)允許你使用通知操作直接在內(nèi)嵌輸入框中回復(fù)。
直接回復(fù)使用相同的RemoteInput API,最初是為Android Wear某個Action用的,為了能直接接收用戶的輸入。
RemoteInput
本身包含信息,如將用于以后恢復(fù)輸入的秘鑰,在用戶開始輸入之前的提示信息。
// Where should direct replies be put in the intent bundle (can be any string) private static final String KEY_TEXT_REPLY = "key_text_reply"; // Create the RemoteInput specifying this key String replyLabel = getString(R.string.reply_label); RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY) .setLabel(replyLabel) .build();
一旦已經(jīng)構(gòu)造好RemoteInput
,可以通過恰當命名的addRemoteInput())方法附加到Action上。也可以考慮調(diào)用setAllowGeneratedReplies(true)
方法允許Android Wear 2.0生成智能回復(fù),方便用戶快速回應(yīng)。
// Add to your action, enabling Direct Reply for it NotificationCompat.Action action = new NotificationCompat.Action.Builder(R.drawable.reply, replyLabel, pendingIntent) .addRemoteInput(remoteInput) .setAllowGeneratedReplies(true) .build();
請記住,在Marshmallow中,被傳入Action
的pendingIntent
應(yīng)該是一個Activity
。更低版本的設(shè)備不支持直接回復(fù)(你可能會想解鎖屏幕,啟動一個Activity
,然后聚焦到用戶回復(fù)的輸入框中),Android N設(shè)備上Service
(如果你想要在一個單獨的線程中運行) 或BroadcastReceiver
(運行在UI線程中) 即便處于鎖頻狀態(tài),后臺也能處理文本輸入。(在系統(tǒng)設(shè)置中有一個獨立的用戶選項,可以啟用/禁用鎖定設(shè)備的直接回復(fù)功能。)
在Service
/BroadcastReceiver
中提取輸入的文本,可能需要RemoteInput.getResultsFromIntent())的幫助。
private CharSequence getMessageText(Intent intent) { Bundle remoteInput = RemoteInput.getResultsFromIntent(intent); if (remoteInput != null) { return remoteInput.getCharSequence(KEY_TEXT_REPLY); } return null; }
處理文本后,必須更新通知。這將觸發(fā)隱藏直接回復(fù) UI,這可以作為一種技巧來確認用戶是否收到回復(fù)并正確處理。
對于大多數(shù)模板,這將涉及使用新的setRemoteInputHistory()
方法,將答復(fù)追加到通知底部。更多回復(fù)應(yīng)該追到歷史記錄下,直到主要內(nèi)容更新(比如別人的回復(fù))。
不過,如果你是在做一個消息應(yīng)用,期待著“你來我往”的對話,那就應(yīng)該用MessagingStyle
,將額外消息追加上去。
我們已經(jīng)優(yōu)化過正在對話狀態(tài)中消息的顯示,用新的MessagingStyle
直接回復(fù)。
對于通過多addMessage()
方法增加多條消息,這種風(fēng)格提供內(nèi)置的格式化。每個消息支持通過文本本身、一個時間戳,以及消息的發(fā)送人來增加(使它易于支持組對話)。
builder.setStyle(new NotificationCompat.MessagingStyle("Me") .setConversationTitle("Team lunch") .addMessage("Hi", timestampMillis1, null) // Pass in null for user. .addMessage("What's up?", timestampMillis2, "Coworker") .addMessage("Not much", timestampMillis3, null) .addMessage("How about lunch?", timestampMillis4, "Coworker"));
你可能會注意到,這種風(fēng)格能很好的支持特殊用戶消息的展示,填寫它們的名字(上例中的“Me”),設(shè)置一個可選的對話標題。
雖然可以手動通過 “BigTextStyle” 來完成,使用這種風(fēng)格的 Android Wear 2.0 用戶能立即得到內(nèi)置響應(yīng),不會被“踢出”擴展通知視圖,無需創(chuàng)建完整的穿戴(Android Wear)應(yīng)用就能達到無縫體驗。
一旦你想建立了一個“巨牛逼”的通知,通過使用新的視覺設(shè)計,直接回復(fù),MessagingStyle
還有所有之前最佳實踐,但考慮通知的整體體驗也很重要,尤其是發(fā)送多條通知的情況(每個正在進行的談話或每個新的電子郵件線程)。
捆綁通知提供兩全其美的辦法:一個單獨的概要通知,當用戶在看其他通知或者想要同時操作所有通知時在個別通知上擴展了組操作能力(包括使用操作和直接回復(fù))。
如果你為Android Wear創(chuàng)建了堆通知,這里使用的API是完全一樣的。只需將setGroup())添加到每個單獨通知中,將那些通知“綁定”到一起。不僅限于綁定成一組,所有捆綁通知是十分靈活的。對于郵件應(yīng)用,可能考慮每個賬戶的郵件“捆”成一組。
創(chuàng)建概要通知也是很重要的。這個概要通知,通過setGroupSummary(true)) 展示通知,這也是唯一支持 Marshmallow和更低版本的設(shè)備的通知,會歸納所有個人通知(你猜對了)。這是使用InboxStyle的最佳時機,雖然沒有要求用它。在Android N或更高版本設(shè)備上,從概要通知上提取的某些信息(如subtext、content intent和delete intent),來為捆綁通知生成collapsed通知,所以你應(yīng)該繼續(xù)在所有API級別上生成概要通知。
為了提升所有Android N設(shè)備的用戶體驗,發(fā)送4個或者更多通知時沒有以組的方式,這些通知將自動合并成一組
通知在Android上是一直不斷改進的功能。從Gingerbread時代的單擊目標,到可擴展通知,操作,MediaStyle以及現(xiàn)在的直接回復(fù),綁定通知。通知在Android用戶體驗上扮演著不可或缺的一部分。
隨著許多新工具可使用(NotificationCompat能幫助保持向后兼容),我已經(jīng)迫不及待的想看看如何用這些工具創(chuàng)建更好的應(yīng)用。
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。