Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Android

วิธีจัดตาราง Local Notification ใน Android (Scheduled)

ภาพรวม

ตัวอย่างนี้เหมือนกับบทความก่อนหน้า (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)

  1. ใช้ WorkManager สำหรับงานที่ต้องการความน่าเชื่อถือสูง และทำงานได้แม้แอปถูกฆ่า (แทน AlarmManager)
  2. จัดกลุ่ม Notification ด้วย setGroup() เพื่อไม่ให้แจ้งเตือนเยอะเกินไป
  3. ตั้งค่า Channel ให้ถูกต้อง Importance HIGH/MAX จะมีเสียง/สั่น DEFAULT ไม่มีเสียง
  4. ขอ Permission รันไทม์ Android 13+ ต้องขอ POST_NOTIFICATIONS จากผู้ใช้
  5. จัดการ 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 ให้อัตโนมัติ เหมาะสำหรับการแจ้งเตือนที่ต้องการความน่าเชื่อถือ