2011年10月25日火曜日

Application#onTerminateは、実機では呼ばれない。

Androidのアプリケーション開発ではまった罠の第一弾。

Androidでアプリケーションを開発していると、アプリケーションのアクティビティから共通してアクセスできる変数(データ)が欲しくなることがあるかと思います。

もちろん、アクティビティからアクティビティへ渡るたびに、シリアライズしたデータを渡してあげてもよいのですが、それではスマートなコードが書けないこともあるかと思います。

そうしたときに便利なのがApplicationクラスです。Applicationクラスを継承してメソッドや変数を実装してあげれば良いです。

たとえば、ここなんかを参考にすればよろしいかと。


このApplicationクラス、魅力的なメソッドを備えています。


「この2つのメソッドを使えば、アプリケーション開始および終了時に特定の処理をさせることができるじゃないか!」と、開発しているアプリケーションの仕様によっては、心わきき立つこともあるかと思います。

が、その気持ち、おさえましょう。ぐっと。

まず、onTerminate()の説明を読んでみてください。

エミュレータでは、onTerminate上のコードが実行されるけど、実機では実行されないよという旨のことが書かれているかと思います。

さらに悪いことに、こんなことが書いてあったり。
下記サイトの「シングルトンクラス」の部分を読んでみてください。


これだけ読んだら(そんな人はいないかもしれませんが)、onCreateとonTerminateが実用的なイベントハンドらに見えてしまいます。が、実のところそうではないと…。

そもそも、Androidのアプリケーションは、ユーザーが明示的かつクリーンに終了することを考えていません。これは、「どのアプリケーション(タスク)を終了するかは、OSが決めること」という思想のもとに成り立っています。その恩恵として、アプリのアイコンをタップすると、一時停止状態にあったアプリケーションのアクティビティがサッと起動するように見えるわけですから。

初心者本であれば、まず例外なくどの本にも書かれているアクティビティのライフサイクルですが、「Androidでは、アプリケーションではなくアクティビティ単位でライフサイクルを管理しているんだ」という視点で一度は読んでみることをおすすめします。

このライフサイクルの言わんとしていることが分かれば「System.exit()使えばアプリケーション終了できるじゃん」なんて言う考えは起きないかと。

まとめ:Androidで明示的にアプリケーションを終わるなんていう考えは捨てましょう。習うより慣れろとは言いますが、慣れるより習うことが大事な場合もあります。