Image Credit : http://developer.android.com/
บทความว่าด้วยเรื่องการทำ Notification บน Android ในบทความนี้จะพูดถึงว่า Notification คืออะไร และการใช้งานเบื้องต้นเท่านั้น ไม่รวมถึง Push Notification ต่างๆ เช่น ใช้ Parse , GCM หรือ implement Server เอง (จะไว้เขียนในบทความถัดๆไป)
Notification
Notification คืออะไร ? จริงๆ Notification มันก็คือข้อความแจ้งเตือนรูปแบบหนึ่งเท่านั้น ซึ่งจะแตกต่างจากพวก Toast หรือ Snackbar ตรงที่ ไม่จำเป็นที่แอพพลิเคชันของเราทำงานอยู่ มันก็สามารถแสดงการแจ้งเตือนข้อความ Notification ได้ นอกจากข้อความแจ้งเตือนแล้ว Notification ยังสั่น หรือมีเสียงได้อีกด้วย
อ่านเพิ่มเติมเกี่ยวกับ Notification ได้ที่ Android Notifications
มาลองสร้าง Notification จริงๆกันเลยดีกว่า
Step 1 : Create Project
ทำการสร้างโปรเจ็ค Android ขึ้นมา โดยผมกำหนด API เวอร์ชั่น ดังภาพ
ควรทำการดาวน์โหลด Support Library มาซะก่อน เนื่องจากบทความนี้ใช้ NotificationCompat
ซึ่งมีใน Support Library เท่านั้น
ไฟล์หลักจะเป็น MainActivity.java
และเลเอาท์หลักจะเป็น activity_main.xml
ต่อมาทำการเพิ่มปุ่ม Button ปุ่มนี้จะเอาไว้สำหรับกด เพื่อให้โชว์ Notification ฉะนั้นก็ไม่มีอะไรมาก ใช้ xml syntax onClick:""
ลงไปเลย เนื่องจากขี้เกียจ binding View ในโปรแกรม :) ฉะนั้นไฟล์ activity_main.xml
จะได้ดังนี้
ที่ไฟล์ MainActivity.java
ก็เพิ่มเมธอดสำหรับ onClick
event ดังนี้
Note : สำหรับวิธีการทำ Button OnClick สามารถอ่านเพิ่มเติมได้ที่นี่
Step 3 : Create Notification
ส่วนประกอบในการสร้าง Notification จะประกอบไปด้วย
- setContentTitle() : แสดงหัวข้อของ Notification
- setContentText() : เอาไว้แสดงข้อความของ Notification
- setSmallIcon() : เอาไว้แสดงไอคอนของ Notification
ส่วนประกอบอื่นๆ เป็น Optional เสริม เช่น
- setAutoCancel() : เอาไว้กำหนด ให้ลบ Notification เมื่อกดหรือไม่
- setGroup() : แบ่งกลุ่มให้กับ Notification
- setStyle() : ปรับแต่งรูปแบบ Notification
- setContentIntent() : เอาไว้ส่ง PendingIntent เมื่อกด Notification
การสร้าง Notification จะทำการสร้างจาก NotificationCompat.Builder
กัน โดยเพิ่มโค๊ดภายในเมธอด showNotification()
ดังนี้
ตอนนี้เราก็ได้ Notification ขึ้นมาแล้ว โดยมีไอคอน หัวข้อ และข้อความตามที่เรากำหนด แต่ว่ามันจะไม่โชว์บน ActionBar จนกว่าเราจะสั่ง และคำสั่งที่จะใช้โชว์ก็คือ notify()
ซึ่งต้องใช้คลาส NotificationManager
เข้ามาช่วย ดังนี้
โดยเมธอด notify(int id, Notification notification)
จะรับ parameter เป็น id และ ออปเจ็ค Notification ที่เราทำการสร้างขึ้นก่อนหน้านี้
ทดสอบรันโปรแกรม เมื่อคลิก Button จะเห็น Notification ปรากฎ แสดงว่าถูกต้อง
แต่ว่าเดี๋ยวก่อน เมื่อกดแล้วไม่มีอะไรเกิดขึ้นใช่หรือไม่? ต่อมาเราลองเขียนเพิ่ม ว่า เมื่อมีการกด Notification จะให้มันไปทำงานอะไรต่อดี
Step 4 : Notification Actions
ต่อมา ทำการเพิ่ม Action เมื่อกด Notification ในตัวอย่าง จะทำการเปิดเว็บไซต์ devahoy.com โดยใช้ PendingIntent ดังนี้ เพิ่มโค๊ดไว้ก่อนการสร้าง Notification
จากนั้นตรงส่วน NotificationCompat.Builder()
ที่เอาไว้สร้าง Notification ก็ทำการเพิ่ม setContentIntent()
ดังนี้
สุดท้ายเมธอด showNotification()
จะได้ดังนี้
เอ๊ะถ้าเรา อยากจะทำการเปิดอีก Activity แทนที่จะเปิดหน้าเว็บด้วย PendingIntent จะทำได้ไหม ? คำตอบคือได้ครับ
Step 5 : Start new Activity
ทำการสร้าง Activity ขึ้นมาใหม่อีกหนึ่งตัวชื่อว่า PushActivity.java
และไฟล์ activity_push.xml
ดังนี้
จากนั้นเพิ่ม PushActivity
ลงไปใน AndroidManifest.xml
ดังนี้
จากนั้นที่คลาส MainActivity.java
ทำการสร้าง Intent
ขึ้นมาใหม่แทนอันเก่า ดังนี้
ส่วนข้อความและ title ก็ประกาศเป็น static final ไป
เมื่อแตะ Notification จะ putExtra()
ส่งข้อความไปยัง PushActivity
ด้วย ฉะนั้นที่คลาส PushActivity.java
ก็ทำการรับ Intent และแสดงข้อความใส่ TextView ดังนี้
ทดสอบรันโปรแกรมอีกครั้ง ลองกดปุ่ม Button เพื่อแสดง Notification และเมื่อแตะ Notification แอพก็จะไปเปิดหน้า PushActivity ซึ่งมีข้อความแสดงอยู่ เป็นอันเรียบร้อย :D
สรุปขั้นตอนการสร้าง Notification
- ใช้
Notification.Builder()
เพื่อทำกำหนดค่าต่างๆ จากนั้น build()
เพื่อให้ได้ออปเจ็คNotification
ขึ้นมา
- ใช้
NotificationManager
เพื่อทำการแสดง Notification ด้วย notify()
- หากต้องการเพิ่ม Action ให้ Notification ก็ต้องทำการกำหนด ก่อนที่จะทำการ
build()
สุดท้าย Notification ก็ยังมีอะไรให้เล่นอีกเยอะ custom อะไรได้มากมาย ทั้งการใส่ Progress ลงบน Notification การกำหนดความสำคัญ (Priority) ใส่การสั่น เพิ่มเสียง เพ่ิม/ลบ Stack Notification หรืออื่นๆอีกเยอะแยะ ลองไปเล่นกันดูครับ สำหรับบทความนี้ก็ขอฝากไว้เพียงเท่านี้ :)