Android-在所有活动中暂停/恢复音乐

时间:2018-08-08 09:25:59

标签: android service android-service android-mediaplayer

我正在开发一个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开始的,但是即使在任何“关卡”活动中暂停了应用程序,我也希望能够暂停它。我可以通过任何ServiceActivity通信吗?

我看着this question,但是我不希望我的音乐在每次销毁并创建关卡活动时都停止然后重新开始。

2 个答案:

答案 0 :(得分:1)

只需使用EventBus

等级依赖-

implementation 'org.greenrobot:eventbus:3.1.1'

在onCreate的主要活动中

EventBus.getDefault().register(this);

在onDestroy的主要活动中

EventBus.getDefault().unregister(this);

在您的主要活动中,编写方法如下。当您通过任何活动发布事件时,该方法将始终调用

@Subscribe(threadMode = ThreadMode.MAIN)
public void onPauseEvent(event: PauseEvent) {

}

最后一步,从任何活动或非活动类中发布您的事件

EventBus.getDefault().post(new PauseEvent("delete"))

答案 1 :(得分:0)

使用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);