【正社員】還元率83%【フリーランス】マージン一律5万円で案件をご紹介させていただきます。 詳細はこちら

【Android】<Kotlin>通知内にボタンを作って画面遷移させる方法と、ユーザーが通知を操作した結果を受け取る方法を徹底解説!(NotificationCompat)

【Android】<Kotlin>通知内にボタンを作って画面遷移させる方法と、ユーザーが通知を操作した結果を受け取る方法を徹底解説!(NotificationCompat)
すだ

みなさまこんにちは〜!
メモリアインクのすだです。

本日は、
KotlinのNotificationCompatを使って
通知内ボタン操作時の処理を作成する方法と
通知を操作した結果を受け取る方法について
実際のコードを利用して徹底解説していきます!

この記事を読んでわかること…
・通知内のボタンをタップして特定の画面へ遷移する方法
・通知を操作した結果を受け取る方法

NotificationCompatを使って通知を作成&表示する方法については、以下の記事で詳しくご紹介しています。
ぜひ合わせてご覧ください!

目次

環境

  • Kotlin (ver 1.9.0)
  • Android Studio (Giraffe | 2022.3.1 Patch 3)

通知内にボタンを作って画面遷移させる方法

それでは早速実装していきましょう!

通知の中にボタンをセットし、
ボタンタップで特定の画面へ遷移する
ように実装してみます。

val intent = Intent(this, MainActivity::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE)

val notification = NotificationCompat.Builder(this, "example_channel_id")
    .setSmallIcon(android.R.drawable.ic_dialog_info)
    .setContentTitle("アクション付き通知")
    .setContentText("タップしてアプリを開きます")
    .setContentIntent(pendingIntent) // 通知をタップしたときの動作
    .addAction(android.R.drawable.ic_menu_view, "詳細を見る", pendingIntent) // ボタン付きアクション
    .build()

NotificationManagerCompat.from(this).notify(2, notification)

2行目:

  • flags
    • Intent.FLAG_ACTIVITY_NEW_TASK:新しいタスクとしてアクティビティを開始
    • Intent.FLAG_ACTIVITY_CLEAR_TASK:既存のタスクをクリアしてからアクティビティを開始

4行目:

  • PendingIntent.getActivity
    • 後で実行するためにIntentをラップして準備しておくものです。
      具体的には、通知をタップしたときに特定のアクティビティ(画面)を開くために使われます。
    • 引数
      • this
        • コンテキスト
      • 0
        • リクエストコード(同じPendingIntentを識別するためのID)
          (例えば、複数の通知で異なるPendingIntentを扱いたい場合、それぞれに異なるrequestCodeを指定します)
      • intent
        • 開始するIntent
      • PendingIntent.FLAG_IMMUTABLE
        • Immutable(変更不可) な PendingIntent を作成します。セキュリティと安全性が高いため、ほとんどのケースではこれを使用します。
        • 作成後の PendingIntent に対して、外部から内容を変更することはできません。置き換えます。)

5〜6行目:

  • setContentIntent
    • 通知をタップしたときに実行される動作を指定します。ここではpendingIntent を指定し、タップすると MainActivity が開かれます。
  • addAction
    • 通知内に追加のボタン(アクション)を表示します。
      • 第1引数: ボタンのアイコン(android.R.drawable.ic_menu_view
      • 第2引数: ボタンのラベル(「詳細を見る」)
      • 第3引数: ボタンをタップしたときに実行されるPendingIntent

ビルドすると、以下のように操作できます。

【Android】<Kotlin>通知内にボタンを作って画面遷移させる方法と、ユーザーが通知を操作した結果を受け取る方法を徹底解説!

ロック画面に表示されている方の通知からタップしても、画面に遷移することができます。

【Android】<Kotlin>通知内にボタンを作って画面遷移させる方法と、ユーザーが通知を操作した結果を受け取る方法を徹底解説!(NotificationCompat)

ユーザーが通知を操作した結果を受け取る

続いて、通知のアクションボタンをタップした結果をアプリ内で処理する実装を行なっていきます。

まずは、通知を作成して表示する処理を書きます。▼

val actionIntent = Intent(this, ActionReceiver::class.java).apply {
    action = "ACTION_BUTTON_CLICKED"
}
val actionPendingIntent = PendingIntent.getBroadcast(this, 0, actionIntent, PendingIntent.FLAG_UPDATE_CURRENT)

val notification = NotificationCompat.Builder(this, "example_channel_id")
    .setSmallIcon(android.R.drawable.ic_dialog_info)
    .setContentTitle("アクション付き通知")
    .addAction(android.R.drawable.ic_menu_view, "アクション実行", actionPendingIntent) // アクションボタン
    .build()

NotificationManagerCompat.from(this).notify(7, notification)

2行目:

  • action = "ACTION_BUTTON_CLICKED"
    • このIntentに特定の「アクション名」を設定するものです。
      (例えば、複数のアクションボタンがある場合、この名前でどのアクションが実行されたかを判別します。)

続いて、通知内のボタンがタップされた時に通る処理を書いていきます。▼

class ActionReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == "ACTION_BUTTON_CLICKED") {
            Toast.makeText(context, "アクションボタンがクリックされました", Toast.LENGTH_SHORT).show()
        }
    }
}

1行目:

  • BroadcastReceiver
    • Androidのコンポーネントの1つ。
      システムやアプリからのブロードキャスト(通知)を受信し、対応する処理を実行します。
      このコードでは、「通知のアクションボタンがクリックされた」という通知を受け取るために使用されています。
  • class ActionReceiver : BroadcastReceiver()
    • ActionReceiverはBroadcastReceiver を継承したクラスで、
      通知やシステムイベントに対する処理を実装します。

2行目:

  • onReceive
    • ブロードキャストを受信したときに呼び出されるメソッド。
      この中に、受信したイベントに対応する処理を記述します。
    • 引数
      • context: Context:このBroadcastReceiverが呼び出されたときのコンテキス
      • intent: Intent:送信されたブロードキャストのデータ。このコードでは、Intentactionプロパティを利用して、どのイベントが発生したかを判別しています。

まとめ

おつかれさまでした。いかがでしたでしょうか!

通知内にボタンを設置することで、よりリッチなアプリに仕上げることができるかつ
ユーザー体験の向上に繋がりますね。


ぜひ実装方法を学んで、活用してみてください!

すだ

技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

弊社テックブログをご愛読いただきありがとうございます。
当テックブログを運用している株式会社メモリアインクは、
【正社員】還元率83%
【フリーランス】マージン一律5万円で案件のご紹介
と、エンジニアの皆様に分かりやすい形で稼げる仕組みを構築し提供させていただいております。

コメント

コメントする

目次