版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】Android8.0系統(tǒng)中通知欄的適配微技巧
大家好,今天我們繼續(xù)來(lái)學(xué)習(xí)Android8.0系統(tǒng)的適配。之前我們已經(jīng)講到了,Android8.0系統(tǒng)最主要需要進(jìn)行適配的地方有兩處:應(yīng)用圖標(biāo)和通知欄。在上一篇文章當(dāng)中,我們學(xué)習(xí)了Android8.0系統(tǒng)應(yīng)用圖標(biāo)的適配,還沒有看過(guò)這篇文章的朋友可以先去閱讀Android應(yīng)用圖標(biāo)微技巧,8.0系統(tǒng)中應(yīng)用圖標(biāo)的適配。那么本篇文章,我們自然要將重點(diǎn)放在通知欄上面了,學(xué)習(xí)一下Android8.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通知欄微技巧,那些你所沒關(guān)注過(guò)的小細(xì)節(jié)。那么下面我們就開始進(jìn)入本篇文章的正題。為什么要進(jìn)行通知欄適配?不得不說(shuō),通知欄真是一個(gè)讓人又愛又恨的東西。通知欄是Android系統(tǒng)原創(chuàng)的一個(gè)功能,雖說(shuō)喬布斯一直認(rèn)為Android系統(tǒng)是徹徹底底抄襲iOS的一個(gè)產(chǎn)品,但是通知欄確實(shí)是Android系統(tǒng)原創(chuàng)的,反而蘋果在iOS5之后也加入了類似的通知欄功能。通知欄的設(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)題??墒请S著智能手機(jī)發(fā)展的逐漸成熟,通知欄卻變得越來(lái)越不討人喜歡了。各個(gè)App都希望能搶占通知欄的空間,來(lái)盡可能地宣傳和推廣自己的產(chǎn)品。現(xiàn)在經(jīng)常是早上一覺醒來(lái)拿起手機(jī)一看,通知欄上全是各種APP的推送,不勝其煩。我個(gè)人雖然是Android應(yīng)用開發(fā)者,但同時(shí)也是Android手機(jī)的資深用戶。我已經(jīng)使用了8年的Android手機(jī),目前我對(duì)于通知欄的這種垃圾推送是零容忍的?,F(xiàn)在每當(dāng)我安裝一個(gè)新的App時(shí),我都會(huì)先到設(shè)置里面去找一找有沒有推送開關(guān),如果有的話我會(huì)第一時(shí)間把它關(guān)掉。而如果一個(gè)App經(jīng)常給我推送垃圾信息卻又無(wú)法關(guān)閉時(shí),我會(huì)直接將它的通知總開關(guān)給關(guān)掉,如果還不是什么重要的App的話,那么我可能就直接將它卸載掉了。為什么一個(gè)很好的通知欄功能現(xiàn)在卻變得這么遭用戶討厭?很大一部分原因都是因?yàn)殚_發(fā)者沒有節(jié)制地使用導(dǎo)致的。就好像App保活一樣,直到今天還是不斷有人問(wèn)我該如何?;預(yù)pp,試想如何每個(gè)人都能?;钭约旱腁pp,那么最終受害的人是誰(shuí)?還不是使用Android手機(jī)的用戶。大家的手機(jī)只會(huì)越來(lái)越卡,最后只想把手機(jī)丟掉,變成iPhone用戶了。也是因?yàn)殚_發(fā)者沒節(jié)制地使用,Android現(xiàn)在的每個(gè)版本都會(huì)不斷收縮后臺(tái)權(quán)限。回到通知欄上也是一樣,每個(gè)開發(fā)者都只想著盡可能地去宣傳自己的App,最后用戶的手機(jī)就亂得跟雞窩一樣了。但是通知欄又還是有用處的,比如我們收到微信、短信等消息的時(shí)候,確實(shí)需要通知欄給我們提醒。因此分析下來(lái),通知欄目前最大的問(wèn)題就是,無(wú)法讓用戶對(duì)感興趣和不感興趣的消息進(jìn)行區(qū)分。就比如說(shuō),我希望淘寶向我推送賣家發(fā)貨和物流的相關(guān)消息,但是我不想收到那些打折促銷或者是讓我去買衣服的這類消息。那么就目前來(lái)說(shuō),是沒有辦法對(duì)這些消息做區(qū)分的,我要么同意接受所有消息,要么就屏蔽所有消息,這是當(dāng)前通知欄的痛點(diǎn)。那么在Android8.0系統(tǒng)中,Google也是從這個(gè)痛點(diǎn)開始下手的。8.0系統(tǒng)的通知欄適配從Android8.0系統(tǒng)開始,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)槲覜]錢只吃得起公司食堂。這種情況,支付寶就可以創(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)建之后就不能再修改了,因此開發(fā)者需要仔細(xì)分析自己的App一共有哪些類型的通知,然后再去創(chuàng)建相應(yīng)的通知渠道。這里我們來(lái)參考一下Twitter的通知渠道劃分:可以看到,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)行廢棄方法提示,如下所示:上圖告訴我們,此方法已廢棄,需要使用帶有通知渠道的方法才行。當(dāng)然,Google也并沒有完全做絕,即使方法標(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)在開始我們就正式進(jìn)入正題,來(lái)學(xué)習(xí)一下如何進(jìn)行8.0系統(tǒng)中通知欄的適配。創(chuàng)建通知渠道首先我們使用AndroidStudio來(lái)新建一個(gè)項(xiàng)目,就叫它NotificationTest吧。創(chuàng)建好項(xiàng)目之后,打開app/build.gradle文件檢查一下,確保targetSdkVersion已經(jīng)指定到了26或者更高,如下所示:可以看到,這里我在創(chuàng)建新項(xiàng)目的時(shí)候默認(rèn)targetSdkVersion就是26,如果你是低于26的話,說(shuō)明你的AndroidSDK有些老了,最好還是更新一下。當(dāng)然如果你懶得更新也沒關(guān)系,手動(dòng)把它改成26就可以了。接下來(lái)修改MainActivity中的代碼,如下所示:代碼不長(zhǎng),我來(lái)簡(jiǎn)單解釋下。這里我們?cè)贛ainActivity中創(chuàng)建了兩個(gè)通知渠道,首先要確保的是當(dāng)前手機(jī)的系統(tǒng)版本必須是Android8.0系統(tǒng)或者更高,因?yàn)榈桶姹镜氖謾C(jī)系統(tǒng)并沒有通知渠道這個(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)景。想象一下我們正在開發(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的通知界面,如下圖所示:剛才我們創(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)建通知渠道的這部分代碼,你可以寫在MainActivity中,也可以寫在Application中,實(shí)際上可以寫在程序的任何位置,只需要保證在通知彈出之前調(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ā)通知的代碼和之前版本基本是沒有任何區(qū)別的,只是在構(gòu)建通知對(duì)象的時(shí)候,需要多傳入一個(gè)通知渠道ID,表示這條通知是屬于哪個(gè)渠道的。那么下面我們就來(lái)讓通知顯示出來(lái)。首先修改activity_main.xml中的代碼,如下所示:這里我們?cè)诓季治募屑尤肓藘蓚€(gè)按鈕,很顯然,一個(gè)是用于觸發(fā)聊天消息渠道通知的,一個(gè)是用于觸發(fā)訂閱消息渠道通知的。接下來(lái)修改MainActivity中的代碼,如下所示:這里我們分別在sendChatMsg()和sendSubscribeMsg()方法中觸發(fā)了兩條通知,創(chuàng)建通知的代碼就不再多做解釋了,和傳統(tǒng)創(chuàng)建通知的方法沒什么兩樣,只是在NotificationCompat.Builder中需要多傳入一個(gè)通知渠道ID,那么這里我們分別傳入了chat和subscribe這兩個(gè)剛剛創(chuàng)建的渠道ID?,F(xiàn)在重新運(yùn)行一下代碼,并點(diǎn)擊發(fā)送聊天消息按鈕,效果如下圖所示:由于這是一條重要等級(jí)高的通知,因此會(huì)使用這種屏幕彈窗的方式來(lái)通知用戶有消息到來(lái)。然后我們可以下拉展開通知欄,這里也能查看到通知的詳細(xì)信息:用戶可以通過(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):因?yàn)橛嗛喯⑼ㄖ闹匾燃?jí)是默認(rèn)級(jí)別,這就是默認(rèn)級(jí)別通知的展示形式。當(dāng)然我們還是可以下拉展開通知欄,查看通知的詳細(xì)信息:不過(guò)上面演示的都是通知欄的傳統(tǒng)功能,接下來(lái)我們看一看Android8.0系統(tǒng)中通知欄特有的功能。剛才提到了,快速向左或者向右滑動(dòng)可以關(guān)閉一條通知,但如果你緩慢地向左或者向右滑動(dòng),就會(huì)看到這樣兩個(gè)按鈕:其中,左邊那個(gè)時(shí)鐘圖標(biāo)的按鈕可以讓通知延遲顯示。比方說(shuō)這是一條比較重要的通知,但是我暫時(shí)沒時(shí)間看,也不想讓它一直顯示在狀態(tài)欄里打擾我,我就可以讓它延遲一段后時(shí)間再顯示,這樣我就暫時(shí)能夠先將精力放在專注的事情上,等過(guò)會(huì)有時(shí)間了這條通知會(huì)再次顯示出來(lái),我不會(huì)錯(cuò)過(guò)任何信息。如下所示:而右邊那個(gè)設(shè)置圖標(biāo)的按鈕就可以用來(lái)對(duì)通知渠道進(jìn)行屏蔽和配置了,用戶對(duì)每一個(gè)App的每一個(gè)通知渠道都有絕對(duì)的控制權(quán),可以根據(jù)自身的喜好來(lái)進(jìn)行配置和修改。如下所示:比如說(shuō)我覺得訂閱消息老是向我推薦廣告,實(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賦予了開發(fā)者讀取通知渠道配置的權(quán)限,如果我們的某個(gè)功能是必須按照指定要求來(lái)配置通知渠道才能使用的,那么就可以提示用戶去手動(dòng)更改通知渠道配置。只講概念總是不容易理解,我們還是通過(guò)具體的例子來(lái)學(xué)習(xí)一下。想一想我們開發(fā)的是一個(gè)類似于微信的App,聊天消息是至關(guān)重要的,如果用戶不小心將聊天消息的通知渠道給關(guān)閉了,那豈不是所有重要的信息全部都丟了?為此我們一定要保證用戶打開了聊天消息的通知渠道才行。修改MainActivity中的代碼,如下所示:這里我們對(duì)sendChatMsg()方法進(jìn)行了修改,通過(guò)getNotificationChannel()方法獲取到了NotificationChannel對(duì)象,然后就可以讀取該通知渠道下的所有配置了。這里我們判斷如果通知渠道的importance等于IMPORTANCE_NONE,就說(shuō)明用戶將該渠道的通知給關(guān)閉了,這時(shí)會(huì)跳轉(zhuǎn)到通知的設(shè)置界面提醒用戶手動(dòng)打開。現(xiàn)在重新運(yùn)行一下程序,效果如下圖所示:可以看到,當(dāng)我們將聊天消息的通知渠道關(guān)閉后,下次再次發(fā)送聊天消息將會(huì)直接跳轉(zhuǎn)到通知設(shè)置界面,提醒用戶手動(dòng)將通知打開。除了以上管理通知渠道的方式之外,Android8.0還賦予了我們刪除通知渠道的功能,只需使用如下代碼即可刪除:但是這個(gè)功能非常不建議大家使用。因?yàn)镚oogle為了防止應(yīng)用程序隨意地創(chuàng)建垃圾通知渠道,會(huì)在通知設(shè)置界面顯示所有被刪除的通知渠道數(shù)量,如下圖所示:這樣是非常不美觀的,所以對(duì)于開發(fā)者來(lái)說(shuō)最好的做法就是仔細(xì)規(guī)劃好通知渠道,而不要輕易地使用刪除功能。顯示未讀角標(biāo)前面我們提到過(guò),蘋果是從iOS5開始才引入了通知欄功能,那么在iOS5之前,iPhone都是怎么進(jìn)行消息通知的呢?使用的就是未讀角標(biāo)功能,效果如下所示:實(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,但是卻沒有制定API的能力,因此長(zhǎng)期以來(lá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)開始,Google制定了Android系統(tǒng)上的角標(biāo)規(guī)范,也提供了標(biāo)準(zhǔn)的API,長(zhǎng)期讓開發(fā)者頭疼的這個(gè)問(wèn)題現(xiàn)在終于可以得到解決了。那么下面我們就來(lái)學(xué)習(xí)一下如何在Android系統(tǒng)上實(shí)現(xiàn)未讀角標(biāo)的效果。修改MainActivity中的代碼,如下所示
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 手機(jī)店合同范本
- 苗木協(xié)議書范本
- 苗木追加合同范本
- 蔬菜代賣協(xié)議書
- 融資性合同范本
- 解除設(shè)備合同協(xié)議書
- 認(rèn)購(gòu)期權(quán)協(xié)議書
- 設(shè)備賣出協(xié)議書
- 設(shè)備管理協(xié)議書
- 設(shè)立酒店協(xié)議書
- 學(xué)堂在線2024秋《英文學(xué)術(shù)論文寫作與發(fā)表技巧》課后試題及答案
- 2024-2025學(xué)年語(yǔ)文二年級(jí)上冊(cè) 部編版期末測(cè)試卷 (含答案)
- 【MOOC】電子線路設(shè)計(jì)、測(cè)試與實(shí)驗(yàn)(二)-華中科技大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 艾媒咨詢|2023-2024年中國(guó)酒類新零售市場(chǎng)研究報(bào)告
- 吊車組立鋼管桿施工措施
- 大學(xué)生勞動(dòng)教育概論智慧樹知到期末考試答案章節(jié)答案2024年南昌大學(xué)
- 2024年保安員資格考試初級(jí)理論知識(shí)試題庫(kù)及答案(共290題)
- 【小兒腹瀉的用藥指導(dǎo)方案3500字(論文)】
- 潮州景觀水池清洗方案
- 普通診所污水、污物、糞便處理方案 及周邊環(huán)境情況說(shuō)明
- 汽車離合器設(shè)計(jì)畢業(yè)設(shè)計(jì)(論文)
評(píng)論
0/150
提交評(píng)論