마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

화면을 끄면 onStop()다음에 바로 onDestroy가 불러지는 것을 막을 수 없나요..??

0 추천

안녕하세요.

 

게임을 하던 중에 화면을 끄게되면 onStop()에서 멈출 줄 알았는데 바로 onDestroy()로 넘어가더라고요...

화면을 껐다가 켜도 계속할 수 있어야 하는데 

다시 화면을 키면 애러가 나면서 꺼지게 됩니다.

어떻게 해결해야 하나요..?? 감사합니다

public class StartGame extends Activity {

	ButtonEventC be;
	ProgressBarC pc;

	private static String String_key = "scotext";

	int time = 0;
	int score = 0;
	boolean start = false;

	ImageButton leftBtn[] = new ImageButton[3];
	ImageButton rightBtn[] = new ImageButton[3];
	TextView sco;
	ImageButton pause;

	Dialog dialog;

	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.start_game);

		Log.i("onCreat", "It's onCreat");
		init();
		getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
		
		sco = (TextView) findViewById(R.id.scoreText);
		if (savedInstanceState != null) {
			Bundle map = savedInstanceState.getBundle(String_key);
			if (map != null) {
				sco.setText(map.getString("String_text"));
				pc.progress.setProgress(map.getInt("Time"));
			}
		}
		
		new Thread(new Runnable() {
			@Override
			public void run() {
				try {
					handler.sendEmptyMessage(3);
					Thread.sleep(1000);
					dialog.cancel();
					handler.sendEmptyMessage(2);
					Thread.sleep(1000);
					dialog.cancel();
					handler.sendEmptyMessage(1);
					Thread.sleep(1000);
					dialog.cancel();
				} catch (InterruptedException e) {
					android.util.Log.e("ErrorTag", "", e);
				}
			}
		}).start();

		new Handler().postDelayed(new Runnable() {

			@Override
			public void run() {
				be.nextMission();
				pc.start();
			}
		}, 3000);

		
		
		pause = (ImageButton)findViewById(R.id.pauseb);
		pause.setOnClickListener(new OnClickListener() {
			
			@Override
			public void onClick(View v) {
				pc.isRun = false;
				pause.setImageResource(R.drawable.stopbp);

				final Dialog dialog = new Dialog(StartGame.this);
				dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
				dialog.getWindow().setBackgroundDrawable(
						new ColorDrawable(android.graphics.Color.TRANSPARENT));
				dialog.setContentView(R.layout.pause_dialog);
				dialog.setCanceledOnTouchOutside(false);
				dialog.setCancelable(false);
				ImageButton restart = (ImageButton) dialog.findViewById(R.id.restart);
				restart.setOnClickListener(new OnClickListener() {

					@Override
					public void onClick(View v) {

						pc.isRun = true;
						pause.setImageResource(R.drawable.pauseb);
						dialog.cancel();
						
					}
				});
				ImageButton stop = (ImageButton) dialog.findViewById(R.id.stopgame);
				stop.setOnClickListener(new OnClickListener() {

					@Override
					public void onClick(View v) {
						
						pc.is = false;
						dialog.cancel();
						finish();
					}
				});
				
				dialog.show();
				
			}
		});
		
	}

	@Override
	public void onSaveInstanceState(Bundle outState) {
		outState.putBundle(String_key, saveState());
	}

	public Bundle saveState() {
		Bundle map = new Bundle();
		map.putString("String_text", String.valueOf(sco.getText()));
		pc.isRun = false;
		map.putInt("Time", pc.getTime());
		return map;
	}

	protected Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			dialog = new Dialog(StartGame.this);
			dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
			dialog.getWindow().setBackgroundDrawable(
					new ColorDrawable(android.graphics.Color.TRANSPARENT));
			dialog.setContentView(R.layout.countdown);
			ImageView iv;
			iv = (ImageView) dialog.findViewById(R.id.countDownIv);
			iv.setImageResource(R.drawable.threee);
			dialog.setCanceledOnTouchOutside(false);
			dialog.setCancelable(false);
			super.handleMessage(msg);
			switch (msg.what) {
			case 3:
				iv = (ImageView) dialog.findViewById(R.id.countDownIv);
				iv.setImageResource(R.drawable.threee);
				dialog.show();
				break;
			case 2:
				iv = (ImageView) dialog.findViewById(R.id.countDownIv);
				iv.setImageResource(R.drawable.twoo);
				dialog.show();
				break;
			case 1:
				iv = (ImageView) dialog.findViewById(R.id.countDownIv);
				iv.setImageResource(R.drawable.onee);
				dialog.show();
				break;
			}
		}
	};

	private void init() {

		be = new ButtonEventC(this);
		pc = new ProgressBarC(this);

		leftBtn[0] = (ImageButton) findViewById(R.id.ImageButton1);
		leftBtn[1] = (ImageButton) findViewById(R.id.ImageButton2);
		leftBtn[2] = (ImageButton) findViewById(R.id.ImageButton3);
		rightBtn[0] = (ImageButton) findViewById(R.id.ImageButton4);
		rightBtn[1] = (ImageButton) findViewById(R.id.ImageButton5);
		rightBtn[2] = (ImageButton) findViewById(R.id.ImageButton6);
		sco = (TextView)findViewById(R.id.scoreText);
		Typeface myNewFace = Typeface.createFromAsset(getAssets(), "Station.ttf");
		sco.setTypeface(myNewFace);
		for (int i = 0; i < 3; i++) {
			leftBtn[i].setOnClickListener(be);
			rightBtn[i].setOnClickListener(be);
		}
		
	}

	public boolean onKeyDown(int keyCode, KeyEvent event) {
		switch (keyCode) {
		case KeyEvent.KEYCODE_BACK:
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

	@Override
	protected void onPause() {
		super.onPause();
		time = pc.getTime();
		pc.isRun = false;
		start = true;
		if (dialog != null) {
			if (dialog.isShowing()) {
				dialog.dismiss();
			}
		}		
		Log.i("onPause", "It's onPause");
	}

	@Override
	protected void onRestart() {
		super.onRestart();
		Log.i("onRestart", "It's onRestart");
		pc.isRun = true;
		be.score.setText(String.valueOf(score));		
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();		
		Log.i("onResume", "It's onResume");
		
		if(start){
		pc.isRun = false;
		pause.setImageResource(R.drawable.stopbp);

		final Dialog dialog = new Dialog(StartGame.this);
		dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
		dialog.getWindow().setBackgroundDrawable(
				new ColorDrawable(android.graphics.Color.TRANSPARENT));
		dialog.setContentView(R.layout.pause_dialog);
		dialog.setCanceledOnTouchOutside(false);
		dialog.setCancelable(false);
		ImageButton restart = (ImageButton) dialog.findViewById(R.id.restart);
		restart.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {

				pc.isRun = true;
				pause.setImageResource(R.drawable.pauseb);
				dialog.cancel();
				
			}
		});
		ImageButton stop = (ImageButton) dialog.findViewById(R.id.stopgame);
		stop.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				pc.is = false;
				dialog.cancel();
				finish();
			}
		});
		
		dialog.show();
		}
	}
	
	@Override
	protected void onStop() {
		super.onStop();

		Log.i("onStop", "It's onStop");
		
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.i("onDestroy", "It's onDestroy");
		
	}
	
}

 

으아아ㅏ아ㅏ (220 포인트) 님이 2014년 3월 14일 질문

2개의 답변

+1 추천
에러가 나지 않도록 예외 처리 하는데  하실 일 입니다.

android 에 life cycle 을 수정하실 수는 없죠.
aucd29 (218,390 포인트) 님이 2014년 3월 14일 답변
0 추천
onPause()에서 앱 상태를 저장해놓은 후 onResume()에서 복원하게 코드를 바꾸셔야 합니다.
익명사용자 님이 2014년 3월 14일 답변
...