※この記事は2022/10/21時点のモノです。開発系の情報はすぐ(2〜3年で)古くなったりするのでご注意ください。
こんにちは、コンテンツクリエイターのともすけです。
今年も残すところ3ヶ月を切りましたね。筆者は一応これでもメインの仕事を「アプリ開発」としており、今年中にアプリを出すべく頑張っています。作っているのは「積ん読」に関係するアプリです。
さて掲題の件ですが、通知(Notification)からActivityを呼び出す際に、通知側でセットした値(putXXX系)がActivityで読めない問題にぶつかっていました。
前提条件:PendingIntentにフラグ「FLAG_IMMUTABLE」のみ割り当てていた。
いきなり結論
- PendingIntent.FLAG_UPDATE_CURRENT
をPendingIntentのフラグに追加することで解決しました。なお筆者は上記フラグと共に「FLAG_IMMUTABLE」をセットしています。
パラメータの更新にはFLAG_UPDATE_CURRENTを使えと、デベロッパーサイトに書かれていました。以下引用。
FLAG_IMMUTABLE only limits the ability to alter the semantics of the intent that is sent by send() by the invoker of send(). The creator of the PendingIntent can always update the PendingIntent itself via FLAG_UPDATE_CURRENT.
https://developer.android.com/reference/android/app/PendingIntent
すったもんだの過程(見なくてもいいけど)
ネットで情報を探すも
- 呼び出し元でputXXXをやっていないからだ
などといった、欲しくない情報に検索結果が埋もれていました。それでもキーワードをいろいろ試したところ、ようやくゴールに到達できました。
参考にしたサイトはこちら↓
http://onno.jp/dev/2011/11/android-notification-intent-activity.htmlいま現在AndroidOSの最新は13になっていますが、このご時世ではPendingIntentに以下のような制約が付くようになりました。
- FLAG_MUTABLEかFLAG_IMMUTABLEのどちらかを必ずセットせよ
筆者の認識ではこれらのFLAGはそれぞれ
- FLAG_MUTABLE:PendingIntentに渡すパラメータは、発行後もパラメータを後付けで渡すことができる
- FLAG_IMMUTABLE:PendingIntentに渡すパラメータは、発行時に渡したパラメータのみ使用できる
となっており(違ってたら教えてください)、かつGoogleからはFLAG_IMMUTABLE推奨となっていますので、フラグはFLAG_IMMUTABLEだけセットしていました。
それでデバッグしていると掲題の通り、通知から呼び出したActivityでgetExtras()がnullを返してしまい困っていました。
(蛇足)個人開発を行う理由
蛇足ですが、アプリ開発のおしごとは企業がずいぶんと入るようになりまして、そうすると時間的にもお金的にも時間的にも記述ノウハウ的にも個人開発者はかないません。
だけど、企業はしっかり稼がなきゃならないわけで、するとこういうかゆいところに手が届くアプリが欲しいなぁ、とかいうのは中々作ってくれなかったり、あそびがなかったり、とつまらないわけです。
そんなわけで、今の時点ではまだ個人開発を続けていきたいと思います。
まとめ
まとめることはないのですが…まあ…個人で開発をしていると自分のノウハウは限定的で、ネット頼りになりがちです。
お金を払えば現職エンジニアが対応してくれるとかありますが、Androidアプリの開発周りは日進月歩でありますので、常にいろんなAPIの最新情報をみて触ってないと対応できないと思い込んでいます。
要は「お金を払って解決しなかったら嫌だな」などと思うわけです。
ちょっと愚痴っぽいことを書きました。
それではまた