รับข้อความในแอป Android

เลือกแพลตฟอร์ม: iOS+ Android Web Flutter Unity C++


หากต้องการรับข้อความ คุณสามารถใช้บริการที่ขยาย FirebaseMessagingService ได้ โดยบริการของคุณควรลบล้างการเรียกกลับ onMessageReceived และ onDeletedMessages ดูตัวอย่างที่สมบูรณ์ได้ที่ตัวอย่างการเริ่มต้นใช้งาน Firebase Cloud Messaging อย่างรวดเร็ว

ระบบจะระบุ onMessageReceived ไว้สำหรับข้อความส่วนใหญ่ ยกเว้นข้อความประเภทต่อไปนี้

  • ข้อความการแจ้งเตือนที่ส่งเมื่อแอปอยู่เบื้องหลัง ในกรณีนี้ ระบบจะส่งการแจ้งเตือนไปยังถาดระบบของอุปกรณ์ เมื่อผู้ใช้แตะการแจ้งเตือน ระบบจะเปิดตัวเปิดแอปโดยค่าเริ่มต้น

  • ข้อความที่มีทั้งเพย์โหลดการแจ้งเตือนและเพย์โหลดข้อมูลเมื่อได้รับในเบื้องหลัง ในกรณีนี้ ระบบจะส่งการแจ้งเตือนไปยังถาดระบบของอุปกรณ์ และส่งเพย์โหลดข้อมูลในส่วนเพิ่มเติมของ Intent ของกิจกรรมตัวเปิดแอป

บทสรุปมีดังนี้

สถานะของแอป การแจ้งเตือน ข้อมูล ทั้งสอง
เบื้องหน้า onMessageReceived onMessageReceived onMessageReceived
เบื้องหลัง ถาดระบบ onMessageReceived การแจ้งเตือน: ถาดระบบ ข้อมูล: ในส่วนเพิ่มเติมของ Intent

ดูข้อมูลเพิ่มเติมเกี่ยวกับประเภทข้อความได้ที่การแจ้งเตือนและข้อความข้อมูล messages

การเรียกกลับ onMessageReceived มีหน้าต่างการดำเนินการสั้นๆ ปัจจัยหลายอย่างอาจส่งผลต่อระยะเวลาของหน้าต่างนี้ ซึ่งรวมถึงความล่าช้าของระบบปฏิบัติการ เวลาเริ่มต้นของแอป เธรดหลักถูกบล็อกโดยการดำเนินการอื่นๆ หรือการเรียก onMessageReceived ก่อนหน้านี้ใช้เวลานานเกินไป

ด้วยเหตุนี้ คุณจึงควรหลีกเลี่ยงงานที่ใช้เวลานาน (เช่น การดึงรูปภาพจากเซิร์ฟเวอร์เพื่อแสดงในการแจ้งเตือน) ใน onMessageReceived และกำหนดเวลาให้งานใช้ WorkManager เพื่อจัดการงานที่อาจใช้เวลามากกว่า 2-3 วินาทีจึงจะเสร็จสมบูรณ์ ดูข้อมูลเพิ่มเติมเกี่ยวกับลำดับความสำคัญของข้อความและวิธีที่ ลำดับความสำคัญส่งผลต่อการประมวลผลได้ที่การประมวลผลข้อความสำหรับข้อความที่มีลำดับความสำคัญสูงและปกติ ข้อความ

แก้ไขไฟล์ Manifest ของแอป

หากต้องการใช้ FirebaseMessagingService คุณต้องเพิ่มข้อมูลต่อไปนี้ในไฟล์ Manifest ของแอป

<service
    android:name=".java.MyFirebaseMessagingService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

เราขอแนะนำให้ตั้งค่าเริ่มต้นเพื่อปรับแต่งลักษณะที่ปรากฏของการแจ้งเตือน คุณสามารถระบุไอคอนเริ่มต้นที่กำหนดเองและสีเริ่มต้นที่กำหนดเองซึ่งจะนำไปใช้เมื่อไม่ได้ตั้งค่าที่เทียบเท่าในเพย์โหลดการแจ้งเตือน

เพิ่มบรรทัดต่อไปนี้ภายในแท็ก application เพื่อตั้งค่าไอคอนเริ่มต้นที่กำหนดเองและสีที่กำหนดเอง

<!-- Set custom default icon. This is used when no icon is set for incoming notification messages.
     See README(https://goo.gl/l4GJaQ) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_icon"
    android:resource="@drawable/ic_stat_ic_notification" />
<!-- Set color used with incoming notification messages. This is used when no color is set for the incoming
     notification message. See README(https://goo.gl/6BKBk7) for more. -->
<meta-data
    android:name="com.google.firebase.messaging.default_notification_color"
    android:resource="@color/colorAccent" />

Android จะแสดงและใช้ไอคอนเริ่มต้นที่กำหนดเองสำหรับ

  • ข้อความการแจ้งเตือนทั้งหมดที่ส่งจาก เครื่องมือแต่งการแจ้งเตือน ใน Firebase คอนโซล

  • ข้อความการแจ้งเตือนใดก็ตามที่ไม่ได้ตั้งค่าไอคอนอย่างชัดเจนในเพย์โหลดการแจ้งเตือน

หากไม่ได้ตั้งค่าไอคอนเริ่มต้นที่กำหนดเองและไม่ได้ตั้งค่าไอคอนในเพย์โหลดการแจ้งเตือน Android จะแสดงไอคอนแอปพลิเคชันที่แสดงเป็นสีขาว

ลบล้าง onMessageReceived

การลบล้างเมธอด FirebaseMessagingService.onMessageReceived ช่วยให้คุณ ดำเนินการตาม RemoteMessage ออบเจ็กต์ที่ได้รับและรับข้อมูลข้อความได้

Kotlin

override fun onMessageReceived(remoteMessage: RemoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: ${remoteMessage.from}")

    // Check if message contains a data payload.
    if (remoteMessage.data.isNotEmpty()) {
        Log.d(TAG, "Message data payload: ${remoteMessage.data}")

        // Check if data needs to be processed by long running job
        if (needsToBeScheduled()) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob()
        } else {
            // Handle message within 10 seconds
            handleNow()
        }
    }

    // Check if message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

Java

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    // TODO(developer): Handle FCM messages here.
    // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
    Log.d(TAG, "From: " + remoteMessage.getFrom());

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Log.d(TAG, "Message data payload: " + remoteMessage.getData());

        if (/* Check if data needs to be processed by long running job */ true) {
            // For long-running tasks (10 seconds or more) use WorkManager.
            scheduleJob();
        } else {
            // Handle message within 10 seconds
            handleNow();
        }

    }

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Log.d(TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Also if you intend on generating your own notifications as a result of a received FCM
    // message, here is where that should be initiated. See sendNotification method below.
}

ลบล้าง onDeletedMessages

ในบางกรณี FCM อาจไม่ส่งข้อความ ซึ่งจะเกิดขึ้นเมื่อ มีข้อความที่รอดำเนินการสำหรับแอปของคุณในอุปกรณ์หนึ่งๆ มากเกินไป (>100) ในขณะที่แอปเชื่อมต่อ หรือหากอุปกรณ์ไม่ได้เชื่อมต่อกับ FCM นานกว่า 1 เดือน ในกรณีเหล่านี้ คุณอาจได้รับการเรียกกลับไปยัง FirebaseMessagingService.onDeletedMessages() เมื่ออินสแตนซ์ของแอปได้รับการเรียกกลับนี้ อินสแตนซ์ควรทำการซิงค์ข้อมูลกับเซิร์ฟเวอร์แอปอย่างเต็มรูปแบบ หากคุณ ไม่ได้ส่งข้อความไปยังแอปในอุปกรณ์นั้นภายใน 4 สัปดาห์ที่ผ่านมา FCM จะไม่เรียก onDeletedMessages()

จัดการข้อความการแจ้งเตือนในแอปที่ทำงานอยู่เบื้องหลัง

เมื่อแอปอยู่เบื้องหลัง Android จะส่งข้อความการแจ้งเตือนไปยังถาดระบบ เมื่อผู้ใช้แตะการแจ้งเตือน ระบบจะเปิดตัวเปิดแอปโดยค่าเริ่มต้น

ซึ่งรวมถึงข้อความที่มีทั้งเพย์โหลดการแจ้งเตือนและเพย์โหลดข้อมูล (และข้อความทั้งหมด ที่ส่งจากเครื่องมือแต่งการแจ้งเตือนในคอนโซล Firebase) ในกรณีเหล่านี้ ระบบจะส่งการแจ้งเตือนไปยังถาดระบบของอุปกรณ์ และส่งเพย์โหลดข้อมูลในส่วนเพิ่มเติมของ Intent ของกิจกรรมตัวเปิดแอป

หากต้องการดูข้อมูลเชิงลึกเกี่ยวกับการส่งข้อความไปยังแอป ให้ไปที่แดชบอร์ด DevOps และการมีส่วนร่วม > การรับส่งข้อความ > รายงาน ในคอนโซลFirebase แดชบอร์ดนี้จะบันทึกจำนวนข้อความที่ส่งและเปิดในอุปกรณ์ Apple และ Android รวมถึงข้อมูล "การแสดงผล" (การแจ้งเตือนที่ผู้ใช้เห็น) สำหรับแอป Android