2011年2月8日火曜日

なにがなんでもstackの先頭から起動させる方法

開発している側から見れば、Android Appを終了させろと言われたら、
BACK_KEYを押しまくってHOME画面に戻ることや、
Task Manager的なAppを使って、要はprocessをKILLすることを考えるだろう。

が、Multi Taskに疎い多くのUserは、Applicationを終了させるには
HOME_KEYを押下すればいいものだと思っている。

このせいで、Appの再起動が必要なPreferenceの変更や、
起動時に何か処理をしたい、なんていう場合に
考えなければいけないpatternが山のように増える。


これらを打破するひとつの実装方法として、

・launcherからの起動時
・HOME_KEY押下でHOME画面に抜け、そこからHOME_KEYを長押しし、
Taskの切り替えで遷移する場合

の2patternに対し、何がなんでもActivity Stackの先頭から
起動させる、という仕様を考えてみる。


stackの先頭となるActivityに、Manifestから
android:clearTaskOnLaunch="true"
を設定してやれば、launcherからの起動時に
積まれたstackを全消去して起動することができる。

が、Taskの切り替えから遷移してきた場合はそうはいかない。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
が飛んできているからだ。
これは、起動時に積まれているstackを拾ってきて
前回と同じ画面を表示しなさい、というIntentのFlagである。

本当は、HOMEキーで終了した際には
processごとKILLしててくれるような実装ができればいいのだけれど、
知られているとおり、HOME_KEY押下のeventが拾えない以上、
その仕様で作ることは難しい。

とりあえずActivityのstackについての情報を集めて
模索しているのだけれど、未だ不明。

何か解ったら追記します。


追記1:
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
の他に、
FLAG_ACTIVITY_NEW_TASK
も混ざって飛んできてるっぽい。
何かの鍵になるだろうか。
・・・そもそもどこでFlagsの中身調べればいいんだ?


解決:
簡単すぎてあきれ返ってしまった。はぁ。

topとなるActivityの設定を、
android:clearTaskOnLaunch="true"
じゃなくて
android:launchMode="singleTask"
にすればいいだけ。
これだけで万事OK。


ところで今回の記事。
検索のために、ウザいくらいにカタカナ英語を
英語表記にしてみたのだけれど、やはり読みづらいですね。

0 コメント:

コメントを投稿