2010年8月31日火曜日

UIApplicationDelegate のマルチタスキング関連メソッド調査

UIApplicationDelegate の調査記録。系統だった整理は末尾の参考情報サイトに良い記事があるのでそちらを参照のこと(状態遷移図など)。

※まとめはいつかやる(かもしれない)。
→ 良いまとめ記事をみつけた(のでやらない)。
下記の状態遷移を参照のこと:
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

0 件のコメント:

コメントを投稿