みなさまこんにちは〜!
メモリアインクのすだです。
本日は、
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
に対して、外部から内容を変更することはできません。置き換えます。)
- Immutable(変更不可) な
- 後で実行するためにIntentをラップして準備しておくものです。
5〜6行目:
setContentIntent
- 通知をタップしたときに実行される動作を指定します。ここでは
pendingIntent
を指定し、タップするとMainActivity
が開かれます。
- 通知をタップしたときに実行される動作を指定します。ここでは
addAction
- 通知内に追加のボタン(アクション)を表示します。
- 第1引数: ボタンのアイコン(
android.R.drawable.ic_menu_view
) - 第2引数: ボタンのラベル(「詳細を見る」)
- 第3引数: ボタンをタップしたときに実行される
PendingIntent
- 第1引数: ボタンのアイコン(
- 通知内に追加のボタン(アクション)を表示します。
ビルドすると、以下のように操作できます。
ロック画面に表示されている方の通知からタップしても、画面に遷移することができます。
ユーザーが通知を操作した結果を受け取る
続いて、通知のアクションボタンをタップした結果をアプリ内で処理する実装を行なっていきます。
まずは、通知を作成して表示する処理を書きます。▼
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つ。
システムやアプリからのブロードキャスト(通知)を受信し、対応する処理を実行します。
このコードでは、「通知のアクションボタンがクリックされた」という通知を受け取るために使用されています。
- Androidのコンポーネントの1つ。
class ActionReceiver : BroadcastReceiver()
- ActionReceiverはBroadcastReceiver を継承したクラスで、
通知やシステムイベントに対する処理を実装します。
- ActionReceiverはBroadcastReceiver を継承したクラスで、
2行目:
onReceive
- ブロードキャストを受信したときに呼び出されるメソッド。
この中に、受信したイベントに対応する処理を記述します。 - 引数
context: Context
:このBroadcastReceiver
が呼び出されたときのコンテキスintent: Intent
:送信されたブロードキャストのデータ。このコードでは、Intent
のaction
プロパティを利用して、どのイベントが発生したかを判別しています。
- ブロードキャストを受信したときに呼び出されるメソッド。
まとめ
おつかれさまでした。いかがでしたでしょうか!
通知内にボタンを設置することで、よりリッチなアプリに仕上げることができるかつ
ユーザー体験の向上に繋がりますね。
ぜひ実装方法を学んで、活用してみてください!
技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
自分の市場価値をさらに向上させてみませんか?
コメント