将背景音乐音量从 activity 更改为服务

Change background music volume from activity to service

我是 android 的新手,正在从事一个项目,我必须在我们的应用程序中实现背景音乐。我已经使用服务实现了背景音乐,问题是:我不知道如何使用 activity.

中的搜索栏动态更改音乐的音量

我的服务是这样的:

package hu.szoftverprojekt.holdemfree.controller;

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;

import androidx.annotation.Nullable;

import hu.szoftverprojekt.holdemfree.R;

public class PlaySound extends Service {

    MediaPlayer player;

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        player=MediaPlayer.create(this, R.raw.ss);
        player.setLooping(true);
        player.start();
        player.setVolume(SettingsScreen.volume, SettingsScreen.volume);
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        player.stop();
    }
}

好吧,一旦您在更改 SeekBar 时调用了 SeekBarOnSeekBarChangeListener,下一件重要的事情就是将此从您的 activity 传达给您的为这一变化服务。

查看 android 文档 Creating a bound service,了解在 ActivityService 之间不使用第 3 方库进行通信的官方方式。

然而

您也可以使用像 EventBus 这样的第 3 方库(我推荐它,因为在我看来它更容易使用和实施)。

这里是一个使用 EventBus 的例子:

build.gradle:

dependencies {
    implementation 'org.greenrobot:eventbus:3.2.0'
}

MediaVolumeEvent.java:

public class MediaVolumeEvent {
    private int volume;

    public MediaVolumeEvent(int volume) {
        this.volume = volume;
    }

    public int getVolume() {
        return volume;
    }
}

PlaySound.java:

public class PlaySound extends Service {
  @Override
  public void onCreate() {
    super.onCreate();
    EventBus.getDefault().register(this);
  }

  @Override
  public void onDestroy() {
    EventBus.getDefault().unregister(this);
    player.stop();
    super.onDestroy();
  }

  @Subscribe(threadMode = ThreadMode.MAIN) 
  public void onEvent(MediaVolumeEvent event){
    player.setVolume(event.getVolume(), event.getVolume());
  }
}

在你的activity里面 OnSeekBarChangeListener:

SeekBar seekBar= (SeekBar) findViewById(R.id.seekBar);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {       

    @Override       
    public void onStopTrackingTouch(SeekBar seekBar) {      
        // TODO Auto-generated method stub      
    }       

    @Override       
    public void onStartTrackingTouch(SeekBar seekBar) {     
        // TODO Auto-generated method stub      
    }       

    @Override       
    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
        EventBus.getDefault().post(new MediaVolumeEvent(progress));
    }       
});