Android ขั้นสูงใน Kotlin 01.2: Android Firebase Cloud Messaging

Codelab นี้เป็นส่วนหนึ่งของหลักสูตร Android ขั้นสูงใน Kotlin คุณจะได้รับประโยชน์สูงสุดจากหลักสูตรนี้ หากเรียนผ่าน Codelab ตามลําดับ แต่ไม่บังคับ Codelab ของหลักสูตรทั้งหมดจะแสดงอยู่ในหน้า Landing Page ขั้นสูงของ Android ใน Kotlin Codelab

บทนำ

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

ข้อความ Push คืออะไร

ข้อความ Push คือการแจ้งเตือนที่เซิร์ฟเวอร์ส่ง &&quot ไปยังอุปกรณ์เคลื่อนที่ โดยจะนําส่งไปยังอุปกรณ์ได้ไม่ว่าแอปจะทํางานหรือไม่ก็ตาม

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

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

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

Firebase Cloud Messaging คืออะไร

Firebase Cloud Messaging เป็นส่วนหนึ่งของแพลตฟอร์ม Firebase สําหรับการพัฒนาบนอุปกรณ์เคลื่อนที่ โดยปกติคุณจะต้องตั้งค่าเซิร์ฟเวอร์ตั้งแต่ต้นที่จะสื่อสารกับอุปกรณ์เคลื่อนที่เพื่อเรียกใช้การแจ้งเตือนได้ คุณสามารถใช้การรับส่งข้อความในระบบคลาวด์ของ Firebase เพื่อส่งการแจ้งเตือนถึงผู้ใช้แอปที่ติดตั้งไว้ทั้งหมดหรือบางส่วน โดยไม่ต้องตั้งค่าเซิร์ฟเวอร์ ตัวอย่างเช่น คุณจะส่งการช่วยเตือนให้ผู้ใช้หรือมอบโปรโมชันพิเศษให้แก่ผู้ใช้ เช่น ของขวัญฟรีก็ได้

คุณยังใช้ Firebase Cloud Messages เพื่อโอนข้อมูลจากแอปแบ็กเอนด์หรือจากโปรเจ็กต์ Firebase ไปยังผู้ใช้ได้อีกด้วย

ใน Codelab นี้ คุณจะได้ดูวิธีใช้ Firebase Cloud Messaging เพื่อส่งข้อความ Push สําหรับแอป Android รวมถึงส่งข้อมูล

หากคุณประสบปัญหาใดๆ (ข้อบกพร่องของโค้ด ข้อผิดพลาดทางไวยากรณ์ การใช้คําไม่ชัดเจน ฯลฯ) ขณะเรียกใช้ Codelab นี้ โปรดรายงานปัญหาผ่านลิงก์รายงานข้อผิดพลาดที่มุมซ้ายล่างของ Codelab

สิ่งที่ควรทราบอยู่แล้ว

คุณควรทําความคุ้นเคยกับสิ่งต่อไปนี้

  • วิธีสร้างแอป Android ใน Kotlin โดยเฉพาะอย่างยิ่งให้ทํางานร่วมกับ Android SDK
  • วิธีออกแบบแอปโดยใช้คอมโพเนนต์สถาปัตยกรรมและการเชื่อมโยงข้อมูล
  • ความเข้าใจเบื้องต้นเกี่ยวกับผู้รับการกระจายข้อมูล
  • ความเข้าใจพื้นฐานเกี่ยวกับ Alarm Manager
  • วิธีสร้างและส่งการแจ้งเตือนโดยใช้ AlertManager

สิ่งที่คุณจะได้เรียนรู้

  • วิธีพุชข้อความไปยังผู้ใช้ผ่านการรับส่งข้อความในระบบคลาวด์ของ Firebase
  • วิธีส่งข้อมูลจากแบ็กเอนด์ไปยังแอปโดยใช้ข้อความข้อมูล ซึ่งเป็นส่วนหนึ่งของ Firebase Cloud Messaging

สิ่งที่คุณจะทํา

  • เพิ่มข้อความ Push ลงในแอปเริ่มต้น
  • จัดการ Firebase Cloud Messaging ในขณะที่แอปทํางานอยู่
  • โอนข้อมูลด้วยการรับส่งข้อความในระบบคลาวด์ของ Firebase

ใน Codelab นี้ คุณจะต้องทํางานกับโค้ดจากการใช้การแจ้งเตือนในแอป Codelab ของ Android ก่อนหน้านี้ ใน Codelab ที่ผ่านมา คุณสร้างแอปตัวจับเวลาไข่ที่ส่งการแจ้งเตือนเมื่อตัวจับเวลาการทําอาหารครบกําหนด ใน Codelab นี้ คุณจะได้เพิ่ม Firebase Cloud Messaging เพื่อส่งข้อความ Push ให้ผู้ใช้แอปเพื่อช่วยเตือนว่ากินไข่

หากต้องการดาวน์โหลดแอปตัวอย่าง ให้ทําอย่างใดอย่างหนึ่งต่อไปนี้

โคลนที่เก็บจาก GitHub และเปลี่ยนไปใช้สาขาเริ่มต้น ดังนี้

$  git clone https://github.com/googlecodelabs/android-kotlin-notifications-fcm


คุณอาจดาวน์โหลดที่เก็บเป็นไฟล์ ZIP แล้วแตกไฟล์ และเปิดใน Android Studio ได้ด้วย

ดาวน์โหลด Zip

ขั้นตอนที่ 1: สร้างโปรเจ็กต์ Firebase

ก่อนที่จะเพิ่ม Firebase ไปยังแอป Android ได้ คุณต้องสร้างโปรเจ็กต์ Firebase เพื่อเชื่อมต่อกับแอป Android ก่อน

  1. ลงชื่อเข้าสู่ระบบคอนโซล Firebase
  2. คลิกเพิ่มโปรเจ็กต์ แล้วเลือกหรือป้อนชื่อโปรเจ็กต์ ตั้งชื่อโปรเจ็กต์เป็น fcm-codelab
  3. คลิกต่อไป
  4. คุณข้ามการตั้งค่า Google Analytics ได้โดยปิดปุ่มเปิดใช้ Google Analytics สําหรับโปรเจ็กต์นี้
  5. คลิกสร้างโปรเจ็กต์เพื่อตั้งค่าโปรเจ็กต์ Firebase ให้เสร็จสิ้น

ขั้นตอนที่ 2: ลงทะเบียนแอปด้วย Firebase

เมื่อคุณมีโปรเจ็กต์ Firebase แล้ว คุณสามารถเพิ่มแอป Android ลงในโปรเจ็กต์ได้

  1. ที่ตรงกลางของหน้าภาพรวมโปรเจ็กต์ของ Firebase Console ##99 ให้คลิกไอคอน Android เพื่อเปิดเวิร์กโฟลว์การตั้งค่า

  1. ในช่อง ชื่อแพ็กเกจของ Android ให้ป้อน com.example.android.eggtimernotifications
  2. คลิกลงทะเบียนแอป

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

ขั้นตอนที่ 3: เพิ่มไฟล์การกําหนดค่า Firebase ในโปรเจ็กต์

เพิ่มไฟล์การกําหนดค่า Firebase Android ลงในแอป

  1. คลิกดาวน์โหลด google-services.json เพื่อรับไฟล์การกําหนดค่า Android Android (google-services.json) ตรวจสอบว่าไฟล์การกําหนดค่าไม่ได้ต่อท้ายอักขระเพิ่มเติมและตั้งชื่อว่า google-services.json อย่างถูกต้อง
  2. ย้ายไฟล์การกําหนดค่าไปยังไดเรกทอรีโมดูล (ระดับแอป) ของแอป

ขั้นตอนที่ 4: กําหนดค่าโปรเจ็กต์ Android เพื่อเปิดใช้ผลิตภัณฑ์ Firebase

หากต้องการเปิดใช้ผลิตภัณฑ์ Firebase ในแอป คุณต้องเพิ่มปลั๊กอิน google-services ลงในไฟล์ Gradle

  1. ในไฟล์ Gradle ระดับรูท (ระดับโปรเจ็กต์) (build.gradle) ให้ตรวจสอบว่าคุณมีที่เก็บ Maven ของ Google
  2. จากนั้นเพิ่มกฎเพื่อรวมปลั๊กอินบริการของ Google

build.gradle

buildscript {

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
  }

  dependencies {
    // ...

    // Add the following line:
    classpath 'com.google.gms:google-services:4.3.2'  // Google Services plugin
  }
}

allprojects {
  // ...

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
    // ...
  }
}
  1. ในไฟล์ Gradle ระดับโมดูล (ระดับแอป) (โดยทั่วไปคือ app/build.gradle) ให้เพิ่มบรรทัดเพื่อใช้ปลั๊กอินที่ด้านล่างของไฟล์

app/build.gradle

apply plugin: 'com.android.application'

android {
  // ...
}

// Add the following line to the bottom of the file:
apply plugin: 'com.google.gms.google-services'  // Google Play services Gradle plugin

ในงานนี้ คุณจะต้องเพิ่ม Firebase Cloud Messaging (FCM) ไปยังโปรเจ็กต์ของคุณเพื่อใช้ประโยชน์จากข้อความ Push

รหัสบริการ Android สําหรับ FCM ของ Codelab นี้จะมอบไว้ใน MyFirebaseMessagingService.kt ในขั้นตอนต่อไป คุณจะต้องเพิ่มโค้ดในแอป Android

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

  1. เปิด "MyFirebaseMessagingService.kt"
  2. ตรวจสอบไฟล์และโดยเฉพาะฟังก์ชันต่อไปนี้
  • onNewToken() - เรียกใช้โดยอัตโนมัติหากบริการของคุณลงทะเบียนในไฟล์ Manifest ของ Android ระบบจะเรียกใช้ฟังก์ชันนี้เมื่อคุณเรียกใช้แอปเป็นครั้งแรก และทุกครั้งที่ Firebase ออกโทเค็นใหม่สําหรับแอป โทเค็นคือคีย์การเข้าถึงโปรเจ็กต์แบ็กเอนด์ของ Firebase ค่านี้สร้างขึ้นมาสําหรับอุปกรณ์ไคลเอ็นต์เครื่องใดเครื่องหนึ่งของคุณ เมื่อใช้โทเค็นนี้ Firebase จะรู้ว่าแบ็กเอนด์ควรส่งข้อความใดไปยังไคลเอ็นต์ Firebase จะทราบด้วยว่าไคลเอ็นต์นี้ถูกต้องและมีสิทธิ์เข้าถึงโปรเจ็กต์ Firebase นี้ไหม
  • onMessageReceived - เรียกใช้เมื่อแอปทํางานอยู่ และ Firebase ส่งข้อความไปยังแอป ฟังก์ชันนี้จะได้รับออบเจ็กต์ RemoteMessage ซึ่งสามารถส่งการแจ้งเตือนหรือเพย์โหลดของข้อความได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับความแตกต่างระหว่างเพย์โหลดการแจ้งเตือนและเพย์โหลดข้อมูลข้อความได้ในภายหลังใน Codelab นี้

ขั้นตอนที่ 1: การส่งการแจ้งเตือน FCM ไปยังอุปกรณ์เดียว

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

เมื่อแบ็กเอนด์ของ Firebase สร้างโทเค็นใหม่หรือรีเฟรช ระบบจะเรียกใช้ฟังก์ชัน onNewToken() โดยมีโทเค็นใหม่ที่ส่งผ่านเป็นอาร์กิวเมนต์ หากต้องการกําหนดเป้าหมายอุปกรณ์เดียวหรือสร้างกลุ่มอุปกรณ์ที่ต้องการส่งข้อความประกาศ คุณจะต้องเข้าถึงโทเค็นนี้โดยขยาย FirebaseMessagingService และลบล้าง onNewToken()

  1. เปิด AndroidManifest.xml และยกเลิกการแสดงความคิดเห็นรหัสต่อไปนี้เพื่อเปิดใช้ MyFirebaseMessagingService สําหรับแอปตัวจับเวลาไข่ ข้อมูลเมตาบริการในไฟล์ Manifest ของ Android จะลงทะเบียน MyFirebaseMessagingService เป็นบริการและเพิ่มตัวกรอง Intent เพื่อรับบริการนี้ข้อความที่ส่งจาก FCM ส่วนสุดท้ายของข้อมูลเมตาจะประกาศว่า breakfast_notification_channel_id เป็น default_notification_channel_id สําหรับ Firebase คุณจะใช้รหัสนี้ในขั้นตอนถัดไป
<!-- AndroidManifest.xml -->
<!-- TODO: Step 3.0 uncomment to start the service  -->

        <service
                android:name=".MyFirebaseMessagingService"
                android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT"/>
            </intent-filter>
        </service>
        <!-- [START fcm_default_icon] -->
        <!--
 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/common_google_signin_btn_icon_dark"/>
        <!--
 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"/> <!-- [END fcm_default_icon] -->
        <!-- [START fcm_default_channel] -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_channel_id"
            android:value="@string/breakfast_notification_channel_id" />
        <!-- [END fcm_default_channel] -->

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

  1. เปิด ui/EggTimerFragment.kt เพิ่มรหัสช่องต่อไปนี้ใน onCreateView()
// EggTimerFragment.kt

   // TODO: Step 3.1 create a new channel for FCM
    createChannel(
        getString(R.string.breakfast_notification_channel_id),
        getString(R.string.breakfast_notification_channel_name)
    )
  1. เปิด MyFirebaseMessagingService.kt และยกเลิกการแสดงความคิดเห็นในฟังก์ชัน onNewToken() ระบบจะเรียกใช้ฟังก์ชันนี้เมื่อสร้างโทเค็นใหม่
// MyFirebaseMessagingService.kt

   // TODO: Step 3.2 log registration token
    // [START on_new_token]
    /**
     * Called if InstanceID token is updated. This may occur if the security of
     * the previous token had been compromised. Note that this is called when the     
     * InstanceID token is initially generated so this is where you would retrieve     
     * the token.
     */
    override fun onNewToken(token: String?) {
        Log.d(TAG, "Refreshed token: $token")

        // If you want to send messages to this application instance or
        // manage this apps subscriptions on the server side, send the
        // Instance ID token to your app server.
        sendRegistrationToServer(token)
    }
    // [END on_new_token]
  1. เรียกใช้แอปตัวจับเวลาไข่
  2. สังเกต Logcat (View > Tool Windows > Logcat) คุณควรเห็นบรรทัดบันทึกที่แสดงโทเค็นของคุณคล้ายกับโทเค็นด้านล่าง นี่คือโทเค็นที่คุณต้องการสําหรับการส่งข้อความถึงอุปกรณ์นี้ ระบบจะเรียกใช้ฟังก์ชันนี้เมื่อมีการสร้างโทเค็นใหม่เท่านั้น
2019-07-23 13:09:15.243 2312-2459/com.example.android.eggtimernotifications D/MyFirebaseMsgService: Refreshed token: f2esflBoQbI:APA91bFMzNNFaIskjr6KIV4zKjnPA4hxekmrtbrtba2aDbh593WQnm11ed54Mv6MZ9Yeerver7pzgwfKx7R9BHFffLBItLEgPvrtF0TtX9ToCrXZ5y7Hd-m

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

ตอนนี้คุณทดสอบโดยส่งการแจ้งเตือนได้แล้ว คุณจะต้องใช้เครื่องมือเขียนการแจ้งเตือนเพื่อส่งการแจ้งเตือน

  1. เปิด Firebase Console แล้วเลือกโปรเจ็กต์
  2. จากนั้นให้เลือกการรับส่งข้อความในระบบคลาวด์จากการนําทางด้านซ้าย
  3. คลิกส่งข้อความแรก

  1. ป้อน Time for Breakfast! เป็นชื่อการแจ้งเตือนและ Don't forget to eat eggs! เป็นข้อความการแจ้งเตือน และเลือกส่งข้อความทดสอบ กล่องโต้ตอบทดสอบในอุปกรณ์จะปรากฏขึ้น ขอให้คุณระบุโทเค็นการลงทะเบียน FCM

  1. คัดลอกโทเค็นแอปจาก Logcat

  1. วางโทเค็นนี้ลงในช่องเพิ่มโทเค็นการจดทะเบียน FCM ภายในหน้าต่างป๊อปอัป แล้วคลิกปุ่มเพิ่มถัดจากโทเค็น
  2. เลือกโทเค็นในรายการช่องทําเครื่องหมายที่ปรากฏขึ้น ปุ่มทดสอบควรเปิดใช้อยู่

  1. วางแอปตัวจับเวลาไข่ไว้ในพื้นหลังในอุปกรณ์
  2. คลิกทดสอบในป๊อปอัป
  1. หลังจากคลิกทดสอบ อุปกรณ์ไคลเอ็นต์ที่กําหนดเป้าหมายซึ่งมีแอปของคุณทํางานอยู่ในเบื้องหลังจะได้รับการแจ้งเตือนในถาดการแจ้งเตือนของระบบ (ดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีจัดการกับข้อความ FCM เมื่อแอปอยู่เบื้องหน้าในภายหลัง)

งาน: การส่งการแจ้งเตือน FCM ไปยังหัวข้อ

การรับส่งข้อความหัวข้อ FCM จะอิงตามรูปแบบการเผยแพร่/สมัครใช้บริการ

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

หัวข้อ ช่วยให้คุณส่งข้อความไปยังอุปกรณ์หลายเครื่องที่เลือกใช้หัวข้อนั้นๆ ได้ สําหรับลูกค้า หัวข้อจะเป็นแหล่งข้อมูลเฉพาะที่ลูกค้าสนใจ สําหรับเซิร์ฟเวอร์ หัวข้อคือกลุ่มของอุปกรณ์ที่เลือกใช้การอัปเดตในแหล่งข้อมูลเฉพาะ คุณใช้หัวข้อเพื่อนําเสนอหมวดหมู่การแจ้งเตือนได้ เช่น ข่าว พยากรณ์อากาศ และผลกีฬา ในส่วนนี้ของ Codelab คุณจะต้องสร้างหัวข้อ "breakfast" เพื่อช่วยเตือนผู้ใช้แอปที่สนใจให้รับประทานไข่ด้วยมื้อเช้า

หากต้องการติดตามหัวข้อ แอปไคลเอ็นต์จะเรียกใช้ฟังก์ชัน Firebase Cloud Messaging subscribeToTopic() ที่มีชื่อว่าหัวข้อ breakfast การโทรนี้มีผลลัพธ์ได้ 2 แบบ หากผู้โทรสําเร็จ ระบบจะโทรกลับไปยังหมายเลขเรียกกลับ OnCompleteListener ด้วยข้อความที่ติดตาม หากลูกค้าไม่ติดตาม โค้ดเรียกกลับจะได้รับข้อความแสดงข้อผิดพลาดแทน

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

  1. เปิด EggTimerFragment.kt แล้วหาฟังก์ชัน subscribeTopic() ที่ว่างเปล่า
  2. รับอินสแตนซ์ของ FirebaseMessaging และเรียกฟังก์ชัน subscibeToTopic() ด้วยชื่อหัวข้อ
  3. เพิ่ม addOnCompleteListener เพื่อรับการแจ้งเตือนจาก FCM ว่าการสมัครใช้บริการสําเร็จหรือล้มเหลว
// EggTimerFragment.kt

   // TODO: Step 3.3 subscribe to breakfast topic
    private fun subscribeTopic() {
        // [START subscribe_topics]
        FirebaseMessaging.getInstance().subscribeToTopic(TOPIC)
            .addOnCompleteListener { task ->
                var msg = getString(R.string.message_subscribed)
                if (!task.isSuccessful) {
                    msg = getString(R.string.message_subscribe_failed)
                }
                Toast.makeText(context, msg, Toast.LENGTH_SHORT).show()
            }
        // [END subscribe_topics]
    }
  1. เรียกใช้ฟังก์ชัน subscribeTopic() เพื่อติดตามหัวข้อเมื่อแอปเริ่มทํางาน เลื่อนขึ้นไปยัง onCreateView() แล้วเพิ่มสายลงใน subscribeTopic()
// EggTimerFragment.kt

   // TODO: Step 3.4 call subscribe topics on start
    subscribeTopic()

    return binding.root
  1. หากต้องการติดตามหัวข้ออาหารเช้า ให้เรียกใช้แอปอีกครั้ง คุณควรจะเห็นข้อความโทสต์พูดว่า "สมัครรับข้อมูลจากหัวข้อ"

คุณทดสอบการส่งข้อความไปยังหัวข้อได้แล้ว โดยทําดังนี้

  1. เปิดเครื่องมือเขียนการแจ้งเตือน แล้วเลือกเขียนการแจ้งเตือน
  2. กําหนดชื่อการแจ้งเตือนและข้อความการแจ้งเตือนเช่นเดิม
  3. ครั้งนี้ แทนที่จะส่งข้อความไปยังอุปกรณ์เดียว ให้คลิกหัวข้อในส่วนเป้าหมาย แล้วใส่ breakfast เป็นหัวข้อของข้อความ

  1. เลือกการตั้งเวลาเลย

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

แอปมีช่องทางสําหรับการแจ้งเตือนต่อไปนี้ ได้แก่ Egg และ Breakfast ในอุปกรณ์ไคลเอ็นต์ ให้คลิกไอคอนแอปค้างไว้ เลือกข้อมูล แล้วคลิกการแจ้งเตือน คุณควรเห็นช่องทางการแจ้งเตือน Egg และ Breakในแต่ละวัน ดังที่แสดงในภาพหน้าจอต่อไปนี้ หากยกเลิกการเลือกช่องอาหารเช้า แอปจะไม่ได้รับการแจ้งเตือนใดๆ ที่ส่งผ่านช่องทางนี้

เมื่อใช้การแจ้งเตือน โปรดทราบว่าผู้ใช้จะปิดช่องทางการแจ้งเตือนได้ทุกเมื่อ

ขั้นตอนที่ 1: ข้อความข้อมูล

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

หากต้องการจัดการข้อความข้อมูล คุณต้องจัดการเพย์โหลดข้อมูลในฟังก์ชัน onMessageReceived() ของ MyFirebaseMessagingService เพย์โหลดจะจัดเก็บอยู่ในพร็อพเพอร์ตี้ data ของออบเจ็กต์ remoteMessage ทั้งออบเจ็กต์ remoteMessage และพร็อพเพอร์ตี้ data จะเป็น null

  1. เปิด "MyFirebaseMessagingService."
  2. ตรวจสอบว่าพร็อพเพอร์ตี้ data ของออบเจ็กต์ remoteMessage มีค่าบางอย่างและพิมพ์ข้อมูลลงในบันทึก
// MyFirebaseMessagingService.kt

    // [START receive_message]
    override fun onMessageReceived(remoteMessage: RemoteMessage?) {
        // Not getting messages here? See why this may be: https://goo.gl/39bRNJ
        Log.d(TAG, "From: ${remoteMessage?.from}")
        
       // TODO: Step 3.5 check messages for data
        // Check if the message contains a data payload.
        remoteMessage?.data?.let {
            Log.d(TAG, "Message data payload: " + remoteMessage.data)
        }

    }
    // [END receive_message]

หากต้องการทดสอบโค้ด ให้ใช้เครื่องมือเขียนการแจ้งเตือนอีกครั้ง

  1. เปิดเครื่องมือเขียนการแจ้งเตือน สร้างข้อความใหม่ ตั้งค่าเป้าหมายเป็นหัวข้อ "breakfast"
  2. เมื่อถึงขั้นตอนที่ 4 ตัวเลือกเพิ่มเติม ให้ตั้งค่าคีย์ข้อมูลที่กําหนดเองและพร็อพเพอร์ตี้ค่าดังนี้
  1. คีย์: eggs
  2. ค่า: 3

  1. ตรวจสอบว่าแอปทํางานอยู่ในเบื้องหน้า หากแอปของคุณอยู่ในเบื้องหลัง ข้อความ FCM จะทริกเกอร์การแจ้งเตือนอัตโนมัติและฟังก์ชัน onMessageReceived() จะได้รับเฉพาะออบเจ็กต์ remoteMessage เมื่อผู้ใช้คลิกการแจ้งเตือน
  2. ส่งข้อความจากเครื่องมือเขียนการแจ้งเตือน และสังเกตบันทึกข้อความข้อมูลที่ปรากฏใน Logcat

ขั้นตอนที่ 2: จัดการข้อความในเบื้องหน้าและเบื้องหลัง

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

  • หากแอปทํางานอยู่เบื้องหลัง หากข้อความมีเพย์โหลดการแจ้งเตือน การแจ้งเตือนจะปรากฏในถาดการแจ้งเตือนโดยอัตโนมัติ หากข้อความมีเพย์โหลดข้อมูลด้วย แอปดังกล่าวจะจัดการข้อมูลเพย์โหลดเมื่อผู้ใช้แตะการแจ้งเตือน
  • หากแอปทํางานอยู่ในเบื้องหน้า หากการแจ้งเตือนข้อความมีเพย์โหลดการแจ้งเตือน การแจ้งเตือนจะไม่ปรากฏโดยอัตโนมัติ แอปต้องเลือกวิธีจัดการกับการแจ้งเตือนในฟังก์ชัน onMessageReceived() หากข้อความมีเพย์โหลดข้อมูลด้วย แอปก็จะจัดการเพย์โหลดทั้ง 2 รายการ

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

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

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

  1. เปิดฟังก์ชัน onMessageReceived() ใน MyFirebaseMessagingService อีกครั้ง
  2. ทันทีหลังจากโค้ดที่เพิ่งเพิ่มเพื่อตรวจสอบข้อความข้อมูล ให้เพิ่มโค้ดต่อไปนี้ซึ่งส่งการแจ้งเตือนโดยใช้เฟรมเวิร์กการแจ้งเตือน
// MyFirebaseMessagingService.kt

    // TODO: Step 3.6 check messages for notification and call sendNotification
    // Check if the message contains a notification payload.
    remoteMessage.notification?.let {
        Log.d(TAG, "Message Notification Body: ${it.body}")
        sendNotification(it.body as String)
    }
  1. หากเรียกใช้แอปอีกครั้งและส่งการแจ้งเตือนโดยใช้เครื่องมือเขียนการแจ้งเตือน คุณจะเห็นการแจ้งเตือนแบบเดียวกับที่เคยเห็นในส่วนแรกของ Codelab ไม่ว่าแอปนั้นจะอยู่เบื้องหน้าหรืออยู่เบื้องหลังก็ตาม

รหัสโซลูชันจะอยู่ในสาขาหลักของโค้ดที่คุณดาวน์โหลด

  • นํา FCM BroadcastReceiver ไปใช้โดยขยาย FirebaseMessagingService
  • ตั้งค่าโปรเจ็กต์ Firebase Cloud Messaging (FCM) และเพิ่ม FCM ลงในแอป Android
  • ทดสอบแอปโดยส่งข้อความ Push จากเครื่องมือเขียนการแจ้งเตือน
  • สมัครรับข้อมูลหัวข้อ FCM โดยเรียกใช้ฟังก์ชัน subscribeToTopic() ของคลาส FirebaseMessaging
  • ส่งเพย์โหลดข้อมูลโดยใช้ออบเจ็กต์ RemoteMessage
  • จัดการข้อมูลในฟังก์ชัน onMessageReceived()
  • เพิ่มตรรกะเพื่อจัดการ FCM เมื่อแอปอยู่เบื้องหน้าและเมื่อแอปทํางานอยู่เบื้องหน้า

หลักสูตร Udacity:

เอกสารประกอบ Firebase:

สําหรับลิงก์ไปยัง Codelab อื่นๆ ในหลักสูตรนี้ โปรดดูหน้า Landing Page ขั้นสูงของ Android ใน Kotlin