I am creating an application that requires a thread. When I test the life cycle I get a weird result. When I run the app from eclipse everything is called correctly - onCreate()
then onResume()
. When I press the home button on my phone onPause()
is called. However, when I relaunch it from my phone onResume()
is never called. Does this mean my thread is not created and started again? Here are my classes:
public class RenderView extends SurfaceView implements Runnable {
Thread thread = null;
SurfaceHolder holder;
boolean running = false;
Bitmap frameBuffer;
public RenderView(Context context, Bitmap frameBuffer) {
super(context);
holder = getHolder();
this.frameBuffer = frameBuffer;
}
@Override
public void run() {
while(running) {
if(!holder.getSurface().isValid()) {
continue;
}
Canvas canvas = holder.lockCanvas();
canvas.drawARGB(255, 150, 150, 10);
holder.unlockCanvasAndPost(canvas);
}
}
public void pause() {
running = false;
while(true) {
try {
thread.join();
} catch(InterruptedException e) {
e.printStackTrace();
}
}
}
public void resume() {
running = true;
thread = new Thread(this);
thread.start();
}
}
public class GameHandler extends Activity {
RenderView view;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d("Game Handler", "onCreate called");
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN);
boolean isLandscape = this.getResources().getConfiguration().orientation ==
Configuration.ORIENTATION_LANDSCAPE;
int frameBufferWidth = isLandscape ? 1280 : 800;
int frameBufferHeight = isLandscape ? 800: 1280;
Bitmap frameBuffer = Bitmap.createBitmap(frameBufferWidth, frameBufferHeight, Bitmap.Config.RGB_565);
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
float scaleX = (float) frameBufferWidth / metrics.widthPixels;
float scaleY = (float) frameBufferHeight / metrics.heightPixels;
view = new RenderView(this, frameBuffer);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
}
@Override
public void onResume() {
super.onResume();
Log.d("GameHandler ", "OnResume Called");
view.resume();
}
@Override
public void onPause() {
super.onPause();
Log.d("GameHandler ", "onPaused Called");
view.pause();
}
}