もう2月目前ですが、あけましておめでとうございます。本年もよろしくお願い致します。。

さて今年もしょっぱなからiOSとかAndroidをうだうだやってるわけですが、
今年一発目のハマりポイントとなった表題の件についてサクっと書いてみようかと思います。

AndroidではGCM(GoocleCloudMessagingService)なんかを使って、
PUSH通知を実装する場面なんて事がチラホラあるかと思います。
そういう場合にアプリ利用者へはた迷惑な 即時性のあるコミュニケーションを取るため、
通知センターだけでなくポップアップするダイアログなんかを出したりする事もあるかと思います。

アプリ内でダイアログを出す際はandroid.app.AlertDialog辺りにお任せすれば
簡単に実装できるのですがこれをGCMサービスから呼び出すとエラります。
理由ですが、ものすごく簡略化して言うとActivityを経由していないからです。
GCMサービスからダイアログを出す場合にはActivityとして実装します。

んで本題ですが普通にActivityを定義すると全画面でアプリ画面そのままになってしまいますよね。
格好良い感じのダイアログを定義する場合にはマニフェストにこんな風に書きます。 
<activity
 android:launchMode="singleInstance"
 android:theme="@android:style/Theme.Dialog"
 android:label="@string/app_name"
 android:name=".DialogActivity"
></activity>
3行目はすぐに分かったのですが、4行目を探すのに苦労しました。。。
4行目の記述が無いとランチャーで指定したActivity、多くの場合は
アプリのメイン画面だと思いますが、そいつがダイアログと一緒に起動します。

最近利用者1億人を超えたとかで活況な某コミュニケーションアプリみたいな
イケてるダイアログを実装するのはこの記述が不可欠なわけです。

singleInstanceについて深く知りたい方は(Android開発をやるなら知っておいた方が良いです)
下記の記事がとても参考になります。

Android launchMode の違い
※むしろAndroid開発を始めたばかりであればリンク先のブログは全部読む、くらいの勢いで良記事揃いです

なんかちょっと短い話になったのでついでにプッシュ通知(GCMのonMessage)
からダイアログ用のActivityを呼ぶ時の処理を置き土産にしておきます。
Intent i = new Intent(context,DialogActivity.class);
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
context.startActivity(i); 

今年は去年よりも人の役に立ちそうな記事を書いていきたいですね。


2013/08/14
ソースに誤りがあったので修正しました。takさんご指摘ありがとうございます。