戌印-INUJIRUSHI- (Androidあれこれ)

Androidのプログラミングをメインにしてます。記事に貼られたソースコードはダブルクリックすることで行番号をはずしてコピーすることができます。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
08

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

アクティビティのライフサイクル

アクティビティのライフサイクルとは、アクティビティが生成されてから破棄されるまでの流れのことを指します。
このライフサイクルは Android アプリ開発において基本となることですのでしっかり理解してから開発するようにしましょう。
※ Fragment もライフサイクルを持っていますが今記事では触れません。

ソフトウェア技術ドキュメントを勝手に翻訳 - 1. アクティビティ


Activity のライフサイクル図
(Tech Booster - 図解Androidのライフサイクルとプラットフォーム より)
android_lifecycle.png


【主要メソッド】
ライフサイクルの説明で欠かせないメソッドです。
この中でも主に使うメソッドは色つきにしました。

onCreate()
  アクティビティがはじめて生成された時に呼ばれる。
onStart()
  アクティビティが開始された時に呼ばれる。
onRestart()
  アクティビティが再開された時に呼ばれる。
onResume()
  アクティビティが表示された時に呼ばれる。
onPause()
  他のアクティビティが表示された時に呼ばれる。
onStop()
  アクティビティが非表示になった時に呼ばれる。
onDestroy()
  アクティビティが破棄される時に呼ばれる。


ライフサイクル図を見てもらうとわかるように、開始時には onStart()、停止時には onStop() と onDestroy() が呼ばれないパターンがあります。
そのため、開始時は onResume()、停止時は onPause() にまとめて記述することが多いです。

私の場合は、以下のように使い分けています。
onCreate() :レイアウト定義、イベント設定、受取データの設定(getIntent)
onResume() :データ読込、スレッド開始、レイアウトへのデータ反映
onPause() :データ保存、スレッド停止


【その他メソッド】
ライフサイクルの説明で除外されることがありますが、他にも以下のようなメソッドも使われます。

onSaveInstanceState()
  アクティビティの状態を保存する時に呼ばれます。
onRestoreInstanceState()
  アクティビティの状態を復元する時に呼ばれます。
onActivityResult()
  他のアクティビティをリクエスト要求で起動して戻ってきた時に呼ばれます。
onNewIntent()
  自身のアクティビティを要求したときに呼ばれます。
  ※ android:launchMode が singleTop/singleTask/singleInstance のアクティビティに限る


後述の実行パターンになりますが onRestoreInstanceState() は呼ばれるタイミングが少なく、呼ばれるときには必ず onCreate() も呼ばれます。
そのため、onCreate() の引数は onRestoreInstanceState() と同じため、onCreate() にまとめられることが多いです。


【実行パターン】
ライフサイクルの流れは以下のパターンに分けられます。

アクティビティの開始
  onCreate() → onStart() → onResume()

アクティビティの終了 (戻るキー)
  onPause() → onStop() → onDestroy()

スリープモード、ホームボタン
  onPause() → onSaveInstanceState() → onStop()

スリープモード、ホームからの復帰
  onRestart() → onStart() → onResume()

他のアクティビティを起動 (※ [ ] は他のアクティビティの処理)
  onPause() → [ onCreate() → onStart() → onResume() ] → onSaveInstanceState() → onStop()

他のアクティビティから戻る (※ [ ] は startActivityForResult 起動時のみ)
  [ onActivityResult() → ] onRestart() → onStart() → onResume()

デバイス回転
  onPause() → onSaveInstanceState() → onStop() → onDestroy() → onCreate() → onStart() → onRestoreInstanceState() → onResume()

メモリ解放後の起動 (長時間放置からの起動など)
  onCreate() → onStart() → onRestoreInstanceState() → onResume()


【実行パターン - singleXXX】
アクティビティの launchMode が singleTop/singleTask/singleInstance の場合には、以下のように動作が異なります。
[ ] は自身のアクティビティを起動した場合に実行されるメソッド。

アクティビティを起動
  onPause() → [ onNewIntent() → ] onResume()

アクティビティをリクエスト要求して起動
  onPause() → onActivityResult() → onResume() → onPause() → [ onNewIntent() → ] onResume()

onActivityResult() は同一のタスク上からしか結果を取得できません。
そのため singleTask の場合には別タスク上で動くため結果が取得できず、直後にキャンセルを返すようになっています。

Android Developers - Activity#startActivityForResult() より抜粋
Note that this method should only be used with Intent protocols that are defined to return a result. In other protocols (such as ACTION_MAIN or ACTION_VIEW), you may not get the result when you expect. For example, if the activity you are launching uses the singleTask launch mode, it will not run in your task and thus you will immediately receive a cancel result.


遷移の種類や、状態に応じて呼ばれるメソッドが変わるため覚えるのはかなり大変です。
どのときにどのようなメソッドが呼ばれるかを理解したうえで使うようにしましょう。
スポンサーサイト

Comments

Leave a Comment


Body
プロフィール

とむ・やむくん

Author:とむ・やむくん
管理人について

Windows 7 / 64bit
Eclipse 4.2 Juno (日本語パッチ済)

スポンサーサイト
最新トラックバック
検索フォーム
ブロとも申請フォーム
QRコード
QR
Twitter
2013/01/04 19:00 カウント開始

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。