1. 程式人生 > >8.0通知欄新增通知渠道

8.0通知欄新增通知渠道

從Android 8.0(API級別26)開始,所有通知必須要分配一個渠道,對於每個渠道,可以單獨設定視覺和聽覺行為。然後使用者可以在設定中修改這些設定,根據應用程式來決定哪些通知可以顯示或者隱藏。

建立通知渠道之後,程式無法修改通知行為,建立之後只有使用者可以修改,程式只能修改渠道名稱跟渠道描述。

我們可以為一個應用程式建立多個通知渠道,不同的通知型別用不同的渠道。例如重要通知用一個渠道,可以為這個渠道重要性設定成最高,不怎麼重要的通知用一個渠道,這個渠道重要性設定成最低。

建立一個通知

要建立一個通知,有以下幾個步驟:
1. 構造NotificationChannel物件,構造方法有三個引數:渠道id、渠道名稱、渠道重要性級別。
2. 呼叫NotificationChannel.setDescription方法可以設定渠道描述。這個描述在系統設定中可以看到。
3. 呼叫NotificationManager.createNotificationChannel方法建立通知渠道。

以下是註冊通知渠道的程式碼,記得先判斷版本號是不是大於或者等於8.0,因為只有8.0以上才有通知渠道API。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    //建立通知渠道
    CharSequence name = "渠道名稱1";
    String description = "渠道描述1";
    String channelId="channelId1";//渠道id     
    int importance = NotificationManager.IMPORTANCE_DEFAULT;//重要性級別
NotificationChannel mChannel = new NotificationChannel(channelId, name, importance); mChannel.setDescription(description);//渠道描述 mChannel.enableLights(true);//是否顯示通知指示燈 mChannel.enableVibration(true);//是否振動 NotificationManager notificationManager = (NotificationManager) getSystemService( NOTIFICATION_SERVICE); notificationManager.createNotificationChannel(mChannel);//建立通知渠道
}

建立通知渠道不會執行任何操作,所以在啟動應用程式時呼叫以上程式碼最好。

執行以上程式碼,就能在設定->應用和通知->選擇當前app->應用通知,在應用通知介面就能看到建立的通知渠道,如圖1-1所示,可以單獨開關當前的通知類別,還可以點選當前渠道,進入渠道詳細介面,如圖1-2所示,在渠道詳細介面可以設定渠道的提示音,震動,螢幕鎖定時顯示方式等。

圖1-1 單個app通知所有渠道列表

圖1-2 渠道詳細介面

預設情況下,通知的震動還有聲音提示都是由NotificationManagerCompat類中重要性級別決定的,例如常量IMPORTANCE_DEFAULT和IMPORTANCE_HIGH,後面我們會講到這些常量的具體作用。

如果你想改變該渠道的預設通知,可以呼叫NotificationChannel物件的方法進行修改。以下介紹了幾個常用的方法:
- enableLights() 是否顯示通知指示燈
- setLightColor() 設定通知燈顏色
- setVibrationPattern() 設定振動模式

注意:一旦建立了渠道,呼叫以上方法就會無效,只有使用者在設定中才能修改。

上面那段程式碼只告訴了我們建立渠道,下面這段程式碼讓我們在之前建立的渠道上傳送一個通知。

//第二個引數與channelId對應
Notification.Builder builder = new Notification.Builder(this,channelId);
//icon title text必須包含,不然影響桌面圖示小紅點的展示
builder.setSmallIcon(android.R.drawable.stat_notify_chat)
        .setContentTitle("通知渠道1->標題")
        .setContentText("通知渠道1->內容")
        .setNumber(3); //久按桌面圖示時允許的此條通知的數量

Intent intent=new Intent(this,NotificationActivity.class);
PendingIntent ClickPending = PendingIntent.getActivity(this, 0, intent, 0);
builder.setContentIntent(ClickPending);

notificationManager.notify(id,builder.build());

用Notification.Builder構造通知物件時,傳入第二個引數就是渠道id,用這個渠道id就能跟我們之前建立的渠道進行關聯。設定內容跟傳送系統通知程式碼跟之前類似。執行以上程式碼就能在8.0的手機上顯示通知了。

設定渠道重要性級別

渠道重要性級別影響該渠道中所有通知的顯示,在建立NotificationChannel物件的構造方法中必須要指定級別,一共有5個重要性界別,範圍從 IMPORTANCE_NONE(0)至 IMPORTANCE_HIGH(4),如表1所示。

使用者可見的重要性級別 重要性(Android 8.0及更高版本)
緊急(發出聲音並顯示為提醒通知) IMPORTANCE_HIGH
高(發出聲音) IMPORTANCE_DEFAULT
中等(沒有聲音) IMPORTANCE_LOW
低(無聲音並且不會出現在狀態列中) IMPORTANCE_MIN

表1-1 渠道重要級別

檢視渠道設定

我們都知道渠道建立之後不能通過程式碼修改,但是可以先檢視該渠道的振動和聲音等行為,如果需要修改,可以根據返回的內容再提示使用者手動去開啟。
1. 呼叫NotificationManager.getNotificationChannel(String channelId)方法獲取NotificationChannel物件,這個方法有個引數渠道id。
2. 有了NotificationChannel物件就能呼叫getVibrationPattern、getSound、getImportance等方法。

示例程式碼如下所示:

NotificationChannel notificationChannel=notificationManager.getNotificationChannel(channelId);
long[] vibrationPattern=notificationChannel.getVibrationPattern();//震動模式
if(vibrationPattern!=null){
    Log.i("ansen","震動模式:"+vibrationPattern.length);
}

Uri uri=notificationChannel.getSound();//通知聲音
Log.i("ansen","通知聲音:"+uri.toString());

int importance=notificationChannel.getImportance();//通知等級
Log.i("ansen","通知等級:"+importance);

開啟通知渠道設定

建立渠道之後,程式碼無法去修改這個渠道的行為,只有使用者去設定中進行修改,為了讓使用者更快的找到當前渠道,可以Intent使用ACTION_CHANNEL_NOTIFICATION_SETTINGS開啟通知渠道的系統設定。

以下程式碼開啟通知渠道的設定介面:

Intent channelIntent = new Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS);
channelIntent.putExtra(Settings.EXTRA_APP_PACKAGE, getPackageName());
channelIntent.putExtra(Settings.EXTRA_CHANNEL_ID,channelId);//渠道id必須是我們之前註冊的
startActivity(channelIntent);

需要傳入兩個引數,應用程式的包名跟渠道id。

刪除通知渠道

呼叫deleteNotificationChannel(String channelId)方法刪除渠道,程式碼如下所示:

NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
mNotificationManager.deleteNotificationChannel(channelId);

8.0通知欄點選通知傳送廣播

前面的案例我們點選通知欄都是跳轉到指定Activity,但是PendingIntent除了getActivity方法之外,還有getBroadcast跟getService。可以點選通知傳送廣播,開啟Service。

於是我們修改顯示通知的程式碼:

String BROADCAST_ACTION="android.intent.action.BROADCAST_ACTION";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
//第二個引數與channelId對應
Notification.Builder builder = new Notification.Builder(this,channelId);
//icon title text必須包含,不然影響桌面圖示小紅點的展示
builder.setSmallIcon(android.R.drawable.stat_notify_chat)
        .setContentTitle("通知渠道1->標題")
        .setContentText("通知渠道1->內容")
        .setNumber(3); //長按桌面圖示時允許的此條通知的數量

Intent intent = new Intent(BROADCAST_ACTION);
intent.putExtra("data","12345");//帶上引數
PendingIntent pendingIntent = PendingIntent.getBroadcast(this,id,intent, PendingIntent.FLAG_UPDATE_CURRENT);
builder.setContentIntent(pendingIntent);
builder.setAutoCancel(true);

mNotificationManager.notify(id,builder.build());
}

新建Intent物件的時候就傳入了一個action,同時給Intent傳入一個字串引數,然後呼叫PendingIntent.getBroadcast構造PendingIntent物件,最後呼叫notify方法顯示通知。

新建一個類DynamicBroadcast,繼承BroadcastReceiver,用來接收通知欄點選時傳送的廣播。在onReceive方法中列印一下我們傳入的引數。

public class DynamicBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent){
        String data = intent.getStringExtra("data");
        Log.i("data",data);
    }
}

前面的內容我們講了廣播的兩種註冊方式,靜態註冊跟動態註冊,這裡我們使用靜態註冊,在AndroidManifest.xml檔案中application標籤中增加如下程式碼:

<receiver android:name=".DynamicBroadcast"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.BROADCAST_ACTION" />
    </intent-filter>
</receiver>

執行之後發現在Android8.0版本以下的手機正常,點選通知欄會列印廣播的日誌,但是在Android8.0版本或以上版本點選通知欄發現就沒收到廣播,我以為是8.0增加了通知渠道的問題,後面檢視官網API,在Broadcasts類下面看到了這句話:

Beginning with Android 8.0 (API level 26), the
system imposes additional restrictions on
manifest-declared receivers. If your app targets
API level 26 or higher, you cannot use the manifest
to declare a receiver for most implicit broadcasts
(broadcasts that do not target your app
specifically).

大概意思是從Android8.0API級別26)開始,無法在AndroidManifest.xml檔案中宣告隱式廣播,系統的隱式廣播正常使用。

所以呢如果你的手機是Android8.0以上版本的,就需要動態註冊廣播,這樣才能接收到通知欄點選時傳送的廣播。

註釋掉AndroidManifest.xml檔案中宣告的廣播,然後在MainActivity的onCreate方法中註冊廣播,程式碼如下:

//動態註冊廣播
dynamicBroadcast=new DynamicBroadcast();
IntentFilter intentFilter=new IntentFilter(BROADCAST_ACTION);
registerReceiver(dynamicBroadcast,intentFilter);

靜態註冊的廣播一定要在onDestroy方法中進行反註冊:

@Override
protected void onDestroy() {
    super.onDestroy();

    if(dynamicBroadcast!=null){
        unregisterReceiver(dynamicBroadcast);//取消註冊廣播
    }
}

原始碼下載

相關推薦

8.0通知欄新增通知渠道,及自定義通知 響應點選事件

今天寫了下demo 發現通知在8.0後有些改變記錄下這個坑!!!! 通知的程式碼大家在網上一搜一大把,我也不廢話 直接上重點。 點擊發送通知,沒有通知顯示,程式碼如下。 日誌資訊 明明走了這行程式碼卻什麼也沒發生,what? 難道寫錯了?,後來查看了資料下才知道是8

8.0通知欄新增通知渠道

從Android 8.0(API級別26)開始,所有通知必須要分配一個渠道,對於每個渠道,可以單獨設定視覺和聽覺行為。然後使用者可以在設定中修改這些設定,根據應用程式來決定哪些通知可以顯示或者隱藏。 建立通知渠道之後,程式無法修改通知行為,建立之後只有使用者可

Android 8.0通知欄推送及適配

上一篇我們確保了我們開啟了通知欄的許可權,那麼接下來就是傳送推送了,廢話不多說,上程式碼。 首先我們判斷手機版本號,Android版本大於8.0的時候呢,我們需要進行一下通道的操作才可:判斷版本號程式碼接好 //此處判斷安卓版本號是否大於或者等於Android8.0 if (Build.VE

Android 8.0通知欄許可權開啟適配

使用手機時,我們經常會碰到各種通知,例如微信,QQ,瀏覽器等等,不厭其煩的給你各種推送,本文將演示通知的大致流程 首先,我們在一個適當的時機檢查我們App的通知欄許可權 boolean Jurisdiction = NotificationManagerCompat.from(AppAppl

Android 8.0 通知欄不顯示

由於 Google Play 現在限制了上傳 APK 的 targetSdkVersion,所以在新專案中就開始把版本號升到最高,這樣一來之前前人寫的一些程式碼庫就會出現相容性的問題,比如下載更新 APK 時,FileProvider 問題(我上一篇有講到過)。比如在下載的過

Android 8.0通知欄適配

歡迎使用Markdown編輯器 你好! 這是你第一次使用 Markdown編輯器 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。 新的改變 我們對Markdown編輯器進行了一些功能

Android O(8.0)通知欄解決方案

我一定要適配嗎Android8.0通知欄嗎? Google這次對於8.0系統通知渠道的推廣態度還是比較強硬的。如果你將專案中的targetSdkVersion指定到了26或者更高,那麼Android系統就會認為你的App已經做好了8.0系統的適配工作,當然包括了通知欄的適配。這個時候

Android O(8.0)通知欄適配

從一個bug說起,前陣子拿Nexus 6P(Android 8.0)進行通知推送的測試,發現無法彈出通知欄。 專案跑在Android 8.0模擬器上彈出了Toast: Developer warning for package “xxx.xxx.xxx”

Mysql 8.0.11 新增檢視許可權

mysql不同版本,給檢視新增許可權的方式不一樣。我安裝的是MySQL 8.0.11版本的,在寫8.0.11版本許可權設定的過程中,會加入其他版本的一些方案,供讀者參考: 1、首先都是登陸root使用者 這一步沒什麼區別 2、選擇資料庫 3、查詢使用者相關資訊

Android 8.0後notification通知聲音無法關閉或開啟的問題

Android O更新已經有很長一段時間了,然而也帶來了很多適配的問題,比如:app無法自動安裝的問題,通知欄無法顯示的問題等等。今天我們說說通知欄的聲音無法關閉的問題。 因為很多應用更新用的是notification建立一個前臺通知,放在通知欄中給使用者展示下載進度和提示內

關於Android 8.0後notification通知聲音無法關閉或開啟的問題

Android O更新已經有很長一段時間了,然而也帶來了很多適配的問題,比如:app無法自動安裝的問題,通知欄無法顯示的問題等等。今天我們說說通知欄的聲音無法關閉的問題,此篇博文針對關閉聲音的,如果想開啟聲音則相反,道理一樣的。 因為很多應用更新用的是noti

android 8.0 新特性:通知渠道

  由於Google的限制,要求在2018年10月之前 targetSdkVersion 必須在26以上,更改過之後發現在androd 8手機上不再推送通知,檢視android 8.0官方文件發現,添加了通知渠道新特性,並要求targetSdkVersion 26以上的and

android 通知(android 8.0可用)

通知 bsp null uil build eat 正常 nag HA final String CHANNEL_ID = "channel_id_1"; final String CHANNEL_NAME = "channel_name_1"; Notificatio

訊息通知Notificatio在8.0上不顯示,適配Android8.0

public class NotificationUtil { private Context aContext; private NotificationManager notificationManager; private static class Notifi

相容 android 8.0 通知

import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import android.app.PendingIntent; imp

Android 8.0 升級筆記(適配圖片、通知欄、ContentProvider、Receiver)

Android 8.0 升級筆記 前言 Google 在2017年就釋出了Android 8.0,並且強制AppStore上得應用都要升級,國內得不曉得。為了防止出現之前升級6.0 得時候許可權問題導致Crash這種情況得發生…這次很小心得去看了Google得升級意見,小夥伴們可以自

Android通知欄微技巧,8.0系統中通知欄的適配

大家好,今天我們繼續來學習Android 8.0系統的適配。 之前我們已經講到了,Android 8.0系統最主要需要進行適配的地方有兩處:應用圖示和通知欄。在上一篇文章當中,我們學習了Android 8.0系統應用圖示的適配,還沒有看過這篇文章的朋友可以

Android 8.0之後版本新增Hidl Service

原址 本文以LED為例在aosp上新增HIDL,以熟悉整個過程。 1. 編寫hal檔案並編譯     在hardware/interfaces/目錄下建立led資料夾和基版本1.0,這個版本號分為兩部分,major.minor。major版本不變得話,

android 8.0 mtk平臺新增讀寫檔案節點許可權

上層讀寫自己新增節點檔案/sys/bus/i2c/drivers/ac108/1-003b/ac108_debug/ac108_power: FileOutputStream file; try{     file = new FileOutputStream("/sy

Android 8.0 通知適配

下面說一下Android O (8.0)(API 26)通知的相關適配 一、分析 Android O 之前開啟一個App的設定的通知是這樣的 傳送一條通知通過下面程式碼 /* * 簡單的傳送通知 */ private void showNotification