Android携帯ゲームを作って世界に配信してみよう(番外編) ―― Androidアプリのライフサイクル
3)SurfaceViewのsurfaceCreatedメソッドがコールバックされる
SurfaceViewが生成完了すると,surfaceCreatedがコールバックされます(リストB). surfaceCreatedがコールバックされると,MainクラスのcreateThreadメソッドに処理を委譲します.
リストB SurfaceViewの生成とsurfaceCreatedのコールバック(DribbleActivity.javaより抜粋)
class DribbleView extends SurfaceView implements SurfaceHolder.Callback { : @Override public void surfaceCreated(SurfaceHolder holder) { Log.d("Dribble", "surfaceCreated"); Main.createThread(this); } : } |
createThreadメソッドでは,static変数firstを使って,1回目の読み出しか,2回目以降の呼び出しかを判断しています(リストC).そして,1回目の呼び出しのときのみ,音声や画像の読み込みなどの初期化処理を行っています.初期化処理が完了すると,実際のゲーム処理を行うループを実行するスレッドを作成して,スレッドの実行を開始します.
リストC MainクラスのcreateThreadメソッド(Main.javaより抜粋)
final class Main { public static void createThread(final SurfaceView view) { Main.view = view; if (first) { : first = false; } thread = new Thread() { @Override public void run() { Main.runLoop(); } }; thread.start(); } : } |
4) SurfaceViewのsurfaceChangedメソッドがコールバックされる
画面サイズや回転状態といった表示状態が変更された際に,surfaceChangedメソッドがコールバックされます.実は,ActivityクラスのonCreateメソッドが呼び出されたときには,画面のレイアウトは決まっておらず,その時点では画面や画面上のオブジェクトの位置やサイズを正しく取得することができません.これは,Androidアプリ開発ではまりやすい代表的な問題の一つになっています.画面や画面上のオブジェクトのサイズを正しく取得するには,surfaceChangedメソッドがコールバックされたタイミング以降にサイズを取得する必要があります.