Android Academy · Pelajaran

Pemberitahuan Tolak dengan Cloud Messaging

Hantar dan terima pemberitahuan FCM.

Pelajaran 4 daripada 413 langkah

Pemberitahuan Tolak dengan Cloud Messaging ialah pelajaran Android Academy percuma di CoddyKit. Ini ialah pelajaran 4 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Android Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Android Academy merangkumi sejumlah 4 pelajaran.

Apakah Cloud Messaging?

Firebase Cloud Messaging (FCM) menghantar pemberitahuan tolak dan mesej data kepada apl anda — walaupun apl itu ditutup.

Alirannya mudah:

  • Setiap pemasangan apl mendapat token pendaftaran yang unik.
  • Pelayan anda (atau konsol Firebase) menghantar mesej kepada token itu (atau kepada topik).
  • FCM menghalakannya ke peranti, yang kemudiannya memaparkan atau mengendalikannya.

Tambahkan Kebergantungan Messaging

FCM disediakan dalam pustaka firebase-messaging, yang versinya ditentukan oleh BoM yang anda sediakan sebelum ini.

Nombor versi tidak diperlukan apabila BoM tersedia.

// app/build.gradle.kts
dependencies {
    implementation(platform("com.google.firebase:firebase-bom:33.1.0"))
    implementation("com.google.firebase:firebase-messaging")
}

Kebenaran Pemberitahuan

Pada Android 13 (API 33) dan ke atas, penghantaran pemberitahuan memerlukan kebenaran masa jalan POST_NOTIFICATIONS.

Isytiharkannya dalam manifes, kemudian minta kebenaran itu pada masa jalan — tanpa pemberian kebenaran, pemberitahuan anda akan digugurkan secara senyap.

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />

Meminta Kebenaran

Gunakan API Activity Result untuk meminta POST_NOTIFICATIONS pada masa jalan. Minta kebenaran itu hanya pada API 33 ke atas; versi terdahulu memberikannya secara tersirat.

import android.Manifest
import android.os.Build
import androidx.activity.result.contract.ActivityResultContracts

val requestPermission = registerForActivityResult(
    ActivityResultContracts.RequestPermission()
) { granted ->
    println(if (granted) "Notifications allowed" else "Notifications denied")
}

fun askNotificationPermission() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
        requestPermission.launch(Manifest.permission.POST_NOTIFICATIONS)
    }
}

Token Pendaftaran

Setiap pemasangan mempunyai token FCM unik yang mengenal pastinya sebagai sasaran. Dapatkannya dengan Firebase.messaging.token.

Hantar token ini kepada bahagian belakang anda supaya ia boleh menghantar pemberitahuan tolak kepada peranti tertentu itu. Token boleh berubah, jadi sentiasa anggap token terbaharu sebagai token yang sah.

import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await

suspend fun currentToken(): String {
    return Firebase.messaging.token.await()
}

Perkhidmatan Messaging

Untuk menerima mesej, lanjutkan FirebaseMessagingService. Gantikan onMessageReceived untuk mengendalikan muatan masuk dan onNewToken untuk bertindak balas apabila token berubah.

Daftarkan perkhidmatan itu dalam manifes dengan penapis niat FCM.

import com.google.firebase.messaging.FirebaseMessagingService
import com.google.firebase.messaging.RemoteMessage

class MyFcmService : FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        // Upload the fresh token to your backend
        sendTokenToServer(token)
    }

    override fun onMessageReceived(message: RemoteMessage) {
        val title = message.notification?.title ?: "New message"
        val body = message.notification?.body ?: ""
        showNotification(title, body)
    }

    private fun sendTokenToServer(token: String) { /* ... */ }
    private fun showNotification(title: String, body: String) { /* ... */ }
}

Mendaftarkan Perkhidmatan

Isytiharkan perkhidmatan anda dalam manifes supaya Android boleh menghantar mesej kepadanya. Penapis niat MESSAGING_EVENT diperlukan.

<!-- AndroidManifest.xml inside <application> -->
<service
    android:name=".MyFcmService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>

Mesej Pemberitahuan berbanding Mesej Data

Mesej FCM hadir dalam dua bentuk:

  • Mesej pemberitahuan — FCM memaparkannya secara automatik dalam dulang apabila apl berada di latar belakang; onMessageReceived hanya dicetuskan apabila apl berada di latar depan.
  • Mesej data — sentiasa dihantar kepada onMessageReceived sebagai peta kunci/nilai supaya anda mengawal pengendaliannya.

Baca medan tersuai daripada message.data.

import com.google.firebase.messaging.RemoteMessage

fun handle(message: RemoteMessage) {
    val type = message.data["type"]      // your custom field
    val itemId = message.data["itemId"]
    when (type) {
        "chat" -> openChat(itemId)
        "promo" -> openPromo(itemId)
    }
}
fun openChat(id: String?) {}
fun openPromo(id: String?) {}

Membina Saluran Pemberitahuan

Sejak Android 8, setiap pemberitahuan memerlukan saluran. Ciptakannya sekali semasa permulaan; sistem menggunakan saluran itu untuk mengawal bunyi, kepentingan dan tetapan pengguna bagi setiap saluran.

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context

fun createChannel(context: Context) {
    val channel = NotificationChannel(
        "messages",
        "Messages",
        NotificationManager.IMPORTANCE_HIGH
    )
    val manager = context.getSystemService(NotificationManager::class.java)
    manager.createNotificationChannel(channel)
}

Memaparkan Pemberitahuan

Bina pemberitahuan dengan NotificationCompat.Builder yang dikaitkan dengan ID saluran anda, kemudian hantarkannya dengan NotificationManagerCompat.

Ingat: pada API 33 ke atas, pemberitahuan ini hanya muncul jika pengguna memberikan POST_NOTIFICATIONS.

import android.content.Context
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat

fun showNotification(context: Context, title: String, body: String) {
    val notification = NotificationCompat.Builder(context, "messages")
        .setSmallIcon(android.R.drawable.ic_dialog_info)
        .setContentTitle(title)
        .setContentText(body)
        .setAutoCancel(true)
        .build()

    NotificationManagerCompat.from(context).notify(1, notification)
}

Langganan Topik

Daripada menjejaki token secara individu, anda boleh menyiarkan kepada topik. Klien melanggan nama topik, kemudian pelayan anda menghantar satu mesej kepada semua pelanggan.

Sesuai untuk perkara seperti pengumuman news, sports atau all-users.

import com.google.firebase.Firebase
import com.google.firebase.messaging.messaging
import kotlinx.coroutines.tasks.await

suspend fun subscribeToNews() {
    Firebase.messaging.subscribeToTopic("news").await()
}

suspend fun unsubscribeFromNews() {
    Firebase.messaging.unsubscribeFromTopic("news").await()
}

Semakan Pantas

Apl anda berada di latar belakang dan menerima mesej pemberitahuan tulen daripada FCM. Apakah yang berlaku?

Imbas Kembali: Cloud Messaging

  • Tambahkan firebase-messaging dan minta POST_NOTIFICATIONS pada API 33 ke atas.
  • Setiap pemasangan mempunyai token FCM; muat naik token itu ke pelayan anda.
  • Lanjutkan FirebaseMessagingService dan gantikan onMessageReceived / onNewToken.
  • Ketahui perbezaan antara mesej pemberitahuan dan data.
  • Cipta saluran pemberitahuan, bina dengan NotificationCompat atau siarkan melalui topik.

Dengan ini, lengkaplah rangkaian Firebase: Auth, Firestore dan Messaging — bahagian belakang lengkap untuk apl Android anda.

Percuma untuk bermula

Pelajari Kotlin dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
36
Pelajaran
152

Soalan Lazim

Adakah pelajaran “Pemberitahuan Tolak dengan Cloud Messaging” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Android Academy, termasuk “Pemberitahuan Tolak dengan Cloud Messaging”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Android Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pemberitahuan Tolak dengan Cloud Messaging”?

Hantar dan terima pemberitahuan FCM. Anda berlatih Android Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Android Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Android Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 4 daripada 4.

Berapa lamakah pelajaran “Pemberitahuan Tolak dengan Cloud Messaging” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Android Academy ini?

Ya. Setiap pelajaran Android Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Menyediakan Firebase
  2. Pengesahan Firebase
  3. Asas Cloud Firestore
  4. Pemberitahuan Tolak dengan Cloud Messaging
← Kembali ke Android Academy