我正在开发一个带有MainActivity
的游戏,该游戏打开了游戏关卡的活动。每个关卡活动都继承一个BaseActivity
。
MainActivity
永远不会结束。所有关卡都在它上面打开。
我想在MainActivity
开始我的音乐,并在应用程序的其余部分保持播放。
问题是我希望Service
在应用程序进入后台时暂停音乐。
我创建了一个MusicService
,它通过MediaPlayer
播放音乐,就像这样 -
@Override
public void onCreate() {
super.onCreate();
player = MediaPlayer.create(this, R.raw.song);
player.setLooping(true);
player.setVolume(100,100);
player.start();
}
我对在哪里暂停音乐感到困惑。Service
是从MainActivity
开始的,但我希望即使应用程序在任何关卡活动中暂停,我也希望能够暂停它。我可以通过任何Activity
与Service
沟通吗?
我看了这个问题,但我不希望我的音乐停止,然后在每次我破坏和创建关卡活动时重新启动。
只需使用事件总线
格拉德尔依赖 -
implementation 'org.greenrobot:eventbus:3.1.1'
在您的主要活动中创建
EventBus.getDefault().register(this);
在你的主要活动中摧毁
EventBus.getDefault().unregister(this);
在您的主要活动中,编写方法如下。当您从任何活动发布事件时,此方法将始终调用
@Subscribe(threadMode = ThreadMode.MAIN)
public void onPauseEvent(event: PauseEvent) {
}
最后一步从任何活动或非活动类发布您的活动
EventBus.getDefault().post(new PauseEvent("delete"))
使用BroadcastReceiver
并在服务中注册它
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
registerReceiver(new Player(), new IntentFilter(App.Communication.Player));
return START_STICKY;
}
private class Player extends BroadcastReceiver {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
int action = extras.getInt(App.Communication.IntentAction);
if(action == App.Communication.ActionStart){
isPlaying = true;
String url = extras.getString(App.Communication.URL);
//Start player from url
}
else if(action == App.Communication.ActionPlay ){
urlPlayer.start();
}
else if(action == App.Communication.ActionPause ){
//Pause Player
}
else if(action == App.Communication.ActionStop ){
//Stop player
}
else if(action == App.Communication.ActionSeekForward ){
//Seek Forward
}
else if(action == App.Communication.ActionSeekBack ){
//Seek Back}
}
}
创建一个简单的 App 类来保存一些静态值
public class App {
public class Communication{
public static final String Player = "Player";
public static final int ActionStart = 0;
public static final int ActionPlay = 1;
public static final int ActionPause = 2;
public static final int ActionStop = 3;
public static final int ActionSeekForward = 4;
public static final int ActionSeekBack = 5;
public static final int ActionPlayRadio = 6;
}
}
最后,在任何Activity
简单的调用中BroadCast
.例如玩
Intent intent = new Intent(App.Communication.Player);
Bundle mBundle = new Bundle();
mBundle.putInt(App.Communication.IntentAction,App.Communication.ActionPause);
intent.putExtras(mBundle);
mContext.sendBroadcast(intent);