概要
AndroidでToastを表示した際、通知元のアプリを識別してもらうために、Toastに何かしらのアプリ情報を表示した方が良いと思う、という開発者向けの話です。
Toastについて
Androidで簡易なメッセージをユーザに表示するには、Toastを使うことが多いと思います。Toastはダイアログと異なり、Activityが無くても表示することができます。具体的には、ServiceやBroadcastReceiverなどのバックグラウンドで動作するクラスでも、Contextが参照できれば呼び出すことができます。つまり、次のように別のアプリの上やホーム画面にToastを表示することができてしまいます。

Toastの問題
ここで問題になるのは、このToastを表示している元のアプリを識別することが出来ないという点です。
自分の端末では一時期、「Account has not been authenticated」という内容(うろ覚え)のメッセージが不定期に表示されるという事象が発生していました。恐らく何れかのアプリが何らかのイベントをトリガーにしてToastを表示していたのだと思いますが、そのアプリが何か分からず、面倒で放置してたらいつの間にか出なくなってしまったので、結局どのアプリだったのかは分からず仕舞いでした。
こうした、どのアプリが出したメッセージなのかが分からない状況は、ユーザにとって決して好ましい状態ではありません。実際自分は、表示されたメッセージに対応することができなかったどころか、正体不明のメッセージが表示されて気味が悪いという印象を持ちました。ユーザに対して配慮したつもりが、まったくの逆効果となっています。
想定される状況
画面を表示していない状態でToastが表示される場合、次のようなタイミングでToastを表示するアプリの存在が考えられます(他にもあると思いますが)。
- 起動中のService(Android 8.0以降はForegroundService)からの実行
- JobScheduler実行時
- BroadcastReceiver受信時(参考:暗黙的なブロードキャストの例外)
- プッシュ通知受信時
- 非同期処理を動かしたまま画面を閉じ、かつプロセスが生きたままの状態
対応
この状況に対して、開発アプリにはToastにアプリを識別する情報を表示するのが望ましいのではないかと考えました。この場合、次の2パターンがあるかと思います。
1. Toastにアプリ名を表示する
Toastにアプリ名を表示します。メリットとしては、通常のToast表示でも対応可能なことです。デメリットとしては、長い名前だとメッセージの邪魔になります。

2. Toastにアイコンを表示する
アプリを識別できるアイコンを表示します。メリットはメッセージ表示領域の邪魔にならないこと、デメリットはToastは標準で画像を表示することはできないので、別途Viewを作成するか、ライブラリを使用する必要があることです。
次の画像はDynamic Toastsライブラリを使用した場合の表示です。
最後に
個人的には、アイコンを表示するのが適当かと考えています。
注意点としては、いくらアイコンを付与したところで、ユーザがそのアイコンから元アプリを識別できなければ意味がないので、ランチャーアイコンや通知アイコンなど、ユーザが普段目にするアイコンを使用するのが適切かと思います。
こうした「ユーザがToastの表示元を識別できない」問題を考えると、今後Toastの表示に何らかの仕様変更が加えられるような気はします。