よくAndroid関連の書籍やサイトなどで
『 finish() で Activity を終了させる』
と書いてあるんですが、
ちょっと微妙な思い違いをしていたようで
めちゃめちゃハマってしまいました(=_=;)
finish() は、
『Activity を即時終了させる』
と思っていたんですが、
どうやらそうでないようです。
とあるアプリを開発していて
ある条件下で Activity を終了させたくて finish() を使っていたんです。
こんな感じ↓
—
前処理;
if (式) finish();
後処理;
—
そしたら、どうも finish() が効いていないようで
後処理の部分でエラーで落ちてしまう・・・。
試しに、
—
Log.d(“CHECK”, “before finish()”);
finish();
Log.d(“CHECK”, “after finish()”);
—
としてLogCatを見てみたら
—
09-19 23:29:37.263: DEBUG/CHECK(13016): before finish()
09-19 23:29:37.273: DEBUG/CHECK(13016): after finish()
—
としっかりスルーされてしまい
「『after finish()』じゃねーよ!!ヾ(`Д´*)ノ」
と一人ボケツッコミのようなことをしてしまいました
で、ひとりでは解決できなかったので
知恵者のみなさまにアドバイスを願ったところ
『finish() は Activity を即時終了するわけではない』
ということがわかりました。
finish() はどうやら
「終了してもいいよ」
という宣言だけであり、その場で即時終了されるわけではなく
任意のタイミングでAndroid OSに終了されるのだそうです。
つまり、人間からみたら即時終了しているように見えても
Androidからしたら、終了宣言をしたActivityをOSが
気づいたときに終了しているみたいです。
そこには人間にはわからない多少のタイムラグがあり
その間にもプログラムは進行するので、
後処理の部分にエラーなどがあると強制終了されてしまうみたいです。
finish() のあとには、余計な処理を入れないようにしたほうがいいです。
というわけで、先程のプログラムは
—
前処理;
if (!式) 後処理;
finish();
—
とすることで解決しました。
んー、いやしかし、
—
前処理;
if (式) finish();
後処理;
—
とやりたいときもあるだろうに・・・。
そんなときはどうすんだろ?