溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android 8.0系統(tǒng)中通知欄的適配微技巧

發(fā)布時(shí)間:2020-08-19 16:04:53 來(lái)源:腳本之家 閱讀:193 作者:guolin 欄目:移動(dòng)開(kāi)發(fā)

大家好,今天我們繼續(xù)來(lái)學(xué)習(xí)Android 8.0系統(tǒng)的適配。

之前我們已經(jīng)講到了,Android 8.0系統(tǒng)最主要需要進(jìn)行適配的地方有兩處:應(yīng)用圖標(biāo)和通知欄。在上一篇文章當(dāng)中,我們學(xué)習(xí)了Android 8.0系統(tǒng)應(yīng)用圖標(biāo)的適配,還沒(méi)有看過(guò)這篇文章的朋友可以先去閱讀 Android應(yīng)用圖標(biāo)微技巧,8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配 。

那么本篇文章,我們自然要將重點(diǎn)放在通知欄上面了,學(xué)習(xí)一下Android 8.0系統(tǒng)的通知欄適配。

其實(shí)在8.0系統(tǒng)之前,還有一次通知欄變動(dòng)比較大的版本,就是5.0系統(tǒng)。關(guān)于5.0系統(tǒng)需要對(duì)通知欄進(jìn)行適配的內(nèi)容,我也整理了一篇文章,感興趣的朋友可以去閱讀Android通知欄微技巧,那些你所沒(méi)關(guān)注過(guò)的小細(xì)節(jié) 。

那么下面我們就開(kāi)始進(jìn)入本篇文章的正題。

為什么要進(jìn)行通知欄適配?

不得不說(shuō),通知欄真是一個(gè)讓人又愛(ài)又恨的東西。

通知欄是Android系統(tǒng)原創(chuàng)的一個(gè)功能,雖說(shuō)喬布斯一直認(rèn)為Android系統(tǒng)是徹徹底底抄襲iOS的一個(gè)產(chǎn)品,但是通知欄確實(shí)是Android系統(tǒng)原創(chuàng)的,反而蘋(píng)果在iOS 5之后也加入了類似的通知欄功能。

通知欄的設(shè)計(jì)確實(shí)非常巧妙,它默認(rèn)情況下不占用任何空間,只有當(dāng)用戶需要的時(shí)候用手指在狀態(tài)欄上向下滑動(dòng),通知欄的內(nèi)容才會(huì)顯示出來(lái),這在智能手機(jī)發(fā)展的初期極大地解決了手機(jī)屏幕過(guò)小,內(nèi)容展示區(qū)域不足的問(wèn)題。

可是隨著智能手機(jī)發(fā)展的逐漸成熟,通知欄卻變得越來(lái)越不討人喜歡了。各個(gè)App都希望能搶占通知欄的空間,來(lái)盡可能地宣傳和推廣自己的產(chǎn)品?,F(xiàn)在經(jīng)常是早上一覺(jué)醒來(lái)拿起手機(jī)一看,通知欄上全是各種APP的推送,不勝其煩。

Android 8.0系統(tǒng)中通知欄的適配微技巧
Android 8.0系統(tǒng)中通知欄的適配微技巧

我個(gè)人雖然是Android應(yīng)用開(kāi)發(fā)者,但同時(shí)也是Android手機(jī)的資深用戶。我已經(jīng)使用了8年的Android手機(jī),目前我對(duì)于通知欄的這種垃圾推送是零容忍的。現(xiàn)在每當(dāng)我安裝一個(gè)新的App時(shí),我都會(huì)先到設(shè)置里面去找一找有沒(méi)有推送開(kāi)關(guān),如果有的話我會(huì)第一時(shí)間把它關(guān)掉。而如果一個(gè)App經(jīng)常給我推送垃圾信息卻又無(wú)法關(guān)閉時(shí),我會(huì)直接將它的通知總開(kāi)關(guān)給關(guān)掉,如果還不是什么重要的App的話,那么我可能就直接將它卸載掉了。

為什么一個(gè)很好的通知欄功能現(xiàn)在卻變得這么遭用戶討厭?很大一部分原因都是因?yàn)殚_(kāi)發(fā)者沒(méi)有節(jié)制地使用導(dǎo)致的。就好像App保活一樣,直到今天還是不斷有人問(wèn)我該如何?;預(yù)pp,試想如何每個(gè)人都能?;钭约旱腁pp,那么最終受害的人是誰(shuí)?還不是使用Android手機(jī)的用戶。大家的手機(jī)只會(huì)越來(lái)越卡,最后只想把手機(jī)丟掉,變成iPhone用戶了。也是因?yàn)殚_(kāi)發(fā)者沒(méi)節(jié)制地使用,Android現(xiàn)在的每個(gè)版本都會(huì)不斷收縮后臺(tái)權(quán)限。

回到通知欄上也是一樣,每個(gè)開(kāi)發(fā)者都只想著盡可能地去宣傳自己的App,最后用戶的手機(jī)就亂得跟雞窩一樣了。但是通知欄又還是有用處的,比如我們收到微信、短信等消息的時(shí)候,確實(shí)需要通知欄給我們提醒。因此分析下來(lái),通知欄目前最大的問(wèn)題就是,無(wú)法讓用戶對(duì)感興趣和不感興趣的消息進(jìn)行區(qū)分。就比如說(shuō),我希望淘寶向我推送賣家發(fā)貨和物流的相關(guān)消息,但是我不想收到那些打折促銷或者是讓我去買衣服的這類消息。那么就目前來(lái)說(shuō),是沒(méi)有辦法對(duì)這些消息做區(qū)分的,我要么同意接受所有消息,要么就屏蔽所有消息,這是當(dāng)前通知欄的痛點(diǎn)。

那么在Android 8.0系統(tǒng)中,Google也是從這個(gè)痛點(diǎn)開(kāi)始下手的。

8.0系統(tǒng)的通知欄適配

從Android 8.0系統(tǒng)開(kāi)始,Google引入了通知渠道這個(gè)概念。

什么是通知渠道呢?顧名思義,就是每條通知都要屬于一個(gè)對(duì)應(yīng)的渠道。每個(gè)App都可以自由地創(chuàng)建當(dāng)前App擁有哪些通知渠道,但是這些通知渠道的控制權(quán)都是掌握在用戶手上的。用戶可以自由地選擇這些通知渠道的重要程度,是否響鈴、是否振動(dòng)、或者是否要關(guān)閉這個(gè)渠道的通知。

擁有了這些控制權(quán)之后,用戶就再也不用害怕那些垃圾推送消息的打擾了,因?yàn)橛脩艨梢宰灾鞯剡x擇自己關(guān)心哪些通知、不關(guān)心哪些通知。舉個(gè)具體的例子,我希望可以即時(shí)收到支付寶的收款信息,因?yàn)槲也幌脲e(cuò)過(guò)任何一筆收益,但是我又不想收到支付寶給我推薦的周圍美食,因?yàn)槲覜](méi)錢(qián)只吃得起公司食堂。這種情況,支付寶就可以創(chuàng)建兩種通知渠道,一個(gè)收支,一個(gè)推薦,而我作為用戶對(duì)推薦類的通知不感興趣,那么我就可以直接將推薦通知渠道關(guān)閉,這樣既不影響我關(guān)心的通知,又不會(huì)讓那些我不關(guān)心的通知來(lái)打擾我了。

對(duì)于每個(gè)App來(lái)說(shuō),通知渠道的劃分是非常需要仔細(xì)考究的,因?yàn)橥ㄖ酪坏﹦?chuàng)建之后就不能再修改了,因此開(kāi)發(fā)者需要仔細(xì)分析自己的App一共有哪些類型的通知,然后再去創(chuàng)建相應(yīng)的通知渠道。這里我們來(lái)參考一下Twitter的通知渠道劃分:

Android 8.0系統(tǒng)中通知欄的適配微技巧

可以看到,Twitter就是根據(jù)自己的通知類型,對(duì)通知渠道進(jìn)行了非常詳細(xì)的劃分,這樣用戶的自主選擇性就比較高了,也就大大降低了用戶不堪其垃圾通知的騷擾而將App卸載的概率。

我一定要適配嗎?

Google這次對(duì)于8.0系統(tǒng)通知渠道的推廣態(tài)度還是比較強(qiáng)硬的。

首先,如果你升級(jí)了appcompat庫(kù),那么所有使用appcompat庫(kù)來(lái)構(gòu)建通知的地方全部都會(huì)進(jìn)行廢棄方法提示,如下所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

上圖告訴我們,此方法已廢棄,需要使用帶有通知渠道的方法才行。

當(dāng)然,Google也并沒(méi)有完全做絕,即使方法標(biāo)為了廢棄,但還是可以正常使用的。可是如果你將項(xiàng)目中的targetSdkVersion指定到了26或者更高,那么Android系統(tǒng)就會(huì)認(rèn)為你的App已經(jīng)做好了8.0系統(tǒng)的適配工作,當(dāng)然包括了通知欄的適配。這個(gè)時(shí)候如果還不使用通知渠道的話,那么你的App的通知將完全無(wú)法彈出。因此這里給大家的建議就是,一定要適配。

好了,前面向大家介紹了這么多的背景知識(shí),那么現(xiàn)在開(kāi)始我們就正式進(jìn)入正題,來(lái)學(xué)習(xí)一下如何進(jìn)行8.0系統(tǒng)中通知欄的適配。

創(chuàng)建通知渠道

首先我們使用Android Studio來(lái)新建一個(gè)項(xiàng)目,就叫它NotificationTest吧。

創(chuàng)建好項(xiàng)目之后,打開(kāi)app/build.gradle文件檢查一下,確保targetSdkVersion已經(jīng)指定到了26或者更高,如下所示:

apply plugin: 'com.android.application'
android {
 compileSdkVersion 26
 defaultConfig {
 applicationId "com.example.notificationtest"
 minSdkVersion 15
 targetSdkVersion 26
 versionCode 1
 versionName "1.0"
 testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
 }
}

可以看到,這里我在創(chuàng)建新項(xiàng)目的時(shí)候默認(rèn)targetSdkVersion就是26,如果你是低于26的話,說(shuō)明你的Android SDK有些老了,最好還是更新一下。當(dāng)然如果你懶得更新也沒(méi)關(guān)系,手動(dòng)把它改成26就可以了。

接下來(lái)修改MainActivity中的代碼,如下所示:

public class MainActivity extends AppCompatActivity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.activity_main);
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  String channelId = "chat";
  String channelName = "聊天消息";
  int importance = NotificationManager.IMPORTANCE_HIGH;
  createNotificationChannel(channelId, channelName, importance);
  channelId = "subscribe";
  channelName = "訂閱消息";
  importance = NotificationManager.IMPORTANCE_DEFAULT;
  createNotificationChannel(channelId, channelName, importance);
 }
 }
 @TargetApi(Build.VERSION_CODES.O)
 private void createNotificationChannel(String channelId, String channelName, int importance) {
 NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
 NotificationManager notificationManager = (NotificationManager) getSystemService(
  NOTIFICATION_SERVICE);
 notificationManager.createNotificationChannel(channel);
 }
}

代碼不長(zhǎng),我來(lái)簡(jiǎn)單解釋下。這里我們?cè)贛ainActivity中創(chuàng)建了兩個(gè)通知渠道,首先要確保的是當(dāng)前手機(jī)的系統(tǒng)版本必須是Android 8.0系統(tǒng)或者更高,因?yàn)榈桶姹镜氖謾C(jī)系統(tǒng)并沒(méi)有通知渠道這個(gè)功能,不做系統(tǒng)版本檢查的話會(huì)在低版本手機(jī)上造成崩潰。

創(chuàng)建一個(gè)通知渠道的方式非常簡(jiǎn)單,這里我封裝了一個(gè)createNotificationChannel()方法,里面的邏輯相信大家都看得懂。需要注意的是,創(chuàng)建一個(gè)通知渠道至少需要渠道ID、渠道名稱以及重要等級(jí)這三個(gè)參數(shù),其中渠道ID可以隨便定義,只要保證全局唯一性就可以。渠道名稱是給用戶看的,需要能夠表達(dá)清楚這個(gè)渠道的用途。重要等級(jí)的不同則會(huì)決定通知的不同行為,當(dāng)然這里只是初始狀態(tài)下的重要等級(jí),用戶可以隨時(shí)手動(dòng)更改某個(gè)渠道的重要等級(jí),App是無(wú)法干預(yù)的。

上述代碼我是模擬了這樣一個(gè)場(chǎng)景。想象一下我們正在開(kāi)發(fā)一個(gè)類似于微信的App,其中App通知主要可以分為兩類,一類是我和別人的聊天消息,這類消息非常重要,因此重要等級(jí)我設(shè)為了IMPORTANCE_HIGH。另一類是公眾號(hào)的訂閱消息,這類消息不是那么重要,因此重要等級(jí)我設(shè)為了IMPORTANCE_DEFAULT。除此之外,重要等級(jí)還可以設(shè)置為IMPORTANCE_LOW、IMPORTANCE_MIN,分別對(duì)應(yīng)了更低的通知重要程度。

現(xiàn)在就可以運(yùn)行一下代碼了,運(yùn)行成功之后我們關(guān)閉App,進(jìn)入到設(shè)置 -> 應(yīng)用 -> 通知當(dāng)中,查看NotificationTest這個(gè)App的通知界面,如下圖所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

剛才我們創(chuàng)建的兩個(gè)通知渠道這里已經(jīng)顯示出來(lái)了??梢钥吹?,由于這兩個(gè)通知渠道的重要等級(jí)不同,通知的行為也是不同的,聊天消息可以發(fā)出提示音并在屏幕上彈出通知,而訂閱消息只能發(fā)出提示音。

當(dāng)然,用戶還可以點(diǎn)擊進(jìn)去對(duì)該通知渠道進(jìn)行任意的修改,比如降低聊天消息的重要等級(jí),甚至是可以完全關(guān)閉該渠道的通知。

至于創(chuàng)建通知渠道的這部分代碼,你可以寫(xiě)在MainActivity中,也可以寫(xiě)在Application中,實(shí)際上可以寫(xiě)在程序的任何位置,只需要保證在通知彈出之前調(diào)用就可以了。并且創(chuàng)建通知渠道的代碼只在第一次執(zhí)行的時(shí)候才會(huì)創(chuàng)建,以后每次執(zhí)行創(chuàng)建代碼系統(tǒng)會(huì)檢測(cè)到該通知渠道已經(jīng)存在了,因此不會(huì)重復(fù)創(chuàng)建,也并不會(huì)影響任何效率。

讓通知顯示出來(lái)

觸發(fā)通知的代碼和之前版本基本是沒(méi)有任何區(qū)別的,只是在構(gòu)建通知對(duì)象的時(shí)候,需要多傳入一個(gè)通知渠道ID,表示這條通知是屬于哪個(gè)渠道的。

那么下面我們就來(lái)讓通知顯示出來(lái)。

首先修改activity_main.xml中的代碼,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:orientation="vertical"
 android:layout_width="match_parent"
 android:layout_height="match_parent">
 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="發(fā)送聊天消息"
 android:onClick="sendChatMsg"
 />
 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:text="發(fā)送訂閱消息"
 android:onClick="sendSubscribeMsg"
 />
</LinearLayout>

這里我們?cè)诓季治募屑尤肓藘蓚€(gè)按鈕,很顯然,一個(gè)是用于觸發(fā)聊天消息渠道通知的,一個(gè)是用于觸發(fā)訂閱消息渠道通知的。

接下來(lái)修改MainActivity中的代碼,如下所示:

public class MainActivity extends AppCompatActivity {
 ...
 public void sendChatMsg(View view) {
 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
 Notification notification = new NotificationCompat.Builder(this, "chat")
  .setContentTitle("收到一條聊天消息")
  .setContentText("今天中午吃什么?")
  .setWhen(System.currentTimeMillis())
  .setSmallIcon(R.drawable.icon)
  .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
  .setAutoCancel(true)
  .build();
 manager.notify(1, notification);
 }
 public void sendSubscribeMsg(View view) {
 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
 Notification notification = new NotificationCompat.Builder(this, "subscribe")
  .setContentTitle("收到一條訂閱消息")
  .setContentText("地鐵沿線30萬(wàn)商鋪搶購(gòu)中!")
  .setWhen(System.currentTimeMillis())
  .setSmallIcon(R.drawable.icon)
  .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.icon))
  .setAutoCancel(true)
  .build();
 manager.notify(2, notification);
 }
}

這里我們分別在sendChatMsg()和sendSubscribeMsg()方法中觸發(fā)了兩條通知,創(chuàng)建通知的代碼就不再多做解釋了,和傳統(tǒng)創(chuàng)建通知的方法沒(méi)什么兩樣,只是在NotificationCompat.Builder中需要多傳入一個(gè)通知渠道ID,那么這里我們分別傳入了chat和subscribe這兩個(gè)剛剛創(chuàng)建的渠道ID。

現(xiàn)在重新運(yùn)行一下代碼,并點(diǎn)擊發(fā)送聊天消息按鈕,效果如下圖所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

由于這是一條重要等級(jí)高的通知,因此會(huì)使用這種屏幕彈窗的方式來(lái)通知用戶有消息到來(lái)。然后我們可以下拉展開(kāi)通知欄,這里也能查看到通知的詳細(xì)信息:

Android 8.0系統(tǒng)中通知欄的適配微技巧

用戶可以通過(guò)快速向左或者向右滑動(dòng)來(lái)關(guān)閉這條通知。

接下來(lái)點(diǎn)擊發(fā)送訂閱消息按鈕,你會(huì)發(fā)現(xiàn)現(xiàn)在屏幕上不會(huì)彈出一條通知提醒了,只會(huì)在狀態(tài)欄上顯示一個(gè)小小的通知圖標(biāo):

Android 8.0系統(tǒng)中通知欄的適配微技巧

因?yàn)橛嗛喯⑼ㄖ闹匾燃?jí)是默認(rèn)級(jí)別,這就是默認(rèn)級(jí)別通知的展示形式。當(dāng)然我們還是可以下拉展開(kāi)通知欄,查看通知的詳細(xì)信息:

Android 8.0系統(tǒng)中通知欄的適配微技巧

不過(guò)上面演示的都是通知欄的傳統(tǒng)功能,接下來(lái)我們看一看Android 8.0系統(tǒng)中通知欄特有的功能。

剛才提到了,快速向左或者向右滑動(dòng)可以關(guān)閉一條通知,但如果你緩慢地向左或者向右滑動(dòng),就會(huì)看到這樣兩個(gè)按鈕:

Android 8.0系統(tǒng)中通知欄的適配微技巧

其中,左邊那個(gè)時(shí)鐘圖標(biāo)的按鈕可以讓通知延遲顯示。比方說(shuō)這是一條比較重要的通知,但是我暫時(shí)沒(méi)時(shí)間看,也不想讓它一直顯示在狀態(tài)欄里打擾我,我就可以讓它延遲一段后時(shí)間再顯示,這樣我就暫時(shí)能夠先將精力放在專注的事情上,等過(guò)會(huì)有時(shí)間了這條通知會(huì)再次顯示出來(lái),我不會(huì)錯(cuò)過(guò)任何信息。如下所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

而右邊那個(gè)設(shè)置圖標(biāo)的按鈕就可以用來(lái)對(duì)通知渠道進(jìn)行屏蔽和配置了,用戶對(duì)每一個(gè)App的每一個(gè)通知渠道都有絕對(duì)的控制權(quán),可以根據(jù)自身的喜好來(lái)進(jìn)行配置和修改。如下所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

比如說(shuō)我覺(jué)得訂閱消息老是向我推薦廣告,實(shí)在是太煩了,我就可以將訂閱消息的通知渠道關(guān)閉掉。這樣我以后就不會(huì)再收到這個(gè)通知渠道下的任何消息,而聊天消息卻不會(huì)受到影響,這就是8.0系統(tǒng)通知渠道最大的特色。

另外,點(diǎn)擊上圖中的所有類別就可以進(jìn)入到當(dāng)前應(yīng)用程序通知的完整設(shè)置界面。

管理通知渠道

在前面的內(nèi)容中我們已經(jīng)了解到,通知渠道一旦創(chuàng)建之后就不能再通過(guò)代碼修改了。既然不能修改的話那還怎么管理呢?為此,Android賦予了開(kāi)發(fā)者讀取通知渠道配置的權(quán)限,如果我們的某個(gè)功能是必須按照指定要求來(lái)配置通知渠道才能使用的,那么就可以提示用戶去手動(dòng)更改通知渠道配置。

只講概念總是不容易理解,我們還是通過(guò)具體的例子來(lái)學(xué)習(xí)一下。想一想我們開(kāi)發(fā)的是一個(gè)類似于微信的App,聊天消息是至關(guān)重要的,如果用戶不小心將聊天消息的通知渠道給關(guān)閉了,那豈不是所有重要的信息全部都丟了?為此我們一定要保證用戶打開(kāi)了聊天消息的通知渠道才行。

修改MainActivity中的代碼,如下所示:

public class MainActivity extends AppCompatActivity {
 ...
 public void sendChatMsg(View view) {
 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
  NotificationChannel channel = manager.getNotificationChannel("chat");
  if (channel.getImportance() == NotificationManager.IMPORTANCE_NONE) {
  Intent intent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
  intent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
  intent.putExtra(Settings.EXTRA_CHANNEL_ID, channel.getId());
  startActivity(intent);
  Toast.makeText(this, "請(qǐng)手動(dòng)將通知打開(kāi)", Toast.LENGTH_SHORT).show();
  }
 }
 Notification notification = new NotificationCompat.Builder(this, "chat")
  ...
  .build();
 manager.notify(1, notification);
 }
 ...
}

這里我們對(duì)sendChatMsg()方法進(jìn)行了修改,通過(guò)getNotificationChannel()方法獲取到了NotificationChannel對(duì)象,然后就可以讀取該通知渠道下的所有配置了。這里我們判斷如果通知渠道的importance等于IMPORTANCE_NONE,就說(shuō)明用戶將該渠道的通知給關(guān)閉了,這時(shí)會(huì)跳轉(zhuǎn)到通知的設(shè)置界面提醒用戶手動(dòng)打開(kāi)。

現(xiàn)在重新運(yùn)行一下程序,效果如下圖所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

可以看到,當(dāng)我們將聊天消息的通知渠道關(guān)閉后,下次再次發(fā)送聊天消息將會(huì)直接跳轉(zhuǎn)到通知設(shè)置界面,提醒用戶手動(dòng)將通知打開(kāi)。

除了以上管理通知渠道的方式之外,Android 8.0還賦予了我們刪除通知渠道的功能,只需使用如下代碼即可刪除:

NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.deleteNotificationChannel(channelId);

但是這個(gè)功能非常不建議大家使用。因?yàn)镚oogle為了防止應(yīng)用程序隨意地創(chuàng)建垃圾通知渠道,會(huì)在通知設(shè)置界面顯示所有被刪除的通知渠道數(shù)量,如下圖所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

這樣是非常不美觀的,所以對(duì)于開(kāi)發(fā)者來(lái)說(shuō)最好的做法就是仔細(xì)規(guī)劃好通知渠道,而不要輕易地使用刪除功能。

顯示未讀角標(biāo)

前面我們提到過(guò),蘋(píng)果是從iOS 5開(kāi)始才引入了通知欄功能,那么在iOS 5之前,iPhone都是怎么進(jìn)行消息通知的呢?使用的就是未讀角標(biāo)功能,效果如下所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

實(shí)際上Android系統(tǒng)之前是從未提供過(guò)這種類似于iOS的角標(biāo)功能的,但是由于很多國(guó)產(chǎn)手機(jī)廠商都喜歡跟風(fēng)iOS,因此各種國(guó)產(chǎn)手機(jī)ROM都紛紛推出了自己的角標(biāo)功能。

可是國(guó)產(chǎn)手機(jī)廠商雖然可以訂制ROM,但是卻沒(méi)有制定API的能力,因此長(zhǎng)期以來(lái)都沒(méi)有一個(gè)標(biāo)準(zhǔn)的API來(lái)實(shí)現(xiàn)角標(biāo)功能,很多都是要通過(guò)向系統(tǒng)發(fā)送廣播來(lái)實(shí)現(xiàn)的,而各個(gè)手機(jī)廠商的廣播標(biāo)準(zhǔn)又不一致,經(jīng)常導(dǎo)致代碼變得極其混雜。

值得高興的是,從8.0系統(tǒng)開(kāi)始,Google制定了Android系統(tǒng)上的角標(biāo)規(guī)范,也提供了標(biāo)準(zhǔn)的API,長(zhǎng)期讓開(kāi)發(fā)者頭疼的這個(gè)問(wèn)題現(xiàn)在終于可以得到解決了。

那么下面我們就來(lái)學(xué)習(xí)一下如何在Android系統(tǒng)上實(shí)現(xiàn)未讀角標(biāo)的效果。

修改MainActivity中的代碼,如下所示:

public class MainActivity extends AppCompatActivity {
 ...
 @TargetApi(Build.VERSION_CODES.O)
 private void createNotificationChannel(String channelId, String channelName, int importance) {
 NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
 channel.setShowBadge(true);
 NotificationManager notificationManager = (NotificationManager) getSystemService(
  NOTIFICATION_SERVICE);
 notificationManager.createNotificationChannel(channel);
 }
 public void sendSubscribeMsg(View view) {
 NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
 Notification notification = new NotificationCompat.Builder(this, "subscribe")
  ...
  .setNumber(2)
  .build();
 manager.notify(2, notification);
 }
}

可以看到,這里我們主要修改了兩個(gè)地方。第一是在創(chuàng)建通知渠道的時(shí)候,調(diào)用了NotificationChannel的setShowBadge(true)方法,表示允許這個(gè)渠道下的通知顯示角標(biāo)。第二是在創(chuàng)建通知的時(shí)候,調(diào)用了setNumber()方法,并傳入未讀消息的數(shù)量。

現(xiàn)在重新運(yùn)行一下程序,并點(diǎn)擊發(fā)送訂閱消息按鈕,然后在Launcher中找到NotificationTest這個(gè)應(yīng)用程序,如下圖所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

可以看到,在圖標(biāo)的右上角有個(gè)綠色的角標(biāo),說(shuō)明我們編寫(xiě)的角標(biāo)功能已經(jīng)生效了。

需要注意的是,即使我們不調(diào)用setShowBadge(true)方法,Android系統(tǒng)默認(rèn)也是會(huì)顯示角標(biāo)的,但是如果你想禁用角標(biāo)功能,那么記得一定要調(diào)用setShowBadge(false)方法。

但是未讀數(shù)量怎么沒(méi)有顯示出來(lái)呢?這個(gè)功能還需要我們對(duì)著圖標(biāo)進(jìn)行長(zhǎng)按才行,效果如下圖所示:

Android 8.0系統(tǒng)中通知欄的適配微技巧

這樣就能看到通知的未讀數(shù)量是2了。

可能有些朋友習(xí)慣了iOS上的那種未讀角標(biāo),覺(jué)得Android上這種還要長(zhǎng)按的方式很麻煩。這個(gè)沒(méi)有辦法,因?yàn)檫@畢竟是Android原生系統(tǒng),Google沒(méi)有辦法像國(guó)內(nèi)手機(jī)廠商那樣可以肆無(wú)忌憚地模仿iOS,要不然可能會(huì)吃官司的。但是我相信國(guó)內(nèi)手機(jī)廠商肯定會(huì)將這部分功能進(jìn)行定制,風(fēng)格應(yīng)該會(huì)類似于iOS。不過(guò)這都不重要,對(duì)于我們開(kāi)發(fā)者來(lái)說(shuō),最好的福音就是有了統(tǒng)一的API標(biāo)準(zhǔn),不管國(guó)內(nèi)手機(jī)廠商以后怎么定制ROM,都會(huì)按照這個(gè)API的標(biāo)準(zhǔn)來(lái)定制,我們只需要使用這個(gè)API來(lái)進(jìn)行編程就可以了。

總結(jié)

以上所述是小編給大家介紹的Android 8.0系統(tǒng)中通知欄的適配微技巧,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)億速云網(wǎng)站的支持!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI