finish() でActivity が終了しない

よく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();
後処理;

とやりたいときもあるだろうに・・・。

そんなときはどうすんだろ?

Androidアプリ講座オープン
副業大学にAndroidアプリ作成講座がオープン。
アフィリエイトやドロップシッピングも学べるお得な大学。

innc.japan-power.biz
カテゴリー: Android アプリ 関連 情報   パーマリンク