2010/09/17

iOS 4のマルチタスク処理における状態遷移について

iOS 4からマルチタスクが可能になり、その結果としてアプリケーションの状態が追加されて、イベントによる状態遷移が変更されていますので、それを簡単にまとめてみました。この記事の内容については、Appleの「iOS Application Programming Guide」の内容に基づいています。詳細についてはこのドキュメントの「The Core Application Design」の章を参照してください。

2012.10.29追記   iOS 6用に図を改訂

状態遷移図

上の図はアプリケーションの状態とその遷移の関係を示したものです。「Active」や「Background」などの丸四角が状態を示しており、青い文がその矢印のトリガとなる条件を示しています。また、青丸とその側のタイプライタフォントで書かれた文字は呼び出されるメソッドを示しており、赤い文がそのメソッドにおける注意点などを示しています。

上の図の矢印に従って、各種イベントは次のように状態遷移をしながらメソッドを呼び出していきます。

  • 起動時 (通常時) Not Running → Inactive → Active
  • バックグラウンドになるとき (ホームボタンを押したときなど) Active → Inactive → Background
  • バックグラウンドから復帰するとき (Suspend →) Background → Inactive → Active
  • 電話やSMSなどで呼び出されて拒否したとき (電源断も含む?) Active → Inactive → Active
  • バックグラウンドに行くべき状況において、環境がバックグラウンド非対応な場合 Active → Inactive → Terminated

アプリケーションを起動する前はNot Runningの状態です。ここから起動するとInactiveを経て通常はActiveになります。

Inactiveの状態になっているのは通常は一瞬だけです。ただし、電話やSMSなどの場合はダイアログが表示されている間はずっとInactiveになっています。ホームボタンが押されるとBackgroundまで落ち、そこでapplicationDidEnterBackground:の処理を実行します。それが終了するとSuspendまで移行します。

Suspendになった場合、終了のタイミングはOSによって決められます(タスクリストから削除すれば別ですが)。そのため、メソッドapplicationDidEnterBackground:内で必要なデータを保存する必要があります。そして、アプリケーションを再び起動するとき、もしSuspendやBackground状態にあるならBackgroundから復帰し、そうでないなら通常の起動になります。

メモ

  • applicationDidBecomeActive:はアプリケーション起動時、バックグラウンドからの復帰時、電話やSMSなどを拒否したときに呼び出されます
  • iOSではBackgroundに入ることはアプリケーション終了とほとんど同じなので、applicationDidEnterBackground:では再開に必要なデータを保存すべきです
  • application:didFinishLaunchingWithOptions:での処理に時間がかかるようならスレッドを使うようにすべきです
  • iOS 4では基本的に「Inactive → Terminate」は発生しません(これが発生するのはiOS 3.x以前、デバイスが非対応、自分でUIApplicationExitsOnSuspend=YESをInfo.plistで指定しているのいずれかが条件となるため)

まとめ

iOS 4のマルチタスク処理におけるイベント状態遷移についてまとめました。

関連項目

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。