android - 按下电源按钮时 Asynctask 音乐不会停止

标签 android android-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();
    }

}

最佳答案

据我所知,当按下电源按钮时,仅调用onpause,而没有调用onstop,因为没有其他 Activity 到达前台,只有一个系统窗口出现在上面。因此,您的最终调用不会被调用。

更好的方法是重写 Asynctask.onCancelled 并在 OnPause 而不是 onstop 中调用 Asynctask.cancel 方法

关于android - 按下电源按钮时 Asynctask 音乐不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12241474/

相关文章:

java - 在匿名对象上调用父类(super class)方法 AsyncTask.execute() new HttpRequestTask<...> extends AsyncTask<...>

java - 获取 ImageView 可绘制 ID 并使用 AsyncTask 更改它

android - PayPal 集成和沙盒测试帐户 Android

android - 如何知道一个 Action 是全局完成的

android - 如何检测操作系统中上下文菜单的出现?

java - 如何更改 Android Dev 的 HelloFormStuff 中 RadioGroup 小部件的显示顺序?

java - Async doInBackground 会崩溃,并强制关闭

android - 如何在 searchView 和下拉列表之间添加空间(例如 height = 20dp)?

android - 如何在 Android 中正确终止 AsyncTack 线程?

android - API 调用在 Anko Async 中不起作用