Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

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

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

การจัดการข้อความ

หากต้องการรับข้อความ ให้ใช้บริการที่ขยาย FirebaseMessagingService บริการของคุณควรแทนที่การเรียกกลับ onMessageReceived และ onDeletedMessages ควรจัดการข้อความภายใน 20 วินาทีหลังจากได้รับ (10 วินาทีใน Android Marshmallow) กรอบเวลาอาจสั้นลงขึ้นอยู่กับความล่าช้าของระบบปฏิบัติการที่เกิดขึ้นก่อนการโทรบน onMessageReceived หลังจากนั้น พฤติกรรมต่างๆ ของระบบปฏิบัติการ เช่น การจำกัดการทำงานเบื้องหลัง ของ Android O อาจรบกวนความสามารถในการทำงานของคุณให้เสร็จ สำหรับข้อมูลเพิ่มเติม โปรดดูภาพรวมเกี่ยวกับ ลำดับความสำคัญของข้อความ

onMessageReceived มีไว้สำหรับข้อความส่วนใหญ่ โดยมีข้อยกเว้นดังต่อไปนี้:

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

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

สรุป:

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

แก้ไขรายการแอป

ในการใช้ FirebaseMessagingService คุณต้องเพิ่มสิ่งต่อไปนี้ในรายการแอปของคุณ:

<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 แสดงไอคอนเริ่มต้นที่กำหนดเองสำหรับ

  • ข้อความแจ้งเตือนทั้งหมดที่ส่งจากผู้ แต่งการแจ้งเตือน
  • ข้อความแจ้งเตือนใดๆ ที่ไม่ได้ตั้งค่าไอคอนไว้อย่างชัดเจนในส่วนข้อมูลการแจ้งเตือน

Android ใช้สีเริ่มต้นที่กำหนดเองสำหรับ

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

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

แทนที่ onMessageReceived

โดยการแทนที่วิธีการ FirebaseMessagingService.onMessageReceived คุณสามารถดำเนินการตามวัตถุ RemoteMessage ที่ได้รับและรับข้อมูลข้อความ:

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.
}

Kotlin+KTX

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}")

        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.
    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.
}

แทนที่ onDeletedMessages

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

จัดการข้อความแจ้งเตือนในแอปพื้นหลัง

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

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

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

แอปที่จำกัดในเบื้องหลัง (Android P หรือใหม่กว่า)

FCM อาจไม่ส่งข้อความไปยังแอปที่ถูก จำกัดการใช้งานเบื้องหลัง โดยผู้ใช้ (เช่น ผ่าน: การตั้งค่า -> แอปและการแจ้งเตือน -> [ชื่อแอป] -> แบตเตอรี่) เมื่อแอปของคุณถูกลบออกจากการจำกัดพื้นหลังแล้ว ข้อความใหม่ไปยังแอปจะถูกส่งเหมือนเดิม เพื่อป้องกันข้อความสูญหายและผลกระทบจากข้อจำกัดในเบื้องหลังอื่นๆ ให้หลีกเลี่ยงพฤติกรรมที่ไม่ดีตามรายการของความพยายามของ Android Vitals ลักษณะการทำงานเหล่านี้อาจทำให้อุปกรณ์ Android แนะนำให้ผู้ใช้ทราบว่าแอปของคุณถูกจำกัดการทำงานในเบื้องหลัง แอปของคุณสามารถตรวจสอบได้ว่ามีการจำกัดพื้นหลังโดยใช้: isBackgroundRestricted()

รับข้อความ FCM ในโหมดบูตโดยตรง

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

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

ข้อกำหนดเบื้องต้น

  • ต้องตั้งค่าอุปกรณ์สำหรับโหมดการบูตโดยตรง
  • อุปกรณ์ต้องติดตั้งบริการ Google Play เวอร์ชันล่าสุด (19.0.54 ขึ้นไป)
  • แอปต้องใช้ FCM SDK ( com.google.firebase:firebase-messaging ) เพื่อรับข้อความ FCM

เปิดใช้งานการจัดการข้อความโหมดบูตโดยตรงในแอปของคุณ

  1. ในไฟล์ Gradle ระดับแอป เพิ่มการพึ่งพาไลบรารีสนับสนุนการบูตโดยตรงของ FCM:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. ทำให้การบูตโดยตรงของ FirebaseMessagingService ของแอปรับรู้โดยเพิ่มแอตทริบิวต์ android:directBootAware="true" ในรายการแอป:

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

สิ่งสำคัญคือต้องตรวจสอบให้แน่ใจว่า FirebaseMessagingService นี้สามารถทำงานในโหมดการบูตโดยตรง ตรวจสอบข้อกำหนดต่อไปนี้:

  • บริการไม่ควรเข้าถึงที่เก็บข้อมูลที่มีการป้องกันข้อมูลประจำตัวในขณะที่ทำงานในโหมดบูตโดยตรง
  • บริการไม่ควรพยายามใช้ส่วนประกอบ เช่น Activities , BroadcastReceivers หรือ Services อื่นๆ ที่ไม่ได้ทำเครื่องหมายว่ารับรู้การบูตโดยตรงขณะทำงานในโหมดการบูตโดยตรง
  • ไลบรารีใด ๆ ที่บริการใช้จะต้องไม่เข้าถึงที่เก็บข้อมูลที่มีการป้องกันข้อมูลรับรองหรือเรียกส่วนประกอบที่ไม่ใช่ directBootAware ขณะทำงานในโหมดบูตโดยตรง ซึ่งหมายความว่าไลบรารีใด ๆ ที่แอพใช้ซึ่งถูกเรียกจากบริการจะต้องรับรู้การบู๊ตโดยตรงหรือแอพจะต้องตรวจสอบว่าทำงานในโหมดการบู๊ตโดยตรงหรือไม่และไม่ได้เรียกในโหมดนั้น ตัวอย่างเช่น Firebase SDK ทำงานกับการบูตโดยตรง (รวมไว้ในแอปได้โดยไม่ขัดข้องในโหมดการบูตโดยตรง) แต่ Firebase API จำนวนมากไม่รองรับการเรียกในโหมดการบูตโดยตรง
  • หากแอปใช้แอปพลิเคชันที่กำหนดเอง Application Application จะต้องรับรู้การบูตโดยตรงด้วย (ไม่สามารถเข้าถึงที่เก็บข้อมูลที่มีการป้องกันข้อมูลรับรองในโหมดการบูตโดยตรง)

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

,

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

การจัดการข้อความ

หากต้องการรับข้อความ ให้ใช้บริการที่ขยาย FirebaseMessagingService บริการของคุณควรแทนที่การเรียกกลับ onMessageReceived และ onDeletedMessages ควรจัดการข้อความภายใน 20 วินาทีหลังจากได้รับ (10 วินาทีใน Android Marshmallow) กรอบเวลาอาจสั้นลงขึ้นอยู่กับความล่าช้าของระบบปฏิบัติการที่เกิดขึ้นก่อนการโทรบน onMessageReceived หลังจากนั้น พฤติกรรมต่างๆ ของระบบปฏิบัติการ เช่น การจำกัดการทำงานเบื้องหลัง ของ Android O อาจรบกวนความสามารถในการทำงานของคุณให้เสร็จ สำหรับข้อมูลเพิ่มเติม โปรดดูภาพรวมเกี่ยวกับ ลำดับความสำคัญของข้อความ

onMessageReceived มีไว้สำหรับข้อความส่วนใหญ่ โดยมีข้อยกเว้นดังต่อไปนี้:

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

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

สรุป:

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

แก้ไขรายการแอป

ในการใช้ FirebaseMessagingService คุณต้องเพิ่มสิ่งต่อไปนี้ในรายการแอปของคุณ:

<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 แสดงไอคอนเริ่มต้นที่กำหนดเองสำหรับ

  • ข้อความแจ้งเตือนทั้งหมดที่ส่งจากผู้ แต่งการแจ้งเตือน
  • ข้อความแจ้งเตือนใดๆ ที่ไม่ได้ตั้งค่าไอคอนไว้อย่างชัดเจนในส่วนข้อมูลการแจ้งเตือน

Android ใช้สีเริ่มต้นที่กำหนดเองสำหรับ

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

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

แทนที่ onMessageReceived

โดยการแทนที่วิธีการ FirebaseMessagingService.onMessageReceived คุณสามารถดำเนินการตามวัตถุ RemoteMessage ที่ได้รับและรับข้อมูลข้อความ:

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.
}

Kotlin+KTX

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}")

        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.
    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.
}

แทนที่ onDeletedMessages

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

จัดการข้อความแจ้งเตือนในแอปพื้นหลัง

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

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

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

แอปที่จำกัดในเบื้องหลัง (Android P หรือใหม่กว่า)

FCM อาจไม่ส่งข้อความไปยังแอปที่ถูก จำกัดการใช้งานเบื้องหลัง โดยผู้ใช้ (เช่น ผ่าน: การตั้งค่า -> แอปและการแจ้งเตือน -> [ชื่อแอป] -> แบตเตอรี่) เมื่อแอปของคุณถูกลบออกจากการจำกัดพื้นหลังแล้ว ข้อความใหม่ไปยังแอปจะถูกส่งเหมือนเดิม เพื่อป้องกันข้อความสูญหายและผลกระทบจากข้อจำกัดในเบื้องหลังอื่นๆ ให้หลีกเลี่ยงพฤติกรรมที่ไม่ดีตามรายการของความพยายามของ Android Vitals ลักษณะการทำงานเหล่านี้อาจทำให้อุปกรณ์ Android แนะนำให้ผู้ใช้ทราบว่าแอปของคุณถูกจำกัดการทำงานในเบื้องหลัง แอปของคุณสามารถตรวจสอบได้ว่ามีการจำกัดพื้นหลังโดยใช้: isBackgroundRestricted()

รับข้อความ FCM ในโหมดบูตโดยตรง

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

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

ข้อกำหนดเบื้องต้น

  • ต้องตั้งค่าอุปกรณ์สำหรับโหมดการบูตโดยตรง
  • อุปกรณ์ต้องติดตั้งบริการ Google Play เวอร์ชันล่าสุด (19.0.54 ขึ้นไป)
  • แอปต้องใช้ FCM SDK ( com.google.firebase:firebase-messaging ) เพื่อรับข้อความ FCM

เปิดใช้งานการจัดการข้อความโหมดบูตโดยตรงในแอปของคุณ

  1. ในไฟล์ Gradle ระดับแอป เพิ่มการพึ่งพาไลบรารีสนับสนุนการบูตโดยตรงของ FCM:

    implementation 'com.google.firebase:firebase-messaging-directboot:20.2.0'
    
  2. ทำให้การบูตโดยตรงของ FirebaseMessagingService ของแอปรับรู้โดยเพิ่มแอตทริบิวต์ android:directBootAware="true" ในรายการแอป:

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

สิ่งสำคัญคือต้องตรวจสอบให้แน่ใจว่า FirebaseMessagingService นี้สามารถทำงานในโหมดการบูตโดยตรง ตรวจสอบข้อกำหนดต่อไปนี้:

  • บริการไม่ควรเข้าถึงที่เก็บข้อมูลที่มีการป้องกันข้อมูลประจำตัวในขณะที่ทำงานในโหมดบูตโดยตรง
  • บริการไม่ควรพยายามใช้ส่วนประกอบ เช่น Activities , BroadcastReceivers หรือ Services อื่นๆ ที่ไม่ได้ทำเครื่องหมายว่ารับรู้การบูตโดยตรงขณะทำงานในโหมดการบูตโดยตรง
  • ไลบรารีใด ๆ ที่บริการใช้จะต้องไม่เข้าถึงที่เก็บข้อมูลที่มีการป้องกันข้อมูลรับรองหรือเรียกส่วนประกอบที่ไม่ใช่ directBootAware ขณะทำงานในโหมดบูตโดยตรง ซึ่งหมายความว่าไลบรารีใด ๆ ที่แอพใช้ซึ่งถูกเรียกจากบริการจะต้องรับรู้การบู๊ตโดยตรงหรือแอพจะต้องตรวจสอบว่าทำงานในโหมดการบู๊ตโดยตรงหรือไม่และไม่ได้เรียกในโหมดนั้น ตัวอย่างเช่น Firebase SDK ทำงานกับการบูตโดยตรง (รวมไว้ในแอปได้โดยไม่ขัดข้องในโหมดการบูตโดยตรง) แต่ Firebase API จำนวนมากไม่รองรับการเรียกในโหมดการบูตโดยตรง
  • หากแอปใช้แอปพลิเคชันที่กำหนดเอง Application Application จะต้องรับรู้การบูตโดยตรงด้วย (ไม่สามารถเข้าถึงที่เก็บข้อมูลที่มีการป้องกันข้อมูลรับรองในโหมดการบูตโดยตรง)

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