July 5, 2012

onDestroy()してもプロセスは死なない

アプリはプロセスが割り当てられて動作しますが、ひとたび起動したアプリは、たとえ全てのActivityがonDestroy()してもプロセスは死にません。タスクはなくなってもプロセスは残ったままになります。アプリのActivityがonDestroy()まで到達し、タスクもなくなれば完全終了した気になりますが、実はプロセスとしてはまだ生きています。

例えば1つのActivityを持つアプリがあったとして、onCreate()で無限ループのThreadを起動したとします。Activityをバックキーで終了させ、onDestroy()までコールされるのですが、このThreadはだれも終了させることなく動作し続けます。Threadのdaemonフラグに関係なく生き残る仕様のようです。

設定アプリの「アプリケーションの管理」で表示されるアプリに「強制停止」ボタンがありますが、これはプロセスを殺す、ということをしています。プロセスがなくなって初めて起動していない元の状態に戻ります。

ここでなにが言いたいかというと、バックグラウンドで動作するThreadなどをうっかり終了し忘れると、生き残って動き続けてしまう、ということです。当然CPUには負荷がかかり、アプリを終わったのに端末の処理が重い、というのはこういう不具合で発生します。アプリでバックグラウンド処理を実行する場合は、きちんと終了できているか十分に確認することが必要です。

No comments:

Post a Comment