2012-09-03 49 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并调用Asynctask.cancel方法的onPause而非的onStop

0

您必须取消您的asyncTask。 你应该在Activity的onDestroy()中调用asyncTask.cancel(true)。

1

只需添加,您需要重写onCancelled()并在doInBackground()中添加检查。 请参阅:Ideal way to cancel an executing AsyncTask

+0

什么样的代码应该怎么加磨片noverriding onCancelled?它应该是最后的一切吗?()?在doinbackgroudn()中检查什么?谢谢你的帮助 – MikeT

相关问题