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

홈 화면 갔다오면 앱이 재실행 되는 현상

0 추천
@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();

}
abchs8wyw (1,710 포인트) 님이 2018년 9월 27일 질문

1개의 답변

...