2012-06-06 5 views
3

내 활동에 onPause가 있습니다. 그 이상한 점은 onPause가 두 번 호출되는 단일 활동 (videoPlayer)에서입니다.활동 onphaus 이상한 행동

시나리오 : 이것은 휴대 기기의 비디오 플레이어에서 발생하지만 태블릿에서는 발생하지 않습니다.

전원 단추를 눌러 대기 모드로 전환하면 onpause가 호출되고 onresume이 호출되면 일시 중지가 다시 호출됩니다. 전원 버튼을 다시 누르면 이력서가 정상적으로 호출됩니다.

아무도 이러한 문제를 겪지 않았습니까? 그렇다면 어떻게 해결 했습니까? onPause를 사용하는 것만으로도 계속 onRause를 켜고 onResume을 켜십시오. 사전에

감사합니다. 이 하나

protected void onPause() 
{ 

    Log.i("VideoPlayer", "onPauseCalled"); 
    super.onPause(); 
    pauseMedia(); 
    Log.i("onPause", " save states to be called"); 
    if(saveAllowed) 
     saveStates(); 
    Log.i("onPause", " save States called"); 
    view.setVisibility(View.GONE); 
    //Log.i("onPause", "visibility GOne"); 
    removeListeners(); 
    doCleanUp(); 


} 

    @Override 
protected void onResume() 
{ 
    super.onResume(); 
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    Log.i("VideoPlayer", "onResumeCalled"); 

    if(pm.isScreenOn()) 
    { 
     //Initialization 
     initializeViewControls(); 
     handler = new Handler(); 

     initializeButtons(); 
     initRecordButtons(); 
     initVolumeControl(); 

     //RestoreState 
     restoreMediaBoolean(); 
     restoreMediaState(); 
     Log.i("After", "restoreState"); 
     view = (SurfaceView) findViewById(R.id.surfaceView); 
     //Log.i("After", "GettingView"); 
     holder = view.getHolder(); 
     view.setVisibility(View.VISIBLE); 
     holder.addCallback(this); 
     holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     Log.i("onResume", "view is Visible"); 
     saveAllowed = true; 
    } 
    else 
     saveAllowed = false; 

} 

private void saveStates() 
{ 
    if(!isFinishing) 
    { 
     //Log.i("VideoPlayer", "Called at saveStates()"); 

     prefs = getSharedPreferences(PREF_SAVE, Context.MODE_PRIVATE); 
     if(prefs != null) 
     { 
      prefEditor = prefs.edit(); 
     } 

     if(prefEditor != null) 
     { 

      //Save overlay visibiltiy 
      if((volumeLayout != null) && (volumeLayout.getVisibility() == View.VISIBLE)) 
      { 
       prefEditor.putBoolean(IS_VOLUME_VISIBLE, true); 
       prefEditor.commit(); 
      } 
      else 
      { 
       prefEditor.putBoolean(IS_VOLUME_VISIBLE, false); 
       prefEditor.commit(); 
      } 

      //Save recorder Overlay state 
      if((recordLayout != null) && (recordLayout.getVisibility() == View.VISIBLE)) 
      { 
       prefEditor.putBoolean(IS_RECORDER_VISIBLE, true); 
       prefEditor.commit(); 
      } 
      else 
      { 
       prefEditor.putBoolean(IS_RECORDER_VISIBLE, false); 
       prefEditor.commit(); 
      } 
      //Save controller OVerlay State 
      if((backButton != null) && (backButton.getVisibility() == View.VISIBLE)) 
      { 

       prefEditor.putBoolean(IS_CONTROLLER_VISIBLE, true); 
       prefEditor.commit(); 
       Log.i("Save States", "Controller saved as visible"); 
      } 
      else 
      { 
       Log.i("Save States", "Controller saved as Invisible"); 
       //Log.i("Saving", "Controller Invisible"); 
       prefEditor.putBoolean(IS_CONTROLLER_VISIBLE, false); 
       prefEditor.commit(); 
      } 

      //Save is private Audio Recorded 
      prefEditor.putBoolean(IS_PRIVATE_AUDIO_RECORDED, isCustomVoiceRecorded); 
      prefEditor.commit(); 

      //Save are we playing out custom audio 
      prefEditor.putBoolean(PLAY_CUSTOM_AUDIO, playCustomAudio); 
      prefEditor.commit(); 

      //Make boolean is restoring 
      prefEditor.putBoolean(IS_RESTORING, true); 
      prefEditor.commit(); 

      //Saves Position of Current Video 
      if(vidplayer != null) 
      { 
       prefEditor.putInt(VIDEO_POSITION, videoPausedAt); 
       prefEditor.commit(); 
      } 

      //Save Position of Current Audio 
      if(audplayer != null) 
      { 
       prefEditor.putInt(AUDIO_POSITION, audioPausedAt); 
       prefEditor.commit(); 
      } 


      prefEditor = null; 
      prefs = null; 

     } 
    } 

어떤 일이 것은 내가 그것을 메뉴처럼 좀 알아 동안 일시 정지 레코더 레이아웃 같은 일부 레이아웃의 상태를 저장한다는 것입니다 두 번 나타납니다. 그런 다음 전원이 켜지면 다시 켜지지만 다시 켜면 레이아웃이 사라지고 비디오가 재생되고 있지 않습니다.

+1

것은 당신이 어떤을 게시하시기 바랍니다 수 암호? – HobieCat

+0

그 질문에 감사드립니다. 나는 이상한 문제가있어 해결책을 찾는데 올바른 아이디어를 가지고 있습니다. – tiguchi

답변

3

예, 비슷한 문제가있었습니다. 어떤 장치를 사용하고 있습니까 (메모리가 올바르게 작동하는 경우 NFC 화면 시간 초과 문제라고 생각합니까?) 일시 정지 나를 위해 문제가 아니었지만, 나는 (두 번 호출되는) onResume에서 비디오를 다시 시작하려고 그래서 onResume에서 다음을 사용 : 난 그냥 공유 할

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
if (pm.isScreenOn()) { 
    //now do stuff 
} 
+0

테스트를 위해 Nexus S와 Galaxy S를 사용하고 있습니다. onpause onresause onpause가 발생합니다. 그러나 나는 또한 그것이 발생하지 않는 Motorola Xoom에서 일하고있다. – Raigex

+1

당시 Nexus One, Nexus S 및 Xoom을 테스트 중이었습니다. 이 문제는 Nexus S에서만 발생 했으므로 NFC와 관련 있다고 생각했습니다. onPause 및 onResume에서 위의 코드를 사용하여 화면이 켜져 있는지 여부를 확인하면 로직을 제어하여 한 번만 실행되도록 허용해야합니다. – Damian

+0

전원 관리자를 추가해 주셔서 감사합니다. 내 넥서스 S의 매력처럼 작동했습니다. – Raigex

0

이 매우 늦게 대답은하지만 내 경험. 유사한 상황을 겪었 습니다만, 여기에서 주된 문제는 비디오 플레이어 (아마도 풍경으로 비디오를 재생하는 것)로 인한 오리 엔테이션 변경이거나 현재 귀하의 활동이 경관에있는 경우입니다. onPause(), onStop(), onCreate(), onStart(), onPause() 호출을 유발하는 오리엔테이션이 변경됩니다 (기본적으로 화면 잠금이 세로 방향으로 변경됨)) ...

해결책은 간단하다 : 수동으로 안드로이드 지정하여 방향 변경을 처리 : configChanges = "오리엔테이션 | 화면 크기"자바 클래스의 onConfigurationChanged()를 매니페스트에 활동 정의에 atribbute을하고 무시하는