通知や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()をセットしなければ解消しないようだ。
問題が再現した環境情報
- Android Studio Ladybug Feature Drop | 2024.2.2
- Android 11 Android Studioに付属のエミュレータ