2012-09-03 2 views
2

내 응용 프로그램에서 배경 음악은 asynctask로 제어됩니다. 홈 버튼을 누르면 음악이 종료됩니다. 전원 버튼을 누르면 계속 재생됩니다. 나는 또한 내가 전원 버튼을 누른 다음 그것을 다시 시작하면 노래의 복사본을 동시에 시작 깨달았다.Asynctask 전원 단추를 눌렀을 때 음악이 멈추지 않습니다.

private single s; 
private BackgroundSound mBackgroundSound = new BackgroundSound(); 


protected void onPause(){ 
    super.onPause(); 
    Log.d("mSTATE","PAUSE"); 
    s.onPause(); 
    mBackgroundSound.cancel(true); 
} 

public void onBackPressed() { 
     super.onBackPressed(); 
     return; 
} 

protected void onDestroy(){ 
    super.onDestroy(); 
    Log.d("mState","DESTROY"); 
} 

public void onWindowFocusChanged(boolean change){ 
    super.onWindowFocusChanged(change); 

} 

@Override 
protected void onResume(){ 
    super.onResume(); 
    mBackgroundSound = new BackgroundSound(); 
    mBackgroundSound.execute(null); 
    Log.d("mSTATE","RESUME"); 
    s.onResume(); 

} 

@Override 
protected void onStop(){ 
    super.onStop(); 
    Log.d("mSTATE","STOP"); 
    s.freeMemory(); 
    mBackgroundSound.end(); 


} 

@Override 
protected void onRestart(){ 
    super.onRestart(); 
    Log.d("mSTATE","RESTART"); 
} 

@Override 
protected void onStart(){ 
    super.onStart(); 
    Log.d("mSTATE","STARTER"); 
} 


public class BackgroundSound extends AsyncTask<Void, Void, Void> { 
    private MediaPlayer player; 
    protected void onPreExecute() { 
     player = MediaPlayer.create(SingleActivity.this, R.raw.song); 
    } 
    @Override 
    protected Void doInBackground(Void... params) { 

     player.setLooping(true); 
     AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE); 
     int currentVolume = mAudioManager.getStreamVolume(AudioManager.STREAM_RING); 
     int maxRingerVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_RING); 
     double proportion = currentVolume/(double)maxRingerVolume; 
     int maxMusicVolume = mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC); 
     int volume = (int)(proportion * maxMusicVolume); 
     player.setVolume(volume,volume); 
     player.setLooping(true); 
     player.start(); 
     return null; 
    } 

    public void end(){ 
     player.stop(); 
     player.release(); 
    } 

} 

답변

2

AFAIK는 만 onpause가 호출되고 더 onstop가 호출되지 않으며, 단지 시스템 창 상단에왔다. 따라서 최종 통화가 호출되지 않습니다.

더 좋은 방법은 Asynctask.onCancelled을 무시하고 오히려 중지시에 비해 OnPause에 Asynctask.cancel 메소드를 호출하는 것입니다

0

asyncTask를 취소해야합니다. Activity의 onDestroy()에서 asyncTask.cancel (true)를 호출해야합니다.

1

그냥 추가하려면 onCancelled()를 재정의하고 doInBackground()에 체크인을 추가해야합니다. 참조 : 전원 버튼을 누를 때 다른 활동이 전경에 오지 않았기 때문에 Ideal way to cancel an executing AsyncTask

+0

어떤 코드 onCancelled noverriding 갔지 내가 추가해야합니까? 그것은 결국 모든 것이되어야 하는가? 정확히 doinbackgroudn()을 체크인하는 것은 무엇입니까? 당신의 도움을 주셔서 감사합니다 – MikeT

관련 문제