@Override
protected void onPause()
{
super.onPause();
if(mGameView != null)
mGameView.gameStop();
// 홈 화면으로 나갈 때 일시정지
musicPause();
}
@Override
protected void onResume()
{
super.onResume();
if(mGameView != null && !mIsRunnable && !mDialogState)
mGameView.gameStart();
// 홈 화면 갔다온 뒤 다시 진행
musicStart();
}
onPause() 코드와 onResume() 코드는 위와 같습니다.
홈화면을 갔다오면 앱이 그냥 아예 재실행이 되어버립니다.
근데 문제는, 모든 기기에서 이런 문제가 발생하는 게 아니라는 겁니다.
제대로 되는 기기가 있고, 그렇지 않은 기기가 있는데.
코드를 어떻게 수정해야 할지 도저히 감이 오질 않아서 이렇게 질문 올립니다.
gameStart() 함수와 gameStop() 함수는 다음과 같습니다.
public void gameStart() // 게임 스타트 함수
{
// 게임을 진행할 스레드
Thread thread = new Thread(new Runnable()
{
@Override
public void run()
{
try { Thread.sleep(1000); }
catch (InterruptedException e) { e.printStackTrace(); }
// 혹시 아직 준비가 되지 않은 객체가 있을 경우를 대비해 1초 정도 기다린다.
if(mMusic)
mBGM.start();
while(true)
{
long startTime = System.currentTimeMillis();
// 스레드 슬립 타임
synchronized(this)
{
if(!mIsRunnable)
break;
// mIsRunnable의 값이 false일 경우 이 while문을 빠져나간다. (스레드 종료)
if(!mReadyObjectCheck)
readyObject1(mScreenWidth, mScreenHeight);
mCanvas = lockCanvas();
if(mCanvas == null)
continue;
// mCanvas가 아직 null일 경우 컨티뉴
mCanvas.drawBitmap(mBackground, 0, 0, null);
// 배경화면 이미지를 담은 mBackground를 배경화면으로 지정
...
...
...
( 더 자세한 코드를 적고 싶었으나, 양이 적지 않은 데다가 아무리 생각해도
제 질문의 문제점에 영향을 줄만한 코드가 아니라고 생각되어서 제외했습니다.
양이 많아서 어디부터 어떻게 적어야 할지도 감이 안와서 ... 혹시 필요하다면
댓글로 바로 적겠습니다. )
unlockCanvasAndPost(mCanvas);
}
long endTime = mSleepTime - System.currentTimeMillis()+startTime;
// 스레드 슬립 타임
if(endTime > 0)
{
try { Thread.sleep(endTime); // endTime 쓰레드를 sleep시킨다. }
catch(InterruptedException e) {}
}
}
}
});
mIsRunnable = true;
thread.start();
mTask = new TimerTask()
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
mCountText(String.valueOf(mCountTimer);
}
});
if(mCountTimer != 0)
mCountTimer --;
// 카운트 타이머를 1초에 1씩 차감한다.
}
};
mTimer = new Timer();
mTimer.schedule(mTask, 1000, 1000);
}
public void gameStop() // 게임스탑 함수
{
mIsRunnable = false;
mTask.cancel();
mTimer.cancel();
}