dullwhaleのメモ帳

何度も同じことを調べなくてよいように...

Androidの通知は属性をきちんと設定しないとPendingIntentの挙動がおかしくなる

通知やPendingIntentに関する一般的なミスを一通り確認した後でも原因不明なら、通知を作成する際にアイコンを設定しているか確認せよ。

Android 11において、通知をタップした際のPendingIntentでActivityを開くようコードを書いていたが、代わりにAndroid OS側のアプリの設定画面が開いてしまう挙動に悩まされていた。 原因は通知のアイコンを設定していないことだった。 一見無関係に思えるが、setSmallIcon()でアイコンを指定しただけで想定通りにPendingIntentが動くようになった。

以下に試行錯誤していた際のログを残す。

問題のコードと原因特定

次は、タップしたらMainActivityを開く通知を設定するコードスニペットである。

// スニペットにimportが書かれていないことが多くて困るから記載している
import android.app.PendingIntent
import android.content.Intent
import androidx.core.app.NotificationCompat

// ===== 中略 =====

val launchIntent = Intent(this, MainActivity::class.java)
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, launchIntent, PendingIntent.FLAG_IMMUTABLE)
// このchannelIdは別のところで作ってる。本筋とは無関係だから省略。
val notification = NotificationCompat.Builder(this, channelId) 
// このsetSmallIcon()が重要。設定しさえすればよいから、
// プロジェクト作成時に自動配置されるアイコンを指定している。
.setSmallIcon(R.drawable.ic_launcher_foreground)
.setContentIntent(pendingIntent)
.build()

コードの記述の意図はsetContentIntent()で指定したPendingIntentが通知タップ時に発火し、MainActivityが開かれることである。 このままなら、その意図通りの挙動となる。 ところがsetSmallIcon()の行を消してしまうと、通知タップ時にMainActivityではなくAndroid OS側のアプリ設定画面が開かれてしまう。

setContentTitle()setContentText()を設定しても問題は解消しなかった。 setSmallIcon()をセットしなければ解消しないようだ。

問題が再現した環境情報