最低限のAndroidアプリケーション

※新規プロジェクト Game20111028 を作成して作業開始
package jp.android.Game20111028;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;

public class Game20111028Activity extends Activity {
    /**
     * Activity が生成された際に呼び出される
     * 
     * @param savedInstanceState 前回実行時の状態が保存されている。もしくは null
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
}




Hello World!

package jp.android.Game20111028;

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

public class Game20111028Activity extends Activity {
    /**
     * Activity が生成された際に呼び出される
     * 
     * @param savedInstanceState 前回実行時の状態が保存されている。もしくは null
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        TextView display = new TextView(this);
        display.setText("Hello World!!");
        setContentView(display);
    }
}




SurfaceView の拡張クラス GameView(GameView.java)

package jp.android.Game20111028;

import android.content.Context;
import android.graphics.Canvas;
import android.view.KeyEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.util.Log;
import android.graphics.Paint;

class GameView extends SurfaceView implements SurfaceHolder.Callback,Runnable {
    boolean  bActive;
    boolean  bLeft;
    boolean  bRight;
    Thread     mThread = null;
    SurfaceHolder    mSurfaceHolder = null;
    Paint    mPaint = null;

    int    mInt = 0;
    //
    //    Thread を走らせるための run メソッド
    //
    @Override
    public void run(){
        Log.w(this.getClass().getName(), "Thread started");
        while(bActive){
            Canvas c = null;
            try {
                c = mSurfaceHolder.lockCanvas(null);
                if (c != null){
                    synchronized (mSurfaceHolder) {
                        doDraw(c);
                    }
                }
            } finally {
                //    サーフェイスをロックした後、何らかの理由で例外が発生したとき、
                //    サーフェイスがアンロックされない事態をさけるため、finally にて、
                //    アンロックする。
                if (c != null) {
                    mSurfaceHolder.unlockCanvasAndPost(c);
                }
            }
            Thread.yield();
        }
    }
    @Override
    public void draw(Canvas c){
        doDraw(c);
    }
    //
    //  画面の再描画
    //
    public void    doDraw(Canvas c){
        //  塗りつぶし
        mPaint.setARGB(255, 0, 0, 255);
        c.drawRect(0,0,c.getWidth(),c.getHeight(),mPaint);
        //  文字描画
        mPaint.setARGB(255, 255, 255, 255);
        c.drawText("Goodbye World! "+String.format("%08x", mInt), 10, 10, mPaint);
        ++mInt;
    }
    //
    //  キーが押された
    //
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent msg) {
        if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
            bLeft = true;
            return    true;
        }
        if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
            bRight = true;
            return    true;
        }
        return    false;
    }
    //
    //  キーが離された
    //
    @Override
    public boolean onKeyUp(int keyCode, KeyEvent msg) {
        if (keyCode == KeyEvent.KEYCODE_DPAD_LEFT){
            bLeft = false;
            return    true;
        }
        if (keyCode == KeyEvent.KEYCODE_DPAD_RIGHT){
            bRight = false;
            return    true;
        }
        return    false;
    }
    //
    //  コンストラクタ
    //
//    public GameView(Context context, AttributeSet attrs) {
//        super(context, attrs);
    public GameView(Context context) {
        super(context);
        mPaint = new Paint();
        // サーフェイスに対する変更を受け取るため、holder にコールバックを設定する
        SurfaceHolder holder = getHolder();
        holder.addCallback(this);
        mSurfaceHolder = holder;
        bActive = true;
        bLeft = false;
        bRight = false;

        mThread = new Thread(this);    //  ここでは開始しない
    }
    //
    //  ウィンドウがフォーカスを得た/失った
    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
    }    
    
    //  
    //  Surface の大きさが変わった際に呼び出される
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
    }

    //  サーフェイスの生成が完了した際コールバックされる
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //  コンストラクタで生成した Thread をここで開始
        bActive = true;
        mThread.start();
        setFocusable(true); // make sure we get key events
    }

    //
    //  Surface が破棄され、使用不能になると呼び出される
    //
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        //  操作不能にし、Thread を終了させる
        bActive = false;
    }
}




Game20111028.java の再編集

package jp.android.Game20111028;

import android.app.Activity;
import android.os.Bundle;

import jp.android.Game20111028.GameView;
import jp.android.Game20111028.R;

public class Game20111028Activity extends Activity {
    GameView	mView = null;

    /**
     * Activity が生成された際に呼び出される
     * 
     * @param savedInstanceState 前回実行時の状態が保存されている。もしくは null
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mView = new GameView(this);
        setContentView(mView);
    }

}