将背景音乐音量从 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
时调用了 SeekBar
和 OnSeekBarChangeListener
,下一件重要的事情就是将此从您的 activity 传达给您的为这一变化服务。
查看 android 文档 Creating a bound service,了解在 Activity
和 Service
之间不使用第 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));
}
});
我是 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
时调用了 SeekBar
和 OnSeekBarChangeListener
,下一件重要的事情就是将此从您的 activity 传达给您的为这一变化服务。
查看 android 文档 Creating a bound service,了解在 Activity
和 Service
之间不使用第 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));
}
});