這篇要來寫關於android中"通知(Notification)"的用法最近基於公司需求而開始研究它就這樣研究了幾天..我覺得我最大的收穫是學會拼Notification這.
碼農日常大小事
跳到主文
認真打好每一篇文章,認真分享程序猿每一件大小事;走過晃過依然滿載而歸
部落格全站分類:數位生活
相簿
部落格
留言
名片
Hello
大家好~
Dec05Sat202015:06
碼農日常-『Androidstudio』Notification通知之用法(含點擊事件)
這篇要來寫關於android中"通知(Notification)"的用法
最近基於公司需求而開始研究它
就這樣研究了幾天..我覺得我最大的收穫是學會拼Notification這個單字ヾ(´¬`)ノ
沒有啦說笑的โ๏∀๏ใ
其實最近公司的專案有打算加入FCM推播通知
蛤?你問我FCM是什麼?
FCM全名為FirebaseCloudMessage,就是你各位手機一天到晚收到的那個煩死人的廣播推播系統
以前端開發者的角度而言這是Google提供的一種推播服務
那今天我們不是要做,FCM那個下次(笑)
這次我們針對在手機前端的通知來做一個介紹
那麼,來看一下今天的範例吧!
以及Github
->https://github.com/thumbb13555/NotificationDemo
1.檔案結構&介面
如圖
NotificationReceiver.java等一下再創,因為還有別的東西要設定(-‿◦)
我們可以先來弄介面
activity_main.xml
以及這是給notification的介面
custom_notification.xml
備註:用於notification的Layout不能用ConstraintLayout!!
坦白說我也不知道為什麼...(;´д`)ゞ
我實測起來就是真的用了不會顯示(但不會閃退)
圖檔的部分在這,有需要去Github複製一下吧
->https://github.com/thumbb13555/NotificationDemo/blob/master/app/src/main/res/drawable/ic_baseline_accessible_forward_24.xml
->https://github.com/thumbb13555/NotificationDemo/blob/master/app/src/main/res/drawable/ic_baseline_directions_bike_24.xml
2.加入channel
在使用notification時,必須要先加入"channel"
具體的意義就是有點像是告訴系統"我要使用通知功能了喔!我的名在叫做XXX喔!"
這樣的感覺(゜ロ゜)
像是預先報備上級的概念吧( ̄ー ̄;
那在“通報上級”還要看你的公司環境
在Android8以下的手機使用功能是可以不用報備的
那麼具體來說,是這樣寫的(順便連按鈕相關事件也寫一寫)
粉底白字所包起來的內容就是重點
publicclassMainActivityextendsAppCompatActivity{
privateStringCHANNEL_ID="Coder";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**檢查手機版本是否支援通知;若支援則新增"頻道"*/
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannelchannel=newNotificationChannel(
CHANNEL_ID,"DemoCode",NotificationManager.IMPORTANCE_DEFAULT);
NotificationManagermanager=getSystemService(NotificationManager.class);
assertmanager!=null;
manager.createNotificationChannel(channel);
}
/**初始化介面控件與點擊事件*/
ButtonbtDefault,btCustom;
btDefault=findViewById(R.id.button_DefaultNotification);
btCustom=findViewById(R.id.button_CustomNotification);
btDefault.setOnClickListener(onDefaultClick);
btCustom.setOnClickListener(onCustomClick);
}
/**點選"系統預設通知"*/
privateView.OnClickListeneronDefaultClick=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
}
};
/**點選"客製化通知"*/
privateView.OnClickListeneronCustomClick=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
}
};
3.撰寫基本Notification
接下來就是撰寫基本版的通知了
通知的設置基本如下
NotificationCompat.Builderbuilder
=newNotificationCompat.Builder(MainActivity.this,CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_accessible_forward_24)
.setContentTitle("哈囉你好!")
.setContentText("跟你打個招呼啊~")
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE);
如果英文還不錯的朋友應該看他方法的英文就知道大概在幹什麼了
由上而下是
設置小Icon
設置標題
設置內容
設置是否點到後自動消失
設置通知等級
設置通知類型
那這邊補上他方法的列表
->https://developer.android.com/reference/androidx/core/app/NotificationCompat.Builder
最後把通知發出去
/**發出通知*/
NotificationManagerCompatnotificationManagerCompat
=NotificationManagerCompat.from(MainActivity.this);
notificationManagerCompat.notify(1,builder.build());
這部分的全部
/**點選"系統預設通知"*/
privateView.OnClickListeneronDefaultClick=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
/**建置通知欄位的內容*/
NotificationCompat.Builderbuilder
=newNotificationCompat.Builder(MainActivity.this,CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_accessible_forward_24)
.setContentTitle("哈囉你好!")
.setContentText("跟你打個招呼啊~")
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE);
/**發出通知*/
NotificationManagerCompatnotificationManagerCompat
=NotificationManagerCompat.from(MainActivity.this);
notificationManagerCompat.notify(1,builder.build());
}
};
到這邊就可以順利發出通知了(・ω・)b
接下來就是客製化通知的部分
4.撰寫客製Notification+點擊事件
接著是客製的通知
客製的通知需要自已畫一個介面,而在最上面的部分我們已經把介面寫好了
剛剛沒加入?在這邊自己去複製
->https://github.com/thumbb13555/NotificationDemo/blob/master/app/src/main/res/layout/custom_notification.xml
通知的View寫法跟我們一般認知的寫法有點不太一樣
他是靠RemoteViews去寫介面,然後在載入通知
如下
/**建立要嵌入在通知裡的介面*/
RemoteViewsview=newRemoteViews(getPackageName(),R.layout.custom_notification);
/**建置通知欄位的內容*/
NotificationCompat.Builderbuilder
=newNotificationCompat.Builder(MainActivity.this,CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_directions_bike_24)
.setContent(view)
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE);
NotificationManagerCompatnotificationManagerCompat
=NotificationManagerCompat.from(MainActivity.this);
/**發出通知*/
notificationManagerCompat.notify(1,builder.build());
在這邊可以先執行一次,應該就會顯示客製通知了
那麼上面的元件又要如何取得他的控制呢?
如下
/**建立要嵌入在通知裡的介面*/
RemoteViewsview=newRemoteViews(getPackageName(),R.layout.custom_notification);
/**設置通知內的控件要做的事*/
/*設置標題*/
view.setTextViewText(R.id.textView_Title,"哈囉你好!");
/*設置圖片*/
view.setImageViewResource(
R.id.imageView_Icon,R.drawable.ic_baseline_directions_bike_24);
//以下略
兩個粉底白字的部分就是設置圖片&標題文字的方法
了解控件設置後,接下來就是點擊事件了
我們來設置NotificationReceiver.java吧
創的過程省略,我直接給你內容
NotificationReceiver.java
publicclassNotificationReceiverextendsBroadcastReceiver{
@Override
publicvoidonReceive(Contextcontext,Intentintent){
/**接收點擊事件*/
switch(intent.getAction()){
case"Hi":
Toast.makeText(context,"哈囉!",Toast.LENGTH_SHORT).show();
break;
case"Close":
NotificationManagermanager=(NotificationManager)context.getSystemService(NOTIFICATION_SERVICE);
manager.cancel(1);
break;
}
}
}
然後來到AndroidManifest.xml
加入粉底白字的部分
AndroidManifest.xml
最後是點擊事件的部分
基本上
1.設置一個Intent連結NotificationReceiver(紫)
2.將Intent載入PendingIntent
3.把PendingIntent放到指定的Button內(粉&藍)
/**建立要嵌入在通知裡的介面*/
RemoteViewsview=newRemoteViews(getPackageName(),R.layout.custom_notification);
/**初始化Intent,攔截點擊事件*/
Intentintent=newIntent(MainActivity.this,NotificationReceiver.class);
/**設置通知內"Hi"這個按鈕的點擊事件(以Intent的Action傳送標籤,標籤為Hi)*/
intent.setAction("Hi");
PendingIntentpendingIntent=PendingIntent.getBroadcast(MainActivity.this
,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
/**設置通知內"Close"這個按鈕的點擊事件(以Intent的Action傳送標籤,標籤為Close)*/
intent.setAction("Close");
PendingIntentclose=PendingIntent.getBroadcast(MainActivity.this
,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
/**設置通知內的控件要做的事*/
/*設置標題*/
view.setTextViewText(R.id.textView_Title,"哈囉你好!");
/*設置圖片*/
view.setImageViewResource(
R.id.imageView_Icon,R.drawable.ic_baseline_directions_bike_24);
/*設置"Hi"按鈕點擊事件(綁pendingIntent)*/
view.setOnClickPendingIntent(R.id.button_Noti_Hi,pendingIntent);
/*設置"Close"按鈕點擊事件(綁close)*/
view.setOnClickPendingIntent(R.id.button_Noti_Close,close);
PO一下全部
/**點選"客製化通知"*/
privateView.OnClickListeneronCustomClick=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
/**建立要嵌入在通知裡的介面*/
RemoteViewsview=newRemoteViews(getPackageName(),R.layout.custom_notification);
/**初始化Intent,攔截點擊事件*/
Intentintent=newIntent(MainActivity.this,NotificationReceiver.class);
/**設置通知內"Hi"這個按鈕的點擊事件(以Intent的Action傳送標籤,標籤為Hi)*/
intent.setAction("Hi");
PendingIntentpendingIntent=PendingIntent.getBroadcast(MainActivity.this
,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
/**設置通知內"Close"這個按鈕的點擊事件(以Intent的Action傳送標籤,標籤為Close)*/
intent.setAction("Close");
PendingIntentclose=PendingIntent.getBroadcast(MainActivity.this
,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
/**設置通知內的控件要做的事*/
/*設置標題*/
view.setTextViewText(R.id.textView_Title,"哈囉你好!");
/*設置圖片*/
view.setImageViewResource(
R.id.imageView_Icon,R.drawable.ic_baseline_directions_bike_24);
/*設置"Hi"按鈕點擊事件(綁pendingIntent)*/
view.setOnClickPendingIntent(R.id.button_Noti_Hi,pendingIntent);
/*設置"Close"按鈕點擊事件(綁close)*/
view.setOnClickPendingIntent(R.id.button_Noti_Close,close);
/**建置通知欄位的內容*/
NotificationCompat.Builderbuilder
=newNotificationCompat.Builder(MainActivity.this,CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_directions_bike_24)
.setContent(view)
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE);
NotificationManagerCompatnotificationManagerCompat
=NotificationManagerCompat.from(MainActivity.this);
/**發出通知*/
notificationManagerCompat.notify(1,builder.build());
}
};
至此可以執行看看是否一切正常
接下來的就交給各位自己理解囉!(・ωー)~☆
最後PO一下全部
MainActivity.java
publicclassMainActivityextendsAppCompatActivity{
privateStringCHANNEL_ID="Coder";
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**檢查手機版本是否支援通知;若支援則新增"頻道"*/
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
NotificationChannelchannel=newNotificationChannel(
CHANNEL_ID,"DemoCode",NotificationManager.IMPORTANCE_DEFAULT);
NotificationManagermanager=getSystemService(NotificationManager.class);
assertmanager!=null;
manager.createNotificationChannel(channel);
}
/**初始化介面控件與點擊事件*/
ButtonbtDefault,btCustom;
btDefault=findViewById(R.id.button_DefaultNotification);
btCustom=findViewById(R.id.button_CustomNotification);
btDefault.setOnClickListener(onDefaultClick);
btCustom.setOnClickListener(onCustomClick);
}
/**點選"系統預設通知"*/
privateView.OnClickListeneronDefaultClick=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
/**建置通知欄位的內容*/
NotificationCompat.Builderbuilder
=newNotificationCompat.Builder(MainActivity.this,CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_accessible_forward_24)
.setContentTitle("哈囉你好!")
.setContentText("跟你打個招呼啊~")
.setAutoCancel(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE);
/**發出通知*/
NotificationManagerCompatnotificationManagerCompat
=NotificationManagerCompat.from(MainActivity.this);
notificationManagerCompat.notify(1,builder.build());
}
};
/**點選"客製化通知"*/
privateView.OnClickListeneronCustomClick=newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
/**建立要嵌入在通知裡的介面*/
RemoteViewsview=newRemoteViews(getPackageName(),R.layout.custom_notification);
/**初始化Intent,攔截點擊事件*/
Intentintent=newIntent(MainActivity.this,NotificationReceiver.class);
/**設置通知內"Hi"這個按鈕的點擊事件(以Intent的Action傳送標籤,標籤為Hi)*/
intent.setAction("Hi");
PendingIntentpendingIntent=PendingIntent.getBroadcast(MainActivity.this
,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
/**設置通知內"Close"這個按鈕的點擊事件(以Intent的Action傳送標籤,標籤為Close)*/
intent.setAction("Close");
PendingIntentclose=PendingIntent.getBroadcast(MainActivity.this
,0,intent,PendingIntent.FLAG_CANCEL_CURRENT);
/**設置通知內的控件要做的事*/
/*設置標題*/
view.setTextViewText(R.id.textView_Title,"哈囉你好!");
/*設置圖片*/
view.setImageViewResource(
R.id.imageView_Icon,R.drawable.ic_baseline_directions_bike_24);
/*設置"Hi"按鈕點擊事件(綁pendingIntent)*/
view.setOnClickPendingIntent(R.id.button_Noti_Hi,pendingIntent);
/*設置"Close"按鈕點擊事件(綁close)*/
view.setOnClickPendingIntent(R.id.button_Noti_Close,close);
/**建置通知欄位的內容*/
NotificationCompat.Builderbuilder
=newNotificationCompat.Builder(MainActivity.this,CHANNEL_ID)
.setSmallIcon(R.drawable.ic_baseline_directions_bike_24)
.setContent(view)
.setAutoCancel(true)
.setOnlyAlertOnce(true)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE);
NotificationManagerCompatnotificationManagerCompat
=NotificationManagerCompat.from(MainActivity.this);
/**發出通知*/
notificationManagerCompat.notify(1,builder.build());
}
};
}
那麼這篇文章就寫到這裡了,FCM我之後也會寫...但等我先研究透徹就是了QQ
感謝各位的閱讀,希望本文有幫助到你(-‿◦)
那麼..
文章標籤
程式設計
筆記
Java
AndroidStudio
Andoird
androidapp開發
androidstudio教學
通知
Notification
Android通知
CreateaNotification
Androidnotification
androidnotification教學
Customnotificationandroid
Android通知图标
android通知栏消息
Androidnotificationclickevent
Androidnotificationchannel
AndroidNotificationdemo
AndroidnotificationRemoteView
全站熱搜
創作者介紹
碼農日常
碼農日常大小事
碼農日常發表在痞客邦留言(7)人氣()
E-mail轉寄
全站分類:進修深造個人分類:Notification通知大法上一篇:碼農日常-『Java&Kotlin』使用Gson解析JSON字串
下一篇:碼農日常-『Androidstudio』如何懸浮按鈕FloatingActionButton/ActionMenu
▲top
留言列表
發表留言
文章分類
Android大小事(61)
Android動畫製作(1)AppWidgetProvider(1)Android無線執行APP(1)Android中各樣的學理應用(6)Android檔案輸出(1)Android權限申請(1)Android串接網路API資料(3)AlertDialog相關(2)ActivityResult取得Activity回傳(1)BatteryMagager電池資訊顯示(1)Broadcast廣播的基本用法(1)Button按鈕的各種技巧(1)BottomNavigationView底部導航攔位(1)Bluetooth(BLE)藍芽4.0系統(2)BottomSheetDialog底部彈出式視窗(1)ClipBoard剪貼簿應用-在Android中自製複製貼上功能 (1)Camera相機功能(1)CalendarView日曆元件(1)CSV檔案製作(1)Canvas畫布(2)Chart圖表繪製(3)DrawerLayout抽屜式視窗(1)EditText文字輸入窗格(3)EventBus與傳送資料(1)ExpandableListView可展開式列表(2)FCM雲端推播通知(2)FirebaseAuth第三方登入(1)FloatingButton懸浮按鈕(1)GooglePlay上架流程(1)GoogleAdMob廣告元件(1)Interpolator插值器應用(1)Interface介面應用小撇步(1)Location取得手機定位(1)ListView列表元件(1)MediaRecoder聲音處理(1)Notification通知大法(1)OTG傳輸相關(1)PDF製作(1)Progress相關之進度UI(1)JSON與GSON應用(2)QRCode掃描機(1)RecyclerView的各種特技(7)RadioButton單選按鈕(1)ScreenMatch螢幕適配(1)SupportDifferentLanguages多國語言設定(1)ScreenShot螢幕截圖(1)ScreenRotate螢幕翻轉的那些鳥事(1)SearchView的基礎設置(1)Spinner下拉式清單(2)SharedPreference儲存機制(1)SharedElement元件點擊放大(1)Service背景執行緒(1)Switch切換按鈕(1)TCP/UDP協定(3)SQLite十全大補(5)Toolbar工具列(1)Thread、Task執行緒(1)ViewPager應用(2)UI元件相關大法(1)UI日夜間模式切換(1)Wifi操作的那些坑(2)
Vue網頁前端大小事(1)
Vue3+docker部署(1)
LikeCoin寫文收入大小事(3)
LikeCoin台幣兌換(1)LikeCoin大小事(1)Ledger冷錢包(1)
生活手札大小事(1)
檢定考的那些大小事(1)
其他各樣筆記本(2)
各式各樣的快速筆記(6)高中程式設計與apcs先修檢測挑戰賽(2)
Arduino大小事(2)
Arduino(3)BLE低功耗藍牙(1)
後端開發大小事(1)
PHP7(2)
出門旅遊大小事(1)
旅遊記事(2)
網誌經營大小事(3)
如何將程式碼寫在網誌內(1)第二年網誌經營心得(1)第一年網誌經營心得(1)
碼農接業配(4)
飛買家xTravelBlue寧靜頸枕(1)天利食堂(1)防疫神器-量子天使1號(1)Norton諾頓防毒軟體~給你電腦最好的保護!(1)
贊助商連結
熱門文章
動態訂閱
月曆
«
十月2022
»
日
一
二
三
四
五
六
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
文章精選
文章精選
2022二月(1)
2022一月(1)
2021十一月(1)
2021十月(3)
2021九月(4)
2021八月(5)
2021七月(5)
2021六月(4)
2021五月(4)
2021四月(4)
2021三月(4)
2021二月(4)
2021一月(4)
2020十二月(5)
2020十一月(4)
2020十月(6)
2020九月(3)
2020八月(5)
2020七月(3)
2020六月(3)
2020五月(5)
2020四月(4)
2020三月(6)
2020二月(6)
2020一月(11)
2019十二月(4)
2019十一月(4)
2019十月(1)
2019七月(1)
2018五月(2)
2017九月(1)
2017八月(2)
2017五月(1)
所有文章列表
誰來我家
參觀人氣
本日人氣:
累積人氣:
站方公告
[公告]2022/09/02相簿、部落格功能維護公告[公告]2022/08/22、08/23應用市集部分功能維護公告[公告]痞客邦APP全新服務上線-美食優惠券
QRCode
回到頁首
回到主文
免費註冊
客服中心
痞客邦首頁
©2003-2022PIXNET
關閉視窗