Android消息通知Notification常用方法(發(fā)送消息和接收消息)
Notification
#前言
最近在做消息通知類(lèi)Notification的相關(guān)業(yè)務(wù),利用閑暇時(shí)間總結(jié)一下。主要分為兩部分來(lái)記錄:發(fā)送消息和接收消息。
發(fā)送消息
發(fā)送消息利用NotificationManager類(lèi)的notify方法來(lái)實(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類(lèi)型(api已過(guò)時(shí)),charText類(lèi)型和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過(guò)去,第一個(gè)參數(shù)傳按鈕的顏色值,第二個(gè)參數(shù)傳按鈕的名稱(chēng),第三個(gè)參數(shù)傳pendingIntent意圖。這樣就不用很復(fù)雜的實(shí)現(xiàn)邏輯就可以完成這個(gè)公共的彈窗。
同樣,builder支持傳bundle,方法如下:
Bundle bundle = new Bundle(); builder.setExtras(bundle);
bundle可以攜帶參數(shù),同理剛才說(shuō)的封裝公共彈窗也可以用bundle傳值的形式實(shí)現(xiàn),但是相比較action的方式是不是就會(huì)復(fù)雜很多。
bundle可以傳遞一些公共的參數(shù),比如一個(gè)type,當(dāng)接收到通知的時(shí)候利用type來(lái)區(qū)分要做什么動(dòng)作,這個(gè)就看項(xiàng)目實(shí)際需求了。
這里我把通知跳轉(zhuǎn)意圖的跳轉(zhuǎn)activity和接收廣播的代碼放上來(lái),也為自己做個(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è)類(lèi)繼承自NotificationListenerService,然后復(fù)寫(xiě)需要用到的幾個(gè)方法,由于我的項(xiàng)目是systemui的開(kāi)發(fā),所以和實(shí)際需求上可能會(huì)略有不同。
@Override public void onNotificationPosted(StatusBarNotification sbn)
該方法是接收到消息通知時(shí)的回調(diào)。
我不太清楚為什么我只發(fā)送了一次通知,但在該方法中卻收到了兩次消息。那就想辦法過(guò)濾一下吧。利用sbn返回的key和time來(lái)判斷。
mPreviousNotificationKey = sbn.getKey(); mPreviousNotificationKeyTime = sbn.getPostTime();
正常創(chuàng)建兩個(gè)變量來(lái)保存該次受到的key和postTime。然后利用sp先來(lái)獲取一次上次保存的這兩個(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過(guò)濾掉。
@Override public void onNotificationRemoved(StatusBarNotification sbn)
該方法是接收到刪除消息的通知。
至此,結(jié)束,方便過(guò)后有類(lèi)似需求查閱。
到此這篇關(guān)于Android消息通知Notification的文章就介紹到這了,更多相關(guān)Android消息通知內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Android中通過(guò)Notification&NotificationManager實(shí)現(xiàn)消息通知
- Android編程實(shí)現(xiàn)google消息通知功能示例
- Android之開(kāi)發(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)聽(tīng)通知欄消息
相關(guān)文章
Android源碼使用16進(jìn)制進(jìn)行狀態(tài)管理的方法
這篇文章主要介紹了Android源碼使用16進(jìn)制進(jìn)行狀態(tài)管理的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-07-07Android開(kāi)發(fā)準(zhǔn)確獲取手機(jī)IP地址的兩種方式
這篇文章主要介紹了Android開(kāi)發(fā)準(zhǔn)確獲取手機(jī)IP地址的兩種方式,需要的朋友可以參考下2020-03-03Android 控制ScrollView滾動(dòng)的實(shí)例詳解
這篇文章主要介紹了Android 控制ScrollView滾動(dòng)的實(shí)例詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下2017-10-10Android自定義View實(shí)現(xiàn)拖動(dòng)自動(dòng)吸邊效果
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)拖動(dòng)自動(dòng)吸邊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-06-06Android自定義View實(shí)現(xiàn)隨手勢(shì)滑動(dòng)控件
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)隨手勢(shì)滑動(dòng)的控件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02Kotlin使用TransitionDrawable實(shí)現(xiàn)顏色漸變效果流程講解
這篇文章主要介紹了Kotlin使用TransitionDrawable實(shí)現(xiàn)顏色漸變效果,這里,我們通過(guò)TransitionDrawable顯示顏色漸變效果,包括背景顏色的變化,以及圖片與圖片的漸變效果2023-02-02手把手教你實(shí)現(xiàn)Android編譯期注解
今天給大家介紹Android編譯期注解sdk的步驟以及注意事項(xiàng),并簡(jiǎn)要分析了運(yùn)行時(shí)注解以及字節(jié)碼技術(shù)在生成代碼上與編譯期注解的不同與優(yōu)劣,感興趣的朋友一起看看吧2021-07-07詳細(xì)分析Android中onTouch事件傳遞機(jī)制
相信不少朋友在剛開(kāi)始學(xué)習(xí)Android的時(shí)候,對(duì)于onTouch相關(guān)的事件一頭霧水。分不清onTouch(),onTouchEvent()和OnClick()之間的關(guān)系和先后順序,所以覺(jué)得有必要搞清onTouch事件傳遞的原理。經(jīng)過(guò)一段時(shí)間的琢磨以及相關(guān)博客的介紹,這篇文章就給大家詳細(xì)的分析介紹下。2016-10-10