ภาพรวม
ตัวอย่างนี้เหมือนกับบทความก่อนหน้า (ID 1004061556) สาธิตการใช้ AlarmManager และ BroadcastReceiver เพื่อจัดตารางแสดง Local Notification ในอนาคต
โครงสร้างไฟล์ (เหมือนบทความก่อนหน้า)
เนื่องจากโค้ดเหมือนกันสมบูรณ์แบบ จึงสรุปเฉพาะส่วนสำคัญและข้อแตกต่างในการใช้งานจริง
ไฟล์หลัก
- MainActivity.java: UI เลือกเวลา, สร้าง Notification, เรียก AlarmManager
- MyNotificationPublisher.java: BroadcastReceiver รับสัญญาณจาก AlarmManager แล้วแสดง Notification
- main_menu.xml: เมนูเลือกเวลา 5, 10, 30 วินาที
- AndroidManifest.xml: ประกาศ Receiver และ Permission
รูปแบบการใช้ AlarmManager
| ประเภท | คำอธิบาย | เหมาะสำหรับ |
|---|---|---|
| ELAPSED_REALTIME | นับจากบูท ไม่ปลุกอุปกรณ์ | งานที่ไม่ดחוף |
| ELAPSED_REALTIME_WAKEUP | นับจากบูท + ปลุกอุปกรณ์ | การแจ้งเตือน准时 |
| RTC | เวลาปฏิทิน ไม่ปลุกอุปกรณ์ | งานตามนาฬิกา |
| RTC_WAKEUP | เวลาปฏิทิน + ปลุกอุปกรณ์ | นาฬิกาปลุก, ปฏิทิน |
โค้ดสำคัญ: scheduleNotification()
private void scheduleNotification(Notification notification, int delay) {
Intent intent = new Intent(this, MyNotificationPublisher.class);
intent.putExtra(MyNotificationPublisher.NOTIFICATION_ID, 1);
intent.putExtra(MyNotificationPublisher.NOTIFICATION, notification);
PendingIntent pendingIntent = PendingIntent.getBroadcast(
this, 0, intent, PendingIntent.FLAG_IMMUTABLE);
long triggerTime = SystemClock.elapsedRealtime() + delay;
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerTime, pendingIntent);
}
แนวทางปฏิบัติที่ดี (Best Practices)
- ใช้ WorkManager สำหรับงานที่ต้องการความน่าเชื่อถือสูง และทำงานได้แม้แอปถูกฆ่า (แทน AlarmManager)
- จัดกลุ่ม Notification ด้วย setGroup() เพื่อไม่ให้แจ้งเตือนเยอะเกินไป
- ตั้งค่า Channel ให้ถูกต้อง Importance HIGH/MAX จะมีเสียง/สั่น DEFAULT ไม่มีเสียง
- ขอ Permission รันไทม์ Android 13+ ต้องขอ POST_NOTIFICATIONS จากผู้ใช้
- จัดการ Reboot รับ BOOT_COMPLETED broadcast แล้วจัดตารางการแจ้งเตือนใหม่
ตัวอย่าง WorkManager (แนะนำสำหรับโปรดักชัน)
// Dependency: implementation "androidx.work:work-runtime-ktx:2.9.0"
OneTimeWorkRequest notificationWork = new OneTimeWorkRequest.Builder(NotificationWorker.class)
.setInitialDelay(5, TimeUnit.SECONDS)
.build();
WorkManager.getInstance(context).enqueue(notificationWork);
WorkManager จัดการ Doze Mode, App Standby, และ Reboot ให้อัตโนมัติ เหมาะสำหรับการแจ้งเตือนที่ต้องการความน่าเชื่อถือ