2013年4月16日火曜日

自分のアプリをZ順の最上位にする

自分のアプリをZ順の最上位にする

自分のアプリのActivityが、画面の前面に無い場合、つまりZ順における最上位では無い場合、詳しく言えば利用者の視点で端末の画面を見た時に他のアプリが表示されていて自分のアプリが見えない場合、自分のアプリのActivityを前面に出してやるにはどうするのか。

自分のアプリのActivityが稼働していない状態であれば、Intentを使えば良いことはわかります。次のとおりです。

Intent it;
it = new Intent(this, MainActivity.class);
it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(it);//Activityを起動し,上にしてやる

しかしながら、他のアプリが前面に出ていて、自分のアプリのActivityがバックグラウンドにある場合、つまり自分のActivityが生きておりかつ、後ろに隠れている場合、自分のアプリのActivityを前面に出す方法はどうすれば良いでしょうか。
多くのサイトではIntentを使うように案内されています。
確かに、Intentすれば、前面には出ますが、IntentされたActivityは新規に作成されてしまうのです。onCreateメソッドが実行されてしまい、Activityが複数存在することになってしまいます。

このため、何か違うような気がしたのでrequestFocus()やbringToFront()を試しましたがうまくいきませんでした。次のサイトで議論があるように、getWindow().setActive()でもダメなようです。
ブロードキャストの受信で、自分自身を前面に表示させる方法について

結論は、やっぱり、Intentを使うのです。コードは次のとおりです。Serviceにおいて実行させます。

Intent it;
it = new Intent(this, MainActivity.class);//ここでのthisはServiceです。
it.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
it.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(it);//Activityを上にしてやる

これを使えば、ActivityのonCreateメソッドは実行されず、複数のActivityが生成されることなく、自分のアプリをZ順の最上位にすることができます。Intent.FLAG_ACTIVITY_NEW_TASKがあるため、新規に作成されてしまうように思えますが、新規には作成されませんし、これが無いと実行時にエラーになります。
最近の開発環境は良くなっており、エラーになった場合、このIntent.FLAG_ACTIVITY_NEW_TASKを設定しなさいという趣旨のメッセージがログに表示されます。

過去の私の記事において、Intent.FLAG_ACTIVITY_SINGLE_TOPは使う機会が無いという趣旨の記述をしてしまいました。むむむ! 起動モード
そうでもないということですね。

0 件のコメント:

コメントを投稿