※まとめはいつかやる(かもしれない)。
→ 良いまとめ記事をみつけた(のでやらない)。
下記の状態遷移を参照のこと:
Understanding iOS 4 Backgrounding and Delegate Messaging @ Dr. Touch
(2010-09-15追記)
調査内容
実機を使って各状況下での UIApplicationDelegate の呼び出しを調査した。
パターン
1. ホーム画面からの起動停止(基本パターン)
2. 起動後の動き(Fast App Switch切り替えなど)
3. 外部状況の変化(スリープ、電話,メモリ不足など)
条件
・アプリはマルチタスキング(UIApplicationExitsOnSuspend == NO) ※1
・実機 iPhone3GS / iOS 4.0.0
・MacBook Pro に接続し、オーガナイザの Consoleでログを確認(Xcode 3.2.3)
※1 [参考]Cocoaの日々: iOS 4.0 でアプリを一時停止しない設定 - UIApplicationExitsOnSuspend
コード例
UIApllicationDelegate の "Monitoring Application State Changes" で分類される各メソッドを実装した。
UIApplicationDelegate Protocol Reference
- (void)applicationWillTerminate:(UIApplication *)application { NSLog(@"applicationWillTerminate:(state=%d)", application.applicationState); }
state=数値は、UIApplicationState の値を表している。
UIApplication Class Reference
抜粋(コメントはブログ著者が追記)
typedef enum { UIApplicationStateActive, // 0 UIApplicationStateInactive, // 1 UIApplicationStateBackground // 2 } UIApplicationState;
以下、結果記録。
1. ホーム画面から起動・停止
初期状態:一度も起動したことが無い
起動(ホームボタン)
application:didFinishLaunchingWithOptions: applicationDidBecomeActive:(state=0)
停止(ホームボタン)
applicationWillResignActive:(state=0) applicationDidEnterBackground:(state=2)
2. 起動後の動き
初期状態:起動済みでホーム画面が表示(もしくは他アプリが起動)されている
[2A] Fast App Switch で起動
applicationWillEnterForeground:(state=2) applicationDidBecomeActive:(state=0)
[2B] ホーム画面から起動
applicationWillEnterForeground:(state=2) applicationDidBecomeActive:(state=0)
[2C] Fast App Switch で強制終了
applicationWillResignActive:(state=0) applicationDidEnterBackground:(state=2) com.apple.launchd[1] (UIKitApplication:com.yourcompany. ApplicationDelegateSample[0x65c1][4003(UIKitApplication: com.yourcompany.ApplicationDelegateSample[0x65c1]) Exited: Killed SpringBoard[28]: Application 'ApplicationDelegateSample' quit with signal 9: Killed
[2D] 起動中に Fast App Switch を起動
applicationWillResignActive:(state=0)
a. その後、アプリへ復帰
applicationDidBecomeActive:(state=0)
b. その後、他アプリを起動
applicationDidEnterBackground:(state=2)
3. 外部状況の変化
初期状態:アプリをフォアグラウンドで起動中
[3A] スリープ
applicationWillResignActive:(state=0)スリープから復帰
applicationDidBecomeActive:(state=0)
[3B] 電源OFF
applicationWillResignActive:(state=0)スリープから復帰
applicationDidBecomeActive:(state=0)
[3C] 電話が掛かってきた
applicationWillResignActive:(state=0)電話断
applicationDidBecomeActive:(state=0)
[3B] 他アプリでメモリを大量利用
com.apple.launchd[1] (UIKitApplication:com.yourcompany. ApplicationDelegateSample[0x8bb3][3919]) <Notice>: (UIKitApplication:com.yourcompany.ApplicationDelegateSample [0x8bb3]) Exited: Killed SpringBoard[28] <Warning>: Application 'ApplicationDelegateSample' exited abnormally with signal 9: Killed
その後起動
application:didFinishLaunchingWithOptions: applicationDidBecomeActive:(state=0)
わかったこと
- メモリ不足になると KILLされる。その時に UIApplicationDelegateは呼ばれない。
参考情報
- iOS4 アプリケーションの状態遷移 - yagutaの日記
- 状態遷移図にまとめられていて役に立つ。状態一覧と各状態の説明などが詳しい。
- マルチタスキング対応後のアプリのイベントフローをまとめてみた - A Day In The Life
- メモリ警告メソッドの呼び出しタイミングなどが詳しい。
- 空きメモリが少ない時に、iPhoneの中で何が起きるのか、また調べてみました。 - The iPhone Development Playground
- 実機で試した記録など。今回の検証と一致。
- Togetter - 「iOS4でマルチタスキングを実現するときの注意点まとめ」
- いろいろ
- - - -
次回は UIApplicationExitsOnSuspend==YES のケース。
(2010-09-14追加) GitHub
ApplicationDelegateSample at 2010-09-02 from xcatsan's iOS-Sample-Code - GitHub