0Pricing
Android Academy · レッスン

プッシュ通知

Firebase Cloud Messagingでプッシュ通知を送信します。FCMを設定し、通知チャンネルを作成し、アクション付きの通知を構築して、フォアグラウンドとバックグラウンドでの配信を処理します。

「プッシュ通知」はCoddyKit上の無料Android Academyレッスンです。 これはレッスン4/6です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはAndroid Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Android Academyコースには全6レッスンが含まれています。

プッシュ通知とは

プッシュ通知を使うと、アプリがフォアグラウンドにない場合でも、サーバーからユーザーにメッセージを送信できます。一般的な用途は次のとおりです。

  • 新着メッセージの通知
  • 注文状況の更新
  • 速報ニュース
  • リマインダーやキャンペーン

Androidでは、Firebase Cloud Messaging(FCM)が標準的なプッシュ配信サービスです。

FCMの概要

Firebase Cloud Messaging(FCM)の流れ:

  1. 初回起動時にアプリがFCMへ登録され、デバイスのトークンを受け取る
  2. アプリがトークンをサーバーに送信する
  3. プッシュ通知を送るとき、サーバーがFCMにメッセージを送信する
  4. FCMがデバイスに配信する

FCMは無料で信頼性が高く、アプリが終了している場合でも動作します。

プロジェクトへのFirebaseの追加

Firebaseを追加する手順:

  1. Firebase Consoleを開き、「プロジェクトを追加」→「Androidアプリを追加」を選択します
  2. パッケージ名を指定してアプリを登録します
  3. google-services.jsonをダウンロードし、app/に配置します
  4. プラグインと依存関係を追加します
// project/build.gradle:
buildscript {
    dependencies { classpath 'com.google.gms:google-services:4.4.1' }
}

// app/build.gradle:
plugins { id 'com.google.gms.google-services' }

dependencies {
    implementation platform('com.google.firebase:firebase-bom:32.7.4')
    implementation 'com.google.firebase:firebase-messaging-ktx'
}

FCMの権限(Android 13以降)

Android 13(API 33)以降では、危険な権限と同じように、実行時にPOST_NOTIFICATIONS権限をリクエストする必要があります。

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

// In Activity (Android 13+):
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    requestPermissionLauncher.launch(android.Manifest.permission.POST_NOTIFICATIONS)
}

FirebaseMessagingService

FCMから受信したメッセージとトークンの更新を処理するサービスを作成します。

class MyFirebaseService : FirebaseMessagingService() {

    override fun onNewToken(token: String) {
        // Send token to your backend to enable push delivery
        sendTokenToServer(token)
    }

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

マニフェストへのサービス登録

AndroidManifest.xmlでサービスを宣言します。

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

通知チャンネル(Android 8以降)

Android 8(Oreo)以降では、通知をチャンネルに割り当てる必要があります。ユーザーはチャンネルごとに、サウンド、バイブレーション、重要度を設定できます。

fun createNotificationChannel(context: Context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val channel = NotificationChannel(
            "messages_channel",           // channel ID
            "Messages",                   // user-visible name
            NotificationManager.IMPORTANCE_HIGH
        ).apply {
            description = "Incoming message notifications"
            enableVibration(true)
        }
        val manager = context.getSystemService(NotificationManager::class.java)
        manager.createNotificationChannel(channel)
    }
}

通知の作成と表示

Androidのバージョン間で互換性を保つには、NotificationCompat.Builderを使用します。

fun showNotification(context: Context, title: String, body: String) {
    val intent = Intent(context, MainActivity::class.java)
    val pendingIntent = PendingIntent.getActivity(
        context, 0, intent,
        PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
    )

    val notification = NotificationCompat.Builder(context, "messages_channel")
        .setSmallIcon(R.drawable.ic_notification)
        .setContentTitle(title)
        .setContentText(body)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setAutoCancel(true)             // dismiss on tap
        .setContentIntent(pendingIntent) // open app on tap
        .build()

    NotificationManagerCompat.from(context)
        .notify(System.currentTimeMillis().toInt(), notification)
}

アクション付き通知

通知にアクションボタンを追加すると、アプリを開かずに操作できるようになります。

val replyIntent = Intent(context, ReplyReceiver::class.java)
val replyPending = PendingIntent.getBroadcast(
    context, 1, replyIntent,
    PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)

val notification = NotificationCompat.Builder(context, "messages_channel")
    .setSmallIcon(R.drawable.ic_notification)
    .setContentTitle("New message from Alice")
    .setContentText("Hey, are you coming?")
    .addAction(R.drawable.ic_reply, "Reply", replyPending)
    .addAction(R.drawable.ic_dismiss, "Dismiss", null)
    .build()

フォアグラウンドとバックグラウンドでの処理

FCMの動作はアプリの状態によって異なります。

  • アプリがフォアグラウンド — onMessageReceived()が呼び出され、自分で通知を作成して表示します
  • アプリがバックグラウンドまたは終了中 — FCMがnotificationペイロードから通知を自動的に表示し、onMessageReceivedは呼び出されません

常にonMessageReceivedで受け取る必要がある追加データは、notificationではなくdataペイロードに含めます。

FCMトークンの取得

サーバーに送信するため、現在のFCMトークンを取得します。

FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
    if (!task.isSuccessful) {
        Log.w("FCM", "Fetching token failed", task.exception)
        return@addOnCompleteListener
    }
    val token = task.result
    Log.d("FCM", "Token: $token")
    // Send token to your server
    sendTokenToServer(token)
}

理解度チェック

アプリがバックグラウンドにあり、FCMが「notification」ペイロード付きのメッセージを配信すると、どうなりますか。

まとめ:プッシュ通知

AndroidでFCMを使ったプッシュ通知:

  • Firebase、google-services.json、firebase-messaging-ktxを追加する
  • Android 13以降ではPOST_NOTIFICATIONSをリクエストする
  • FirebaseMessagingServiceを作成し、onNewTokenとonMessageReceivedを実装する
  • Android 8以降ではNotificationChannelを作成する
  • NotificationCompat.Builderで通知を作成する
  • 常にonMessageReceivedで受け取るにはdataペイロードを使用する

次は、WorkManagerを使ってバックグラウンド処理をスケジュールします。

よくある質問

「プッシュ通知」レッスンは無料ですか?

はい。「プッシュ通知」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Android Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Android Academyコースには全6レッスンが含まれています。

「プッシュ通知」で何を学びますか?

Firebase Cloud Messagingでプッシュ通知を送信します。FCMを設定し、通知チャンネルを作成し、アクション付きの通知を構築して、フォアグラウンドとバックグラウンドでの配信を処理します。 ブラウザで直接実行するハンズオンコードでAndroid Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Android Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのAndroid Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/6です。

「プッシュ通知」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このAndroid Academyレッスンでコードを書いて実行できますか?

はい。すべてのAndroid Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. RetrofitとREST API
  2. Coilによる画像読み込み
  3. エラー処理とUX
  4. プッシュ通知
  5. WorkManagerとバックグラウンドタスク
  6. Play Storeへの公開
← Android Academyに戻る