【问题标题】:Change background music volume from activity to service将背景音乐音量从活动更改为服务
【发布时间】:2020-11-27 15:43:18
【问题描述】:

我是 android 新手,正在做一个项目,我必须在我们的应用程序中实现背景音乐。我已经使用服务实现了背景音乐,问题是:我不知道如何使用活动中的搜索栏动态更改音乐的音量。

我的服务如下所示:

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

【问题讨论】:

    标签: java android android-service background-music


    【解决方案1】:

    好吧,一旦您在更改 SeekBar 时调用了 SeekBarOnSeekBarChangeListener,接下来的主要事情就是将此更改从您的活动传达给您的服务。

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

    但是

    您还可以使用像 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));
        }       
    });
    

    【讨论】:

    • 请看我的更新,我忘了在服务类中的onEvent 方法上添加@Subscribe(threadMode = ThreadMode.MAIN) ,这是服务实际获取活动发送的消息所必需的
    • 非常感谢! :) 你帮了我很多!
    • 当然可以。如果是,请将此问题标记为已解决。谢谢
    猜你喜欢
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多