Android消息通知Notification常用方法(發(fā)送消息和接收消息)
Notification
#前言
最近在做消息通知類Notification的相關(guān)業(yè)務(wù),利用閑暇時(shí)間總結(jié)一下。主要分為兩部分來記錄:發(fā)送消息和接收消息。
發(fā)送消息
發(fā)送消息利用NotificationManager類的notify方法來實(shí)現(xiàn),現(xiàn)用最普通的方式發(fā)送:
Notification.Builder builder = new Notification.Builder(context, channelId);
builder.setSmallIcon(R.drawable.ic_launcher)
.setContentTitle("標(biāo)題")
.setContentText("內(nèi)容")
Notification notification = builder.build();
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
NotificationChannel notificationChannel = new NotificationChannel(channelId, name,NotificationManager.IMPORTANCE_DEFAULT);
manager.createNotificationChannel(notificationChannel);
manager.notify(R.string.app_name,notification); 這樣一段簡(jiǎn)單的發(fā)送消息的代碼就完成了。
在發(fā)送消息的時(shí)候builder可以攜帶很多參數(shù),具體查看api即可,這里我記錄一下我用到的一些常用的方法。
builder..addAction(icon,title,pendingIntent);
三個(gè)參數(shù)分別是int類型(api已過時(shí)),charText類型和pendingIntent意圖。
這個(gè)方法我認(rèn)為就很不錯(cuò),比如當(dāng)需要封裝一個(gè)公共的彈窗,但是按鈕數(shù)量和按鈕顏色以及彈窗的標(biāo)題不一樣,這時(shí)候就可以利用這個(gè)方法進(jìn)行規(guī)定。因?yàn)閍ction是個(gè)數(shù)組,需要幾個(gè)傳幾個(gè)就可以,比如彈窗有兩個(gè)按鈕,那么就傳兩個(gè)action過去,第一個(gè)參數(shù)傳按鈕的顏色值,第二個(gè)參數(shù)傳按鈕的名稱,第三個(gè)參數(shù)傳pendingIntent意圖。這樣就不用很復(fù)雜的實(shí)現(xiàn)邏輯就可以完成這個(gè)公共的彈窗。
同樣,builder支持傳bundle,方法如下:
Bundle bundle = new Bundle(); builder.setExtras(bundle);
bundle可以攜帶參數(shù),同理剛才說的封裝公共彈窗也可以用bundle傳值的形式實(shí)現(xiàn),但是相比較action的方式是不是就會(huì)復(fù)雜很多。
bundle可以傳遞一些公共的參數(shù),比如一個(gè)type,當(dāng)接收到通知的時(shí)候利用type來區(qū)分要做什么動(dòng)作,這個(gè)就看項(xiàng)目實(shí)際需求了。
這里我把通知跳轉(zhuǎn)意圖的跳轉(zhuǎn)activity和接收廣播的代碼放上來,也為自己做個(gè)記錄。
Bundle bundle = new Bundle();
NotificationChannel notificationChannel = new NotificationChannel("99", "TEMP", NotificationManager.IMPORTANCE_DEFAULT);
Notification.Builder builder = new Notification.Builder(MainActivity.this, "99");
//Intent intent = new Intent(MainActivity.this,SecondActivity.class);
Intent intent = new Intent(MainActivity.this,MyBroadCastReceiver.class);
intent.setAction("android.intent.action.MY_BROADCAST");
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
PendingIntent pendingIntent = PendingIntent.getBroadcast(MainActivity.this,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
builder.setSmallIcon(R.drawable.ic_launcher_background)
.setContentTitle("標(biāo)題")
.setContentText("內(nèi)容")
.setWhen(System.currentTimeMillis())
.addAction(R.color.purple_200,"確定",pendingIntent)
.addAction(R.color.black,"取消",pendingIntent)
.setExtras(bundle);
Notification notification = builder.build();
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
manager.createNotificationChannel(notificationChannel);
manager.notify(R.string.app_name,notification);刪除通知:
manager.cancel(tag,id);
這里注意的是發(fā)送通知可以是兩個(gè)參數(shù)和三個(gè)參數(shù),三個(gè)參數(shù)的方法第一個(gè)參數(shù)是tag,那么調(diào)用刪除方法的時(shí)候要和這個(gè)tag對(duì)應(yīng)上,就是要?jiǎng)h除哪條消息就傳哪個(gè)tag。
接收消息
接收消息我是重新創(chuàng)建一個(gè)類繼承自NotificationListenerService,然后復(fù)寫需要用到的幾個(gè)方法,由于我的項(xiàng)目是systemui的開發(fā),所以和實(shí)際需求上可能會(huì)略有不同。
@Override
public void onNotificationPosted(StatusBarNotification sbn)該方法是接收到消息通知時(shí)的回調(diào)。
我不太清楚為什么我只發(fā)送了一次通知,但在該方法中卻收到了兩次消息。那就想辦法過濾一下吧。利用sbn返回的key和time來判斷。
mPreviousNotificationKey = sbn.getKey(); mPreviousNotificationKeyTime = sbn.getPostTime();
正常創(chuàng)建兩個(gè)變量來保存該次受到的key和postTime。然后利用sp先來獲取一次上次保存的這兩個(gè)值,再把該次獲取的這兩個(gè)值利用sp存上。
String mPreviousNotification = spHelper.getString("notificationKey");
Long mPreviousNotificationTime = spHelper.getLong("notificationTime");
spHelper.putValues(new SPHelper.ContentValue("notificationKey", mPreviousNotificationKey));
spHelper.putValues(new SPHelper.ContentValue("notificationTime", mPreviousNotificationKeyTime));然后根據(jù)兩次取值判斷:
if (mPreviousNotificationKey.equals(mPreviousNotification) && mPreviousNotificationKeyTime.equals(mPreviousNotificationTime)) {
return;
}兩次值一樣直接return過濾掉。
@Override
public void onNotificationRemoved(StatusBarNotification sbn)該方法是接收到刪除消息的通知。
至此,結(jié)束,方便過后有類似需求查閱。
到此這篇關(guān)于Android消息通知Notification的文章就介紹到這了,更多相關(guān)Android消息通知內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android中通過Notification&NotificationManager實(shí)現(xiàn)消息通知
- Android編程實(shí)現(xiàn)google消息通知功能示例
- Android之開發(fā)消息通知欄
- Android消息通知欄的實(shí)現(xiàn)方法介紹
- Android自定義Notification添加點(diǎn)擊事件
- Android中AlarmManager+Notification實(shí)現(xiàn)定時(shí)通知提醒功能
- Android 中Notification彈出通知實(shí)現(xiàn)代碼
- Android編程使用Service實(shí)現(xiàn)Notification定時(shí)發(fā)送功能示例
- Android 通知使用權(quán)(NotificationListenerService)的使用
- android使用NotificationListenerService監(jiān)聽通知欄消息
相關(guān)文章
android實(shí)現(xiàn)主動(dòng)連接和被動(dòng)連接的藍(lán)牙聊天功能
這篇文章主要為大家詳細(xì)介紹了android實(shí)現(xiàn)主動(dòng)連接和被動(dòng)連接的藍(lán)牙聊天功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
Android RecyclerView實(shí)現(xiàn)拼團(tuán)倒計(jì)時(shí)列表實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于Android RecyclerView實(shí)現(xiàn)拼團(tuán)倒計(jì)時(shí)列表的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
Android編程之View簡(jiǎn)單學(xué)習(xí)示例
這篇文章主要介紹了Android編程之View簡(jiǎn)單學(xué)習(xí)示例,以一個(gè)實(shí)例形式較為詳細(xì)的分析了View的功能、定義及使用技巧,需要的朋友可以參考下2015-10-10
Android 關(guān)于ExpandableListView去掉里頭分割線的方法
下面小編就為大家?guī)硪黄狝ndroid 關(guān)于ExpandableListView去掉里頭分割線的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12
Android自定義RecyclerView實(shí)現(xiàn)不固定刻度的刻度尺
這篇文章主要為大家詳細(xì)介紹了Android自定義RecyclerView實(shí)現(xiàn)不固定刻度的刻度尺,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-07-07
Android Room數(shù)據(jù)庫的基本使用示例詳解
文章介紹了Android Jetpack中的Room組件庫,用于簡(jiǎn)化SQLite數(shù)據(jù)庫的操作,Room通過Entity、DAO和Database三大核心組件,提供了面向?qū)ο蟮姆绞絹硖幚頂?shù)據(jù)庫,文章還提到使用Flow進(jìn)行數(shù)據(jù)庫更新通知的示例,感興趣的朋友跟隨小編一起看看吧2025-12-12
解析ADT-20問題 android support library
本篇文章是對(duì)ADT-20問題 android support library進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06

